Spawn fcgiを使用してphp5-cgiを生成すると、nginxで502 Bad Gatewayを取得します。
これを使用して、rc.localの次の行を使用して、サーバー起動時にインスタンスをスパンします。
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid
おそらく、spawn-fcgi/php5-cgiが死に、PHPを解析するためにリッスンしていないため、エラーが発生していると思われます。
私はどこでも見ることができるログに何も得ません、私はアイデアがありません(そしてnginxでこのセットアップに新しいです)
localhost
を実行すると、ページに502 bad gateway
メッセージが表示されました。これは私を助けました:
/etc/php5/fpm/pool.d/www.conf
listen = /var/run/php5-fpm.sock
をlisten = 127.0.0.1:9000
に変更しますSudo service php5-fpm restart
を実行しますたぶんあなたを助けるでしょう。
ソース: http://wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm
Nginxがphp5-cgiにハンドオフできないため、502エラーが表示されます。 tcpではなくUNIXソケットを使用するようにphp5-cgiを再構成してみてください。tcpではなくソケットを指すようにサーバー構成を調整してください。
ps auxww | grep php5-cgi #-- is the process running?
netstat -an | grep 9000 # is the port open?
ソケットまたはTCPを介して通信するには、PHP-FPMとNginxの設定を一致させる必要があります。
/etc/php5/fpm/pool.d/www.conf
に移動して、次の行を探します。
listen = /var/run/php5-fpm.sock
次に/etc/nginx/nginx.conf
に移動します
これを探してください:
upstream php {
server unix:/var/run/php5-fpm.socket;
}
それらの値と一致すると、すべての設定が完了します。
/etc/php5/fpm/pool.d/www.conf
に移動し、ソケットを使用している場合、またはこの行のコメントが外されている場合
listen = /var/run/php5-fpm.sock
他の値もいくつか設定してください:
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
Php-fpmとnginxを再起動することを忘れないでください。同じnginx所有者とグループ名を使用していることを確認してください。
Linuxサーバーを実行している場合は、IPTABLES構成が正しいことを確認してください。
Sudo iptables -L -n
を実行すると、開いているポートのリストを受け取ります。 fcgiスクリプトを提供するポートを開くためのIptablesルールがない場合、502エラーが表示されます。正しいポートを開くIptablesルールをリストする必要がありますbeforeすべてのパケットを分類的に拒否するルール(つまり、"REJECT ALL -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
という形式のルールまたは同様)
私の構成では、ポートを適切に開くには、次のコマンドを実行する必要がありました(fcgiサーバーがポート4567で実行されていると仮定します)。
Sudo iptables -I INPUT 1 -p tcp --dport 4567 -j ACCEPT
警告:これにより、ポート4567が全世界に開かれます。
そのため、次のようなことをした方が良いかもしれません。
Sudo iptables-save >> backup.iptables
Sudo iptables -D INPUT 1 #Delete the previously entered rule
Sudo iptables -I INPUT 1 -p tcp --dport 8080 -s localhost -j ACCEPT # Add new rule
これを行うことで、502エラーが解消されました。
変化する
fastcgi_pass unix:/var/run/php-fpm.sock;
に
fastcgi_pass unix:/var/run/php5-fpm.sock;
次を使用して、nginxがクライアントのアボートを無視するようにできます。
location / {
proxy_ignore_client_abort on;
}
Sudo /etc/init.d/php-fpm start
を実行すると、次のエラーが発生しました。
Starting php-fpm: [28-Mar-2013 16:18:16] ERROR: [pool www] cannot get uid for user 'Apache'
/etc/php-fpm.d/www.conf
は、nginxの場合は実際にはnginxであり、変更する必要があるときに、Webサーバーが実行されていることとApacheであると想定していることをユーザーに知らせる必要があると思います。
Ubuntuサーバーのセットアップ中に同じ問題が発生しました。ソケットファイルの不正なアクセス許可が原因で問題が発生していました。
許可の問題が原因で問題が発生している場合は、/ etc/php5/fpm/pool.d/www.confから次の行のコメントを解除できます。
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
または、お勧めしませんが、次のコマンドを使用して、すべてのグループに読み取りおよび書き込み権限を付与できます。
Sudo chmod go+rw /var/run/php5-fpm.sock
Xcacheまたはapcモジュールを無効にしてみてください。一部のバージョンで問題が発生しているように見えるため、オブジェクトをセッション変数に保存しています。
このヒントが誰かの命を救うことを願っています。私の場合、問題はメモリを使い果たしたということでしたが、ほんの少しだけそれについて考えるのが困難でした。その上で3時間を無駄にしました。実行することをお勧めします:
Sudo htop
または
Sudo free -m
...サーバーで問題のあるリクエストを実行して、メモリが不足していないかどうかを確認します。そして、私の場合のように、スワップファイルを作成する必要があります(まだ持っていない場合)。
このチュートリアルに従って、Ubuntu Server 14.04でスワップファイルを作成しましたが、うまく機能しました: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/
Ubuntuを使用していて、上記のすべてが失敗した場合、AppArmorが原因である可能性が最も高くなります。
ここにそれを修正する良いガイドがあります: https://www.digitalocean.com/community/tutorials/how-to-create-an-apparmor-profile-for-nginx-on-ubuntu-14- 04
長い話:
vi /etc/apparmor.d/nginx
または
Sudo aa-complain nginx
Sudo service nginx restart
すべてがうまく機能しているのを見る...
Sudo aa-logprof
Apparomorを含め、Nginxがすべての許可を持っているにもかかわらず、error.logを読み込めないという問題がまだありました。エントリの順序、またはPassengerやPHP-Fpmとのやり取りに関係しているのではないかと思います。これをトラブルシューティングする時間が足りず、今のところApacheに戻っています。 (Apacheのパフォーマンスも参考までに。)
AppArmorでは、プロファイルを削除するだけで、Nginxが必要な処理を実行できます。
rm /etc/apparmor.d/nginx
service apparmor reload
衝撃的なことですが、驚くことではありませんが、Nginxエラーの修正に関する多くの投稿は、SELinuxを完全に無効にするか、AppArmorを削除することに頼っています。たくさんのソフトウェアから保護を失うため、それは悪い考えです。 Nginxプロファイルを削除するだけで、構成ファイルをトラブルシューティングできます。問題がNginx構成ファイルにないことがわかったら、適切なAppArmorプロファイルを作成するのに時間をかけることができます。
AppArmorプロファイルがない場合、特にPassengerのようなものを実行している場合は、バックドアを取得するためにサーバーに約1か月を与えます。
ここでの同様のセットアップは、私のコードの単なるバグのように見えます。アプリの起動時に、問題のあるURLを探しましたが、これは機能しました:echo '<html>test</html>'; exit();
私の場合、問題は初期化されていない変数であり、特殊な状況でのみ失敗したことが判明しました。