Назад | Перейти на главную страницу

Apache FCGI PHP-FPM Mac OS X 10.8 не может привязать

Итак, я нашел несколько Другой темы по этой проблеме, но их решения не работают для меня.

По сути, это моя машина для разработки, и вот уже несколько недель все работает нормально, но внезапно у меня возникает много проблем с этими ошибками:

[Thu Sep 27 16:28:43 2012] [error] [client 127.0.0.1] FastCGI: comm with server "/Library/WebServer/Documents/php5.external" aborted: idle timeout (60 sec)
[Thu Sep 27 16:28:43 2012] [error] [client 127.0.0.1] FastCGI: incomplete headers (0 bytes) received from server "/Library/WebServer/Documents/php5.external"

Я не менял ничего, связанного с конфигурацией сервера. Очевидно, что-то изменилось, или мне просто не повезло ...

Настройка выглядит следующим образом:

Apache/2.2.22 (Unix) DAV/2 mod_fastcgi/2.4.6 mod_ssl/2.2.22 OpenSSL/0.9.8r

$ php-fpm -v
PHP 5.3.15 (fpm-fcgi) (built: Aug 19 2012 09:06:12)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans

$ sudo lsof -i TCP:9000
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
php-fpm 97167 _www    6u  IPv4 0xd65451f140772337      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 97174 _www    0u  IPv4 0xd65451f140772337      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 97174 _www    3u  IPv4 0xd65451f14739c337      0t0  TCP localhost:cslistener->localhost:54750 (CLOSE_WAIT)

$ tail -16 /etc/apache2/httpd.conf
<IfModule mod_fastcgi.c>
    FastCGIExternalServer /Library/WebServer/Documents/php5.external -flush -host 127.0.0.1:9000 -idle-timeout 60
    AddHandler php5-fcgi .php
    Action php5-fcgi /usr/lib/cgi-bin/php5.external
    Alias /usr/lib/cgi-bin/ /Library/WebServer/Documents/

    <Directory /usr/local/sbin>
        Options ExecCGI FollowSymLinks
        SetHandler fastcgi-script
        Order allow,deny
        Allow from all
        AllowOverride All
    </Directory>
</IfModule>

Это в основном php-fpm.conf по умолчанию с измененным местоположением журнала, диспетчером процессов ondemand, pm.max_children = 1 и всем остальным по умолчанию.

Я пытался перезапустить apache десятки раз и убить все процессы php-fpm в разном порядке.

Любые предложения будут горячо поощряться, приветствоваться, оцениваться, проверяться и надеяться.

ОБНОВЛЕНИЕ 28/09/2012

Хорошо, я использовал этот учебное пособие и попробовали подход с использованием сокетов, чтобы увидеть, было ли это конфликтом TCP-порта - оказалось, что нет. Использование сокетов также не помогает выводить каждые 10 секунд сообщения об ошибках, подобные этим:

Для TCP:

[28-Sep-2012 08:44:58] ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (48)
[28-Sep-2012 08:44:58] ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (48)
[28-Sep-2012 08:44:58] ERROR: FPM initialization failed
[28-Sep-2012 08:44:58] ERROR: FPM initialization failed

Для розеток:

[28-Sep-2012 08:48:32] ERROR: An another FPM instance seems to already listen on /tmp/php5-fpm.sock
[28-Sep-2012 08:48:32] ERROR: An another FPM instance seems to already listen on /tmp/php5-fpm.sock
[28-Sep-2012 08:48:32] ERROR: FPM initialization failed
[28-Sep-2012 08:48:32] ERROR: FPM initialization failed

Я все же выяснил, как решить эту проблему, и это в учебнике, который я только что связал. В конфигурации списка агентов запуска необходимо указать RunOnlyOnce. Не уверен, что это безопасно для TCP.

Однако у меня есть некоторый прогресс, который может сделать этот вопрос слишком конкретным ... Я использую NetBeans для разработки, и когда я попытался запустить сеанс отладки с помощью xdebug, он загрузился нормально - круто, но как только код нужно приостановить точка останова, я снова в квадрате 1. comm with server ... aborted: idle timeout

Чтобы охватить все свои базы, я установил -idle-timeout в httpd.conf равным 300. Никаких кубиков. Если я выключу Netbeans и не попытаюсь (никогда) запустить сеанс отладки, сервер не умрет, он будет вести себя так, как задумано.

Я собираюсь попробовать перезагрузить свой MacBook, но, честно говоря, это не подходящее решение ..

Итак, я подумал, что лучше прокомментировать это, видя, как никто другой.

Я понятия не имею, как остановить PHP-FPM от многократной регистрации ошибок привязки при прослушивании через TCP.

Я решил свою проблему, переключившись на прослушивание сокетов unix и настроив агент запуска для запуска PHP-FPM только один раз при запуске.

Лучшее, что я мог сделать. Может, это кому-то поможет, идк.

В php-fpm.conf

listen = /tmp/php5-fpm.sock

В httpd.conf

<IfModule mod_fastcgi.c>
    AddHandler php5-fcgi .php
    Action php5-fcgi /php5-fcgi
    Alias /php5-fcgi /Library/WebServer/CGI-Executables/php-fcgi
    FastCGIExternalServer /Library/WebServer/CGI-Executables/php-fcgi -socket /tmp/php5-fpm.sock -pass-header Authorization -idle-timeout 300

    <Directory /usr/local/sbin>
        Options ExecCGI FollowSymLinks
        SetHandler fastcgi-script
        Order allow,deny
        Allow from all
        AllowOverride All
    </Directory>
</IfModule>

В /Library/LaunchAgents/homebrew-php.josegonzalez.php53.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>homebrew-php.josegonzalez.php53</string>
    <key>LaunchOnlyOnce</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/local/Cellar/php53/5.3.15/sbin/php-fpm</string>
      <string>--fpm-config</string>
      <string>/usr/local/etc/php/5.3/php-fpm.conf</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Username</key>
    <string>www</string>
    <key>WorkingDirectory</key>
    <string>/usr/local/var</string>
    <key>StandardErrorPath</key>
    <string>/usr/local/Cellar/php53/5.3.15/var/log/php-fpm.log</string>
  </dict>
</plist>

просто сделайте l s-lA в своем проекте и узнайте, какой вы пользователь и группа. и отредактируйте php-fpm.conf для php-fpm5.6 и www.conf для версии php7. *

В моем случае мои user = vallabh и group = staff

и обновите listen = 127.0.0.1:9071 и listen = 127.0.0.1:9056

это довольно удобно и легко запомнить порт.

счастливого кодирования.

используйте приведенный ниже код оболочки, чтобы убедиться, что вы привязываете порт.

lsof -Pni4 | grep LISTEN | grep php