Категории

среда, 21 мая 2014 г.

Автоматическое создание директории /var/run/php5-fpm после перезагрузки

После установки php-fpm, иногда бывает удобно хранить все его сокеты в отдельной папке, например /var/run/php5-fpm, но если вручную создать такую папку, то после перезагрузки система ее удаляет, а в логе можно увидеть типа:
ERROR: unable to bind listening socket for address '/var/run/php5-fpm/default.sock': No such file or directory.
Это связано с тем, что /var/run монтируется с опцией --bind из /run [1], где файловая система tmpfs, логично, что после перезагрузки все, что создавал пользователь - удаляется! Но не проблема, значит перед запуском демона, нужно проверять, существует ли каталог, если нет, то создавать.
Для решения данной проблемы нужно отредактировать init-скрипт /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 я указал намеренно, т.к. у меня fpm пулы запускаются от разных uid:gid, если у вас все пулы работают от 1 пользователя, то можете указать -m 755.
Теперь, при запуске php-fpm демона, каталог с сокетами в /var/run будет создаваться автоматически.
UPDATE: 15.10.2014
Для тех кто пользуется upstart, приводим файл /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
Изменился блок pre-start, теперь там script, в котором собственно и стоит проверка каталога /var/run/php5-fpm, идея подсмотрена в /etc/init/mysql.conf. Для применения изменений в upstart скрипты, необходимо выполнить команды:
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
Обязательно stop (если был запущен демон php5-fpm), а затем start. Если демон php-fpm не был запущен, то restart скажет вам "initctl: Unknown instance:" и не запустит демона. Так что лучше сперва stop и затем start - это избавит от лишних раздумий, как устроена система upstart и почему restart не запускает демона.
Логи запуска через upstart можно подглядеть в dmesg, /var/log/upstart/php5-fpm.log. P.S. команды service php5-fpm start будут обработаны upstart, а init.d скрипты проигнорированы, так вот запутано все в Ubuntu.
Ссылки по теме:
1. Opennet.ru: В Fedora и других Linux-дистрибутивах появится директория /run
2. Создание директории /var/run/php5-fpm после перезагрузки

1 комментарий:

Илья Бормотов комментирует...

Не знаю прошло ли предыдущее сообщение, в общем спасибо, то что надо.

Отправить комментарий