web-dev-qa-db-ja.com

nginx 502不良ゲートウェイ

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でこのセットアップに新しいです)

60
Joel Wickard

localhostを実行すると、ページに502 bad gatewayメッセージが表示されました。これは私を助けました:

  1. 編集/etc/php5/fpm/pool.d/www.conf
  2. listen = /var/run/php5-fpm.socklisten = 127.0.0.1:9000に変更します
  3. 場所が nginx.confで適切に設定 であることを確認します。
  4. Sudo service php5-fpm restartを実行します

たぶんあなたを助けるでしょう。

ソース: http://wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm

54
fadil

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? 
9
sdolgy

ソケットまたは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;
}

それらの値と一致すると、すべての設定が完了します。

8
Ken Prince

/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所有者とグループ名を使用していることを確認してください。

8
techvineet

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エラーが解消されました。

5
tjb

変化する

fastcgi_pass    unix:/var/run/php-fpm.sock;

fastcgi_pass    unix:/var/run/php5-fpm.sock;
4
user2816137

次を使用して、nginxがクライアントのアボートを無視するようにできます。

location / {
  proxy_ignore_client_abort on;
}
2
Meekohi

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であると想定していることをユーザーに知らせる必要があると思います。

2
neubert

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
2
Ali Haris

Xcacheまたはapcモジュールを無効にしてみてください。一部のバージョンで問題が発生しているように見えるため、オブジェクトをセッション変数に保存しています。

1
h0tw1r3

このヒントが誰かの命を救うことを願っています。私の場合、問題はメモリを使い果たしたということでしたが、ほんの少しだけそれについて考えるのが困難でした。その上で3時間を無駄にしました。実行することをお勧めします:

Sudo htop

または

Sudo free -m

...サーバーで問題のあるリクエストを実行して、メモリが不足していないかどうかを確認します。そして、私の場合のように、スワップファイルを作成する必要があります(まだ持っていない場合)。

このチュートリアルに従って、Ubuntu Server 14.04でスワップファイルを作成しましたが、うまく機能しました: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/

1
Rav

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か月を与えます。

1
dagelf

ここでの同様のセットアップは、私のコードの単なるバグのように見えます。アプリの起動時に、問題のあるURLを探しましたが、これは機能しました:echo '<html>test</html>'; exit();

私の場合、問題は初期化されていない変数であり、特殊な状況でのみ失敗したことが判明しました。

0
PJ Brunet