web-dev-qa-db-ja.com

Apache FCGI PHP-FPM Mac OS X10.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日

さて、私は this チュートリアルを使用し、ソケットアプローチを試して、それが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を使用してデバッグセッションを起動しようとすると、正常に読み込まれます。ブレークポイント、私は正方形1に戻っています。comm with server ... aborted: idle timeout

すべてのベースをカバーするために、httpd.confの-idle-timeoutを300に設定しました。サイコロはありません。 Netbeansをシャットダウンし、デバッグセッションを開始しようとしない場合、サーバーは停止せず、意図したとおりに動作します。

MacBookを再起動しようとしていますが、正直なところ、それは有効な解決策ではありません。

2
shousper

だから、私は他の誰も持っていないので、これについてコメントしたほうがいいと思いました。

TCP経由でリッスンしているときに、PHP-FPMがバインディングエラーを何度もログに記録しないようにする方法がわかりません。

UNIXソケットリスニングに切り替え、起動時にPHP-FPMを1回だけ実行するように起動エージェントを構成することで、問題を解決しました。

私にできる最善のこと。多分これは誰か、idkを助けるでしょう。

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
shousper

プロジェクトでls-lAを実行し、自分がどのユーザーでグループ化されているかを確認します。 php-fpm5.6の場合はphp-fpm.confを、php7。*バージョンの場合はwww.confを編集します。

私の場合、ユーザー= vallabhおよびグループ=スタッフ

そしてlisten = 127.0.0.1:9071とlisten = 127.0.0.1:9056を更新します

ポートを覚えるのはとても便利で簡単です。

幸せなコーディング。

以下のシェルコードを使用して、ポートをバインドしていることを確認します。

lsof -Pni4 | grep LISTEN | grep php

0
vrkansagara