Nginx 502 Bad Gatewayと、Nginxでよく出る他の4つのエラー

Nginx 502 Bad Gatewayとその他のNginxエラー

Nginx 502 Bad Gateway:502、504、403、404、413の対処法 | We.Inc

nginxのエラーをステータスコードやログの手がかりで絞り込み、考えられる原因と、それを直す設定変更を確認できます。502、504、403、404、413に対応しています。

Nginxがプロキシとして動作していて、背後のアプリから有効な応答が返ってこないと、502 Bad Gatewayを返します。原因は、アプリが停止している、別のポートやソケットで待ち受けている、応答の途中でクラッシュした、のいずれかです。アプリを起動し、proxy_passが実際の待ち受けアドレスを指すようにしてから、nginxのエラーログで正確な理由を確認しましょう。

各nginxエラーが示す場所

表示されたステータスコードを選ぶか、エラーログの単語を入力すると、一致する原因だけに絞り込まれます。各カードには、原因、それを確かめるチェック方法、応用できる設定スニペットが載っています。絞り込むまではすべてのカードが表示されます。

よくある質問

502エラーは自分のせいですか、サーバーのせいですか?

訪問者の立場なら、あなたの操作が原因になることはありません。プロキシが背後のアプリケーションに接続し、有効な応答を得られなかったのです。サイト運営者なら原因はアプリかプロキシの設定なので、まずアップストリームのプロセスが動いているか確認しましょう。

nginxの502と504の違いは何ですか?

502は、アップストリームの応答が不正だったか、接続が拒否されたことを意味します。504は、nginxが待っても時間内に何も届かなかったことを意味します。前者は停止中やクラッシュ中のアプリを、後者は遅い処理や短すぎるタイムアウトを示しています。

nginxのアップロードサイズ上限を上げるには?

http、server、locationブロックのいずれかでclient_max_body_sizeを設定します。例:client_max_body_size 20m;。デフォルトは1mです。0にするとサイズチェックが無効になりますが、公開サイトでそれが望ましいことはほとんどありません。

フォルダーに対してnginxが403を返すのはなぜですか?

URLがスラッシュで終わると、nginxはindex.htmlなどのインデックスファイルを探します。存在せず、autoindexがデフォルトのオフなら、配信できるものがありません。インデックスファイルを追加するか、try_filesでリクエストを振り分けましょう。

nginxのエラーログはどこにありますか?

場所は設定ファイルのerror_logディレクティブで決まります。パッケージやコンテナによって置き場所が異なるため、nginx.confとインクルードされたファイルでerror_logを検索してください。

プロキシが自分の原因ではないエラーを出す理由

何かを変える前にエラーログを読む

よくあるミスを避けるプロキシ設定

ポート3000で動くアプリ向けの出発点です。元のホストとスキームを引き渡し、タイムアウトを明示し、大きめのヘッダーにも余裕を持たせています。

NodeやPythonアプリ用のserverブロック

nginx -tでテストしてからリロードします。ポートと上限値はアプリに合わせて調整してください。

nginxの背後のアプリが動いておらず、接続が拒否されている。

nginxのマシンからproxy_passのアドレスにcurlします。接続が拒否されれば確定です。

クラッシュ後に自動で再起動するプロセスマネージャーの下でアプリを起動します。

proxy_passが、アプリの待ち受けていないポートやソケットを指している。

proxy_passのアドレスと、アプリが起動時に表示するアドレスを比べます。

ホスト部分も含めて、両者を完全に一致させます。

アプリが、nginxの読み込みバッファーより大きいレスポンスヘッダーを送っている(例:大量のCookie)。

ヘッダーが大きすぎることに触れたログ行を探します。

そのlocationでproxy_buffer_sizeを上げます。デフォルトはメモリ1ページ分で、4kか8kです。

アプリが2回の読み取りの間でproxy_read_timeout(デフォルト60秒)より長くかかった。

同じリクエストをcurlでアプリに直接送り、時間を計ります。

エンドポイントを高速化するか、処理をバックグラウンドジョブに移します。タイムアウトを延ばすのはそのlocationだけにします。

nginxがproxy_connect_timeout(デフォルト60秒)以内に接続すら開けなかった。

ファイアウォールや、プロキシから到達できないホストがないか確認します。

ネットワーク経路を修正します。nginxのドキュメントによると、このタイムアウトは通常75秒を超えられないため、延ばしても効果はありません。

スラッシュで終わるURLにインデックスファイルがなく、autoindexがオフになっている。

rootが指すフォルダーの中身を一覧し、index.htmlがあるか確認します。

インデックスファイルを追加するか、try_filesでリクエストをアプリに送ります。

nginxのワーカーユーザーがファイルを読めない、または上位フォルダーのどれかに入れない。

エラーログに、パスを含むpermission deniedの行がないか探します。

ワーカーユーザーに、ファイルの読み取り権限と、すべての親フォルダーの実行権限を与えます。

allowまたはdenyのルールが訪問者に一致した。ルールは順番に評価され、最初に一致したものが適用される。

そのlocationに適用されるallowとdenyの行を、上から順にすべて読みます。

具体的なallowが広範なdeny allより前に来るよう、ルールを並べ替えます。

aliasを使うべき場所でrootを使ったため、nginxがlocationのプレフィックスをパスに二重に付けている。

ファイルパスを計算します。rootはURI全体を後ろに付け、aliasは一致したプレフィックスを置き換えます。

フォルダー名がURLと異なる場合は、両側に末尾スラッシュを付けてaliasを使います。

/dashboardのようなシングルページアプリのルートに、ディスク上のファイルがない。

トップページは表示されるのに、内部ルートで再読み込みすると失敗します。

try_filesでindex.htmlにフォールバックさせ、アプリのルーターにパスを処理させます。

リクエスト本文がclient_max_body_size(デフォルト1m)より大きい。

1メガバイト未満のアップロードは成功し、それより大きいものは失敗します。

アップロード用のlocationだけで上限を上げます。

Nginxエラーファインダー

ステータスコード

すべてのコード

エラーログの単語

例:refused、timed out、denied

確認

修正

一致する原因:{n}件

一致する原因はありません。検索をクリアするか、別のコードを選んでください。

無料で始める · クレジットカード不要

関連: ガイド|Webマーケティングと集客を学ぶ

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る