После установки 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.
Ссылки по теме:
Comments
comments powered by Disqus