2016-08-24 14 views
2

gunicornサーバ上で nginxが起動しているDjangoアプリがあります。 HTTP 500結果、 で生産上の障害を診断する必要がありますが、エラーログファイルには予想される情報が含まれていません。 Thusly:GangicornとnginxのDjango:ログファイルにHTTP 500が表示されない

  • gunicornがsettingerrorlog = "/somepath/gunicorn-errors.log"
  • nginxのはsettingerror_log /somepath/nginx-errors.log;
  • 私のアプリは、私が持っているビューがURL /fail_now
  • にマッピングされている 無条件raise Exception("Just for testing.") を行いdispatchそのInternalErrorViewを持っていました変更されていないhandler500
  • DEBUG=Trueでアプリを実行し、ブラウザに /fail_nowをリクエストした場合、 "Just for testing."というメッセージを含む通常のDjangoエラー画面が表示されます。ファイン。
  • でアプリを実行すると、 という応答が期待通りに<h1>Server Error (500)</h1>になります。ファイン。
  • しかし、gunicorn-errors.logを見ると、このHTTP 500イベントのエントリは全くありません。 なぜですか?どうすれば入手できますか? 私はトレースバックを取得したいと思います。
  • 同様にnginx-errors.log:500の痕跡または/fail_nowの痕跡がありません。 なぜですか?

ボーナス質問:中央メッセージとして <h1><p>Internal Server Error</p></h1>と9行の文書:私は私の元の生産上の問題にこれを比較すると 、私はそこ 異なる応答を取得しています。 なぜですか?

ボーナス質問2: 私は私のステージングサーバーに私のデータベースの内容をコピー(本番サーバへのコンフィギュレーションで 同一である)と、予想通り、そこ/fail_now作品をジャンゴで DEBUG=Trueを設定しますが、私の元 の問題は引き続き<h1><p>Internal Server Error</p></h1>と表示されます。 WTF?デバッグ= Falseの中、私は<h1><p>Internal Server Error</p></h1>が生産にnginxのによって生成されたと思いますnginxのデフォルトのファイルで

答えて

3

OK表示されて表示されますが、私はそれをすべてを見つけた:

  • <h1>Server Error (500)</h1>応答Djangoの django.views.defaults.server_error500.htmlテンプレートが存在しない場合)から来ます。
  • ボーナス質問 の<h1><p>Internal Server Error</p></h1>は、gunicornのgunicorn.workers.base.handle_errorに由来します。
  • nginxはエラーログファイルではなくアクセスログファイルに500エラーを記録します。おそらくそれは失敗したnginx自体ではなかったからです。
  • /fail_nowの場合、gunicornはエラーログではなく、アクセスログの問題を に記録します。やはりおそらくガンコルンは で失敗していないので、アプリケーションだけが持っているでしょう。
  • 私の元の問題は、実際にgunicornエラーログ、 に表示されなかったが、私は しかたてのログファイルを導入していた(私は前にドッカーlogs 出力に頼っていたので、私はある、そこにそれを探したことがありませんでしたかなり混乱している)、 を最初の のデバッグに使用する方が良いと想定しています。 (これは興味深い方法で間違っていたアイデアだった。)
  • しかし、私の実際のプログラミングエラーは、このような(Djangoのコードで生成された)Content-Dispositionヘッダとレスポンス 送信関与: attachment; filename="dag-wönnegården.pdf"を。 特殊文字は明らかにこの応答を処理するときに ガンコンがつぶれてしまう可能性があります。

このような状況を診断することで、質問を書くことができました。 この応答が他の誰かに役立つ場合、 StackOverflowの魔法がもう一度働きました。

1

サーバの応答500がないエラーログ

でのaccess_logにログインしていることがあり

access_log /var/log/nginx/example.log; 

`

raise例外は、エラーまたはhttp500として扱われるため、handler500のビューを変更しない限り、d EFAULT 500エラーページには、それは時間がかかった、

デバッグ= trueを 昇給の例外が空想djnagoのデバッグページに

関連する問題