PHP-FPM Не удалось подключиться к серверу FastCGI
Журнал ошибок:
[Sat Nov 22 05:24:41 2014] [error] [client xx] (2)No such file or directory: FastCGI: failed to connect to server "/usr/lib/cgi-bin/php5-fcgi": connect() failed
[Sat Nov 22 05:24:41 2014] [error] [client xx] FastCGI: incomplete headers (0 bytes) received from server "/usr/lib/cgi-bin/php5-fcgi"
Ну, этот файл /usr/lib/cgi-bin/php5-fcgi
действительно отсутствует, и на самом деле нет ничего в cgi-bin
папка. И когда я перезапускаю apache2, кажется, все работает нормально:
[Sat Nov 22 04:46:29 2014] [notice] FastCGI: process manager initialized (pid 10747)
[Sat Nov 22 04:46:29 2014] [notice] Apache/2.2.22 (Ubuntu) mod_fastcgi/mod_fastcgi-SNAP-0910052141 mod_ssl/2.2.22 OpenSSL/1.0.1 configured -- resuming normal operations
/etc/apache2/conf.d/php-fpm.conf
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi .php
Action php5-fcgi /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
</IfModule>
Так что мне теперь делать?
4 ответа
Короче
Могу поспорить, что вы не используете Unix Sockets в своей конфигурации php-fpm. Это потому, что по умолчанию php-fpm использует порты TCP.
Присмотритесь к вашей конфигурации
Вы решили использовать Unix Sockets:
FastCgiExternalServer / usr / lib / cgi-bin / php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Авторизация
Следовательно, вы должны убедиться, что php-fpm действительно работает на этих сокетах unix.
Случай 1: вы действительно используете Unix Sockets
$ sudo lsof -U | grep php
// will show you
php-fpm 17330 root 5u unix 0xf4f64800 0t0 7045381 socket
php-fpm 17330 root 7u unix 0xf545f080 0t0 7045382 socket
php-fpm 17330 root 8u unix 0xf55f3a80 0t0 7045383 /var/run/php5-fpm.sock
php-fpm 17331 nobody 0u unix 0xf55f3a80 0t0 7045383 /var/run/php5-fpm.sock
php-fpm 17331 nobody 0u unix 0xf55f3a80 0t0 7045383 /var/run/php5-fpm.sock
$sudo lsof -i | grep php
// should show nothing
Случай 2: вы используете не Unix-сокеты, а TCP-порты
$ sudo lsof -U | grep php
// will show you
php-fpm 17330 root 5u unix 0xf4f64800 0t0 7045381 socket
php-fpm 17330 root 7u unix 0xf545f080 0t0 7045382 socket
$sudo lsof -i | grep php
php-fpm 13387 root 7u IPv4 202656 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 13388 nobody 0u IPv4 202656 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 13389 nobody 0u IPv4 202656 0t0 TCP localhost:cslistener (LISTEN)
Вполне вероятно, что вы получите это сообщение об ошибке, потому что вы действительно не используете сокеты Unix с php-fpm. Причина в том, что php-fpm по умолчанию настроен на использование портов tcp.
Откройте php-fpm.conf и перейдите на сокеты unix:
sudo nano /etc/php5/fpm/pool.d/www.conf
# We don't want to use TCP ports
#listen = 127.0.0.1:9000
# We want to use Unix Sockets
listen = /var/run/php5-fpm.sock
Теперь вы столкнетесь с проблемами прав доступа в том же файле:
// modify user and group and use same user as apache (here 'nobody')
user = nobody
group = nobody
// Uncomment those lines and use same user as apache (here 'nobody')
listen.owner = nobody
listen.group = nobody
listen.mode = 0666
Конфигурация PHP-FPM теперь использует Unix Sockets, и Apache сможет подключиться к нему.
Возможно, ваш процесс fastcgi не авторизован для чтения вашего каталога / usr / lib / cgi-bin /, потому что пользователь, который запускает процесс fastcgi (вы), не принадлежит к той группе, в которой владелец вашего / usr / каталог lib / cgi-bin /.
Итак, убедитесь в этом:
$ stat /usr/lib/cgi-bin/
ответ:
бла бла... Uid: ( 33/www-данные) Gid: ( 33/www-данные)
Примечание: www-data является пользователем Apache
Если нет, сделайте это:
$ sudo chown -R www-data:www-data /usr/lib/cgi-bin
Теперь проверьте с помощью предыдущей команды stat, является ли пользователь www-данными. Затем вы должны добавить себя (пользователя процесса fastcgi) в группу пользователей www-data так:
$ sudo gpasswd -a ${USER} www-data
Теперь откройте /etc/php5/fpm/pool.d/www.conf в вашем любимом редакторе.
$ sudo nano /etc/php5/fpm/pool.d/www.conf
И раскомментируйте эти строки:
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
Важно: не включайте listen.mode в 666, это небезопасно
sudo service apache2 restart
sudo service php5-fpm restart
И шоу должно продолжаться:)
Похоже, вы запустили свой веб-сервер без запуска php5-fpm и прослушивания адреса сокета. Если вы хотите указать "/usr/lib/cgi-bin/php5-fcgi" в качестве адреса прослушивания (канал для fpm для обработки входящих подключений), вам необходимо убедиться, что он есть в вашей конфигурации fpm. "/etc/php5/fpm/pool.d/www.conf" является общим путем для этого.
Затем в вашей конфигурации apache убедитесь, что файлы.php используют fastcgi_pass для отправки запросов на fpm. Похоже, он уже настроен для этого, за исключением того, что он ожидает сокет Unix в неправильном месте.
Мне нужно было обеспечить ссылку Apache на FastCGI в/etc/apache2/conf-available/httpd.conf
:
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/apache2/php-fpm.sock -pass-header Authorization
соответствует прослушивающему процессу PHP FastCGI, настроенному в/etc/php5/fpm/pool.d/www.conf
:
listen = /var/run/apache2/php-fpm.sock
Как только я их сопоставил, я проверил, что FastCGI действительно работает на правильном сокете UNIX, как описано @Mick (как обычный префикс сsudo
если он не работает от имени пользователя root):
lsof -U | grep php
который показал, что это все еще неверно:
php5-fpm 19438 root 7u unix 0xffff880002242b40 0t0 79631 socket
php5-fpm 19438 root 8u unix 0xffff880002242780 0t0 79632 socket
php5-fpm 19438 root 9u unix 0xffff8800022423c0 0t0 79633 /var/run/php-fpm.sock
php5-fpm 19440 www-data 0u unix 0xffff8800022423c0 0t0 79633 /var/run/php-fpm.sock
php5-fpm 19441 www-data 0u unix 0xffff8800022423c0 0t0 79633 /var/run/php-fpm.sock
php5-fpm 19442 www-data 0u unix 0xffff8800022423c0 0t0 79633 /var/run/php-fpm.sock
php5-fpm 19443 www-data 0u unix 0xffff8800022423c0 0t0 79633 /var/run/php-fpm.sock
Поэтому для принятия изменений конфигурации потребовался перезапуск процесса FastCGI :
service php5-fpm restart