После установки 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ý <ondrej@debian.org>"

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 после перезагрузки

Comments

comments powered by Disqus