Apache FCGI PHP-FPM Mac OS X 10.8 无法绑定

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,但日志位置已更改,按需进程管理器、pm.max_children = 1 以及其他所有内容均为默认设置。

我尝试过几十次重新启动 apache,并以不同的顺序终止所有 php-fpm 进程。

任何建议都会受到热烈鼓励、欢迎、赞赏、尝试和希望。

更新时间:2012 年 9 月 28 日

好吧,我用了教程并尝试使用套接字方法来查看是否是 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

不过,我确实找到了如何解决这个问题的方法,它就在我刚刚链接的教程中。启动代理 plist 配置需要指定 RunOnlyOnce。但不确定这对 TCP 是否安全。

不过我确实取得了一些进展,这可能会使这个问题过于具体。我使用 NetBeans 进行开发,当我尝试使用 xdebug 启动调试会话时,它可以很好地加载 - 很酷 - 但是只要代码需要在断点处暂停,我就会回到原点。comm with server ... aborted: idle timeout

为了满足所有条件,我将 httpd.conf 中的 -idle-timeout 设置为 300。但没用。如果我关闭 Netbeans 并且不尝试(永远)启动调试会话,服务器不会死机,它会按预期运行。

我即将尝试重新启动我的 MacBook,但老实说这不是一个有效的解决方案。

答案1

因此,我认为我最好对此作出回复,因为没有其他人这样做。

我不知道如何阻止 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>

答案2

只需在您的项目中执行 l s-lA 并找出您的用户和组。然后编辑php-fpm.confphp-fpm5.6 和www.confphp7.* 版本

在我的例子中,我的用户 = vallabh,组 = staff

并更新 listen = 127.0.0.1:9071 和 listen = 127.0.0.1:9056

它非常方便并且易于记住端口。

祝您编码愉快。

使用下面的 shell 代码来验证您是否正在绑定端口。

lsof -Pni4 | grep LISTEN | grep php

相关内容