nginxのエラーをステータスコードやログの手がかりで絞り込み、考えられる原因と、それを直す設定変更を確認できます。502、504、403、404、413に対応しています。
Nginxがプロキシとして動作していて、背後のアプリから有効な応答が返ってこないと、502 Bad Gatewayを返します。原因は、アプリが停止している、別のポートやソケットで待ち受けている、応答の途中でクラッシュした、のいずれかです。アプリを起動し、proxy_passが実際の待ち受けアドレスを指すようにしてから、nginxのエラーログで正確な理由を確認しましょう。
各nginxエラーが示す場所
表示されたステータスコードを選ぶか、エラーログの単語を入力すると、一致する原因だけに絞り込まれます。各カードには、原因、それを確かめるチェック方法、応用できる設定スニペットが載っています。絞り込むまではすべてのカードが表示されます。
訪問者の立場なら、あなたの操作が原因になることはありません。プロキシが背後のアプリケーションに接続し、有効な応答を得られなかったのです。サイト運営者なら原因はアプリかプロキシの設定なので、まずアップストリームのプロセスが動いているか確認しましょう。
502は、アップストリームの応答が不正だったか、接続が拒否されたことを意味します。504は、nginxが待っても時間内に何も届かなかったことを意味します。前者は停止中やクラッシュ中のアプリを、後者は遅い処理や短すぎるタイムアウトを示しています。
http、server、locationブロックのいずれかでclient_max_body_sizeを設定します。例:client_max_body_size 20m;。デフォルトは1mです。0にするとサイズチェックが無効になりますが、公開サイトでそれが望ましいことはほとんどありません。
URLがスラッシュで終わると、nginxはindex.htmlなどのインデックスファイルを探します。存在せず、autoindexがデフォルトのオフなら、配信できるものがありません。インデックスファイルを追加するか、try_filesでリクエストを振り分けましょう。
場所は設定ファイルのerror_logディレクティブで決まります。パッケージやコンテナによって置き場所が異なるため、nginx.confとインクルードされたファイルでerror_logを検索してください。
ポート3000で動くアプリ向けの出発点です。元のホストとスキームを引き渡し、タイムアウトを明示し、大きめのヘッダーにも余裕を持たせています。
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だけで上限を上げます。
ステータスコード
すべてのコード
エラーログの単語
例:refused、timed out、denied
確認
修正
一致する原因:{n}件
一致する原因はありません。検索をクリアするか、別のコードを選んでください。
無料で始める · クレジットカード不要