Категории

среда, 8 апреля 2015 г.

Ubuntu 14.04 LTS php5-fpm reload logrotate

При установке php-fpm под Ubuntu 14.04 обнаружились проблемы с логами, не работала ротация, а так же не работал reload демона, демон завершал master процесс, при этом оставляя свои дочерние процессы, в следствие чего дальнейшая работа с php-fpm становилась невозможной, без ручной остановки каждого процесса php-fpm и последующим запуском, в общем надоело это безобразие, решил навести порядок.

Создаем папку для логов:
mkdir /var/log/php5-fpm
chmod 777 /var/log/php5-fpm
chmod 777 сделан намерено, потому, что у меня php-fpm пулы запускаются от разных пользователей и от разных групп.

Затем переложим лог ошибок php-fpm в созданную только что папку с логами, для этого в файле: /etc/php5/fpm/php-fpm.conf:
error_log = /var/log/php5-fpm/error.log
Теперь займемся правильной ротацией логов, файл /etc/logrotate.d/php5-fpm к такому виду:
/var/log/php5-fpm/*.log {
        rotate 5
#       weekly  # Не стоит терять логи, обнуляя файл раз в неделю!
        size 1k
        missingok
        notifempty
        compress
        delaycompress
        postrotate
                # http://stackoverflow.com/questions/19998526/ubuntu-php5-fpm-throws-unknown-instance-on-reload
                # The original reload command did never work
                #invoke-rc.d php5-fpm reopen-logs > /dev/null

                # Workaround for cases when the reload command fails for some reason
                service php5-fpm reload > /dev/null 2>&1
                [ $? = 0 ] || ( service php5-fpm stop; killall php5-fpm; service php5-fpm start ) > /dev/null
        endscript
}
Так же рекомендую привести в порядок логи каждого пула например для пула www в файле /etc/php5/fpm/pool.d/www.conf:
access.log = /var/log/php5-fpm/$pool-access.log
slowlog = /var/log/php5-fpm/$pool-slow.log
php_admin_value[error_log] = /var/log/php5-fpm/$pool-error.log
php_admin_flag[log_errors] = on
Обратите внимание в имени файла используется переменная $pool, которая позволяет избавиться от рутины, прописывания имени пула в каждой строчке в каждом пуле.

Теперь решим проблему с reload и с удобным хранением php-fpm пулов приводим файл /etc/init/php5-fpm.conf к такому виду:
# php5-fpm - The PHP FastCGI Process Manager

description "The PHP FastCGI Process Manager"
author "Ondřej Surý "

start on runlevel [2345]
stop on runlevel [016]

# Precise upstart does not support reload signal, and thus rejects the
# job. We'd rather start the daemon, instead of forcing users to
# reboot https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1272788
#
reload signal USR2

pre-start script
        [ -d /var/run/php5-fpm ] || install -m 777 -o www-data -g root -d /var/run/php5-fpm
        /usr/lib/php5/php5-fpm-checkconf
end script

respawn
exec /usr/sbin/php5-fpm --nodaemonize --fpm-config /etc/php5/fpm/php-fpm.conf
Для применения изменений в upstart, необходимо выполнить команды, подробнее [ 2 ]:
root@Ubuntu# initctl reload-configuration
root@Ubuntu# initctl stop php5-fpm
initctl: Unknown instance: 
root@Ubuntu# initctl start php5-fpm
php5-fpm start/running, process 18467
В файле /etc/init.d/php5-fpm, добавим вверху, после переменной SCRIPTNAME строчку:
SOCKETDIR=/var/run/$NAME
А затем, внутри функции "do_start() {" добавим еще одну строчку:
[ -d $SOCKETDIR ] || install -m 777 -o www-data -g root -d $SOCKETDIR
-m 777 я указал намеренно, как я уже упоминал ранее, у меня php-fpm пулы запускаются от разных uid:gid

Итак после всего этого:
  • Сокеты пулов лежат в ожидаемом месте: /var/run/php5-fpm/
  • Логи пулов, и лог ошибок демона php-fpm в: /var/log/php5-fpm/
  • Логи не обнуляются раз в неделю, а ротация логов производится при достижении размера файла в 1Кб и главное она работает!
  • Команда service php5-fpm reload теперь ничего не ломает и работает корректно.

1. Ubuntu php5-fpm throws unknown instance on reload
2. Автоматическое создание директории /var/run/php5-fpm после перезагрузки