Настройка связки apache+php+mysql

logoРано или поздно изучая unix вы столкнетесь с сервером apache. Обычно он уже стоит в системе, если вы только при инсталляции ОС не выбрали минимальную установку. Скорей всего с apache у вас также будет стоять и php c mysql. Если это так, то данная статья вряд ли поможет разобраться с проблемой что там у вас не работает 🙂

Я всегда предпочитаю ставить эту связку сам и по возможности пересобираю все пакеты под свою систему. Т.к. у меня сайт про общий unix, то в данной статье я расскажу метод установки из исходников, который будет работать в любой unix like системе. Вам только останется разобраться куда прописать в стартовые скрипты запуск  mysql и apache.
Итак поехали..

Установка mysql

Первым делом качаем исходные тексты с официального сайта mysql.com или с русскоязычного mysql.ru. На сегодняшний момент пока рекомендуют версию 5.0.xx. Компилируем со следующими параметрами


#./configure --prefix=/usr/local/mysql --with-mysqld-user=mysql

затем


#make
#make install

Создаем пользователя и группу mysql, используя команду adduser.
Переходим в каталог /usr/local/mysql и выставляем права на запись пользователю mysql на директорию баз ./var. Также для директории баз выставим маску 700, чтобы никто кроме данного пользователя (ну и root) не смог попасть в эту директорию.


#cd /usr/local/mysql
#chown -R mysql:mysql ./var
#chmod 700 ./var

Устанавливаем тестовую базу mysql. Для этого запускаем от пользователя root бинарник


#/usr/local/mysql/bin/mysql_install_db

Внутри директории баз должен появиться каталог тестовой базы mysql. Также внимательно посмотрите на вывод команды mysql_install_db, там будет сказано как запускать mysql и как выставить админский пароль. В принципе все, можно пробовать запускать mysql.
Проверить запущена или нет


#ps aux | grep mysql

Должна показать, что процессы mysql запущены. Теперь можно пробовать соединиться, но перед этим обязательно задайте пароль root для баз mysql. Выход из mysql – \q.


#/usr/local/mysql/bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 61
Server version: 5.0.91-log Source distribution
mysql> \q
Bye

Важные моменты если что-то не работает.
Смотреть лог mysql – /usr/local/mysql/var/имя_хоста.err
Посмотреть права на каталог /var/run/mysql, этот каталог должен принадлежать пользователю mysql. Внутри каталога есть файл mysql.sock,  файл должен принадлежать пользователю и группе mysql:mysql и иметь маску файла 777. Я бы еще рекомендовал сделать симлинк на этот файл из каталога /tmp


#cd /tmp
#ln -s /var/run/mysql/mysql.sock mysql.sock

Возможно сервер будет ругаться на отсутсвие файла my.cnf. Для примера можете взять мой и положить в корень каталога /usr/local/mysql. Права файла поставьте mysql:mysql 660. Это файл общих и тонких настроек сервера mysql.
Т.к. мы создали собственный каталог для mysql, то пропишите пути до бинарных файлов mysql (/usr/local/mysql/bin) в переменную PATH, чтобы не набирать полностью /usr/local/mysql/bin/команда. Обычно переменная PATH уже прописана в файле /etc/profile или можно задавать ее для каждого пользователя системы в файле /home/user/.bash_profile.
Также сделайте символические ссылки, это надо в дальнейшем, чтобы конфигуратор php нашел наш mysql сервер.


ln -s /usr/local/mysql/include/mysql /usr/include/mysql
ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql

Установка apache

Скачиваем последнюю версию apache2. Я предпочитаю стабильную ветку 2.2.xx. Конфигурируем и устанваливаем


#./configure --enable-so --enable-cgi --enable-rewrite --prefix=/usr/local/apache2
#make
#make install

Дополнительные параметры вы всегда можете посмотреть и выбрать из ./configure –help.
Чтобы упростить себе жизнь скачиваем этот файл конфигурации http.conf и кладем его в каталог /usr/local/apache2/conf, предварительно сохранив оригинальный файл под другим названием.
По желанию изменяем в httpd.conf ваш email, вашу дефолтную кодировку сервера ну и другие параметры. Пока не надо раскомментировать загрузку модуля php.
Перед первым запуском обязательно меняем владельца каталога /usr/local/apache2/logs на пользователя от которого будут стартовать процессы apache сервера. В нашем случае пользователь apache (имейте ввиду, что данный пользователь должен уже быть создан в системе).


#chown -R apache:apache /usr/local/apache2/logs

Старт apache


#/usr/local/apache2/bin/apachectl start
#/usr/local/apache2/bin/apachectl stop - остановить сервер

В логах должна появиться запись, что apache стартовал. Пробуем открыть в браузере, http://ip_host_apache.

Установка php

На самом деле, нам весь php ставить совсем не надо, мы только установим модуль php для apache. Т.е. у нас в конечном итоге не будет в системе полностью установленного php.
Скачиваем последний php 5 версии. Конфигурируем со множественными опциями, чтобы на нашем apache работали всевозможные графические модули и библиотеки используемые в php. Обратите внимание, что в конфигураторе мы указываем уже на пути по которым у нас установлен apache и mysql.sock файл.


./configure --with-apxs2=/usr/local/apache2/bin/apxs \
            --with-readline  \
            --with-mysql=/usr/local/mysql \
            --with-mysql-sock=/var/run/mysql/mysql.sock \
            --disable-ipv6 \
            --with-gettext=/usr/bin \
            --with-gd \
            --with-jpeg-dir=/usr/local/bin/ \
            --with-zlib-dir=/usr/lib/ \
            --with-openssl \
            --with-db4

Возможно, что конфигуратор не сможет найти часть пакетов или библиотек, которые понадобятся при компиляции. Будет возникать ошибка на не найденном пакете. Просто устанавливаете необходимый пакет и запускаете конфигуратор по новой. Если все прошло без ошибок, можно выполнить команду makе.
После успешной компиляции make install делать не надо (конечно, если вы не хотите полностью установить php в систему), достаточно скопировать один модуль php libphp5.so из каталога ./libs исходников php. Модуль копируется в каталог /usr/local/apache2/modules. Перед копированием я рекомендую сделать обрезание данного модуля командой strip – это существенно уменьшит размер модуля.


#cd /путь_до_libphp5.so
#strip ./libphp5.so

После копирования можно раскомментировать строку в файле apache.conf


LoadModule php5_module        modules/libphp5.so

Можно перезапускать/запускать apache. Ниже команда перезапуска сервера.


#/usr/local/apache2/bin/apachectl restart

Проверить как работает php модуль очень просто. Создайте файл test.php в корне вашего сайта /usr/local/apache2/htdocs с таким содержимым


<?php phpinfo() ?>

Теперь в браузере наберите http://ip_host_apache/test.php должна открыться страничка с данными о сборке php

Данные компиляции php

Если вы это не видите, значит что-то не так и скорей всего не так в файле http.conf. Попробуйте первым делом почитать логи apache.
За дополнительными настройками сервера apache советую прочитать статью Полезности при конфигурировании apache сервера.

Теперь осталось только прописать старт mysql и apache в стартовые скрипты вашей ОС.

Запись опубликована в рубрике Http, Сервера с метками , , , , , . Добавьте в закладки постоянную ссылку.

10 комментариев Настройка связки apache+php+mysql

  1. Sergey говорит:

    mik
    после того как задаю пароль пользователю выдает ошибку из за чего такое может происходить?
    ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

    • mik говорит:

      проверьте есть ли файл /tmp/mysql.sock. По умолчанию его может и не быть. Если его нет прочтите раздел насчет ошибок mysql 🙂 там сказано что делать.

  2. Sergey говорит:

    вроде нет такого файла, пробовал сам создавать но он удалился а поповоду ошибок mysql это нужно в INSTALL-SOURCE читать?

    • mik говорит:

      не понял как это он удалился? создайте файл убедитесь что он есть и запускайте команду которую хотели.
      Я имел ввиду раздел моей статьи “Важные моменты если что-то не работает” в подразделе про mysql. Команда
      ps aux | grep mysql что возвращает?

  3. Sergey говорит:

    mysql.sock создаю но все равно та же ошибка.

    grep вот что возвращает
    Sergey 22126 0.0 0.0 7568 872 pts/0 S+ 01:01 0:00 grep mysql

    вот сам лог
    110927 01:04:41 mysqld started
    nohup: ввод игнорируется
    110927 1:04:41 [Warning] No argument was provided to –log-bin, and –log-bin-index was not used; so replication may break when this MySQL server acts as a master and has his hostname changed!! Please use ‘–log-bin=sergey-bin’ to avoid this problem.
    InnoDB: The log sequence number in ibdata files does not match
    InnoDB: the log sequence number in the ib_logfiles!
    110927 1:04:41 InnoDB: Database was not shut down normally!
    InnoDB: Starting crash recovery.
    InnoDB: Reading tablespace information from the .ibd files…
    InnoDB: Restoring possible half-written data pages from the doublewrite
    InnoDB: buffer…
    110927 1:04:41 InnoDB: Started; log sequence number 0 43655
    110927 1:04:41 [Note] /usr/local/mysql/libexec/mysqld: ready for connections.
    Version: ‘5.0.92-log’ socket: ‘/var/run/mysql/mysql.sock’ port: 3306 Source distribution
    root@sergey:/usr/local/mysql/var#

    • mik говорит:

      судя по grep у вас просто не стартует демон mysqld, поэтому дальше ничего и не получается..
      В логах советуют запускать с ключами “–log-bin=sergey-bin”
      А вы точно сделали тестовую базу? (команда mysql_install_db)
      Кстати почитайте лог в каталоге баз (по моим путям это /usr/local/mysql/var/имя_хоста.err) Может там будет более понятно почему не запускается корректно демон.
      Хотя вроде в конце у вас пишет что “mysqld: ready for connections”, а через grep его нет. Непонятно…

  4. Sergey говорит:

    вот лог из /usr/local/mysql/var
    110927 01:04:41 mysqld started
    nohup: ввод игнорируется
    110927 1:04:41 [Warning] No argument was provided to –log-bin, and –log-bin-index was not used; so replication may break when this MySQL server acts as a master and has his hostname changed!! Please use ‘–log-bin=sergey-bin’ to avoid this problem.
    InnoDB: The log sequence number in ibdata files does not match
    InnoDB: the log sequence number in the ib_logfiles!
    110927 1:04:41 InnoDB: Database was not shut down normally!
    InnoDB: Starting crash recovery.
    InnoDB: Reading tablespace information from the .ibd files…
    InnoDB: Restoring possible half-written data pages from the doublewrite
    InnoDB: buffer…
    110927 1:04:41 InnoDB: Started; log sequence number 0 43655
    110927 1:04:41 [Note] /usr/local/mysql/libexec/mysqld: ready for connections.
    Version: ‘5.0.92-log’ socket: ‘/var/run/mysql/mysql.sock’ port: 3306 Source distribution

    запустил еще раз
    Installing MySQL system tables…
    OK
    Filling help tables…
    OK
    вроде все прошло успешно

    пробовал запускать
    ./mysql.server start выдает
    Starting MySQL
    ..Manager of pid-file quit without updating file. … failed!

    • mik говорит:

      Давайте так. Очистите файл ошибок в /usr/local/mysql/var.
      Попробуем запустить не скриптом, а через бинарник с опциями.
      Проанализировав ваши пути я думаю вам подойдет такая строка запуска:
      Предварительно проверьте чтобы был удален mysql.pid файл. Скорее всего он находится в папке /var/run/mysql/ .

      /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/var --pid-file=/var/run/mysql/mysql.pid --skip-networking --log-bin=sergey-bin

      Ну и теперь что в логе ошибок появилось?

  5. Sergey говорит:

    1.пробовал через терминал вашу строкувыполнить вот что выдает
    nohup: ввод игнорируется, поток ошибок перенаправляются на стандартный вывод
    Starting mysqld daemon with databases from /usr/local/mysql/var

    2.по пути /var/run/mysql mysql.pid отсутствует также попробовал locate путей не выдал похоже его просто нет

    3.вроде все тоже самое лог из usr/local/mysql/var
    110928 23:46:50 mysqld started
    nohup: ввод игнорируется
    InnoDB: The log sequence number in ibdata files does not match
    InnoDB: the log sequence number in the ib_logfiles!
    110928 23:46:50 InnoDB: Database was not shut down normally!
    InnoDB: Starting crash recovery.
    InnoDB: Reading tablespace information from the .ibd files…
    InnoDB: Restoring possible half-written data pages from the doublewrite
    InnoDB: buffer…
    110928 23:46:50 InnoDB: Started; log sequence number 0 43655
    110928 23:46:51 [Note] Recovering after a crash using dorban-bin
    110928 23:46:51 [Note] Starting crash recovery…
    110928 23:46:51 [Note] Crash recovery finished.
    110928 23:46:51 [Note] /usr/local/mysql/libexec/mysqld: ready for connections.
    Version: ‘5.0.92-log’ socket: ‘/var/run/mysql/mysql.sock’ port: 0 Source distribution

  6. mik говорит:

    По 1 пункту. После ввода строки терминал должен как бы зависнуть и не возвращать строку ввода. Можно понажимать ввод чтобы убедиться что строка ввода команд не появляется. Такое происходит?
    Если да, то значит mysql запустился и результаты ошибок или сообщений будут вываливаться на эту консоль. В этом случае открываем другую консоль и проверяем командой grep что сервер запущен.
    Также можно проверить наличие pid файла запуска и файла сокета mysql.sock.
    Остановить сервер можно запустить скрипт с параметром stop

    По 2 пункту. Значит сервер не запущен.
    А по последнему – сервер сначала говорит что был некорректно завершен, (что мы уже видели в прошлых логах), а потом якобы запускается.. Заметьте, что уже нет в логе строки насчет “–log-bin=sergey-bin”, т.к. мы с ней запускали.
    Я только могу предположить что сервер запускается, а потом через какое то время “падает”.. А вот почему это происходит я не вижу по логам. Может через некоторое время еще раз в лог заглянуть мало ли что добавится туда?
    Еще можно глянуть общесистемные логи типа /var/log/messages, /var/log/system

    А какая система? ставили из пакета или по моей статье собирали сами?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *