2016-08-24 49 views
2

我有一個Django應用程序在gunicorn服務器上運行, nginx預先。 我需要診斷與HTTP 500結果, 但錯誤日誌文件生產故障不包含我期望的信息。 正是如此:Django與gunicorn和nginx:HTTP 500沒有出現在日誌文件中

  • gunicorn已經settingerrorlog = "/somepath/gunicorn-errors.log"
  • Nginx已經settingerror_log /somepath/nginx-errors.log;
  • 我的應用程序有一個InternalErrorView其中dispatch做一個 無條件raise Exception("Just for testing.") 這一觀點被映射到URL /fail_now
  • 我有未修改handler500
  • 當我跑我的DEBUG=True應用程序,有我的瀏覽器請求 /fail_now,我看到常用的Django錯誤屏幕也好,包括 的"Just for testing."消息。精細。
  • 當我運行我的應用程序DEBUG=False時,我得到的響應僅包括,如預期的那樣。精細。
  • 然而,當我看着gunicorn-errors.log,對於這個HTTP 500事件根本沒有進入 。 爲什麼?我怎麼才能得到它? 我想獲得回溯。
  • 同樣,在nginx-errors.log:500沒有一絲或/fail_now URL。 爲什麼?

獎金的問題: 當我比較這對我原來的生產問題,我得到 不同的反應有:與 <h1><p>Internal Server Error</p></h1>爲中心消息9行的文件。 爲什麼?

獎金問題2: 當我將數據庫中的內容複製到我的臨時服務器(等同 在配置到生產服務器),並在Django有設置 DEBUG=True/fail_now按預期工作,但我的原 問題仍然顯示爲<h1><p>Internal Server Error</p></h1>WTF?

回答

3

OK,經歷了很長時間,但我發現了這一切:

  • <h1>Server Error (500)</h1>響應來自Django的 django.views.defaults.server_error(如果沒有500.html模板存在)。
  • 來自獎勵問題 的<h1><p>Internal Server Error</p></h1>來自gunicorn的gunicorn.workers.base.handle_error
  • nginx在訪問日誌文件中記錄500錯誤,而不是錯誤日誌文件; 可能是因爲它不是nginx本身失敗。
  • 對於/fail_now,gunicorn也會記錄訪問日誌中的問題, 不是錯誤日誌;再次大概是因爲gunicorn本身有 沒有失敗,只有應用程序。
  • 我原來的問題實際出現在gunicorn錯誤日誌, 但我從來沒有尋找它那裏,因爲我有 推出的日誌文件只新鮮(我曾在碼頭工人logs依靠前 輸出,這是非常容易混淆),並且假設它會更好地使用非常明確的InternalErrorView進行初始調試 。 (這是一個想法,是錯誤的一種有趣的方式。)
  • 然而,涉及發送帶有Content-Disposition頭這樣的響應 (Django的代碼生成)我實際的編程錯誤: attachment; filename="dag-wönnegården.pdf"。 特殊字符顯然能夠在處理此響應時使gunicorn絆倒 。

寫這個問題幫助我很大程度上診斷這種情況。 現在,如果這個迴應可以幫助其他人, StackOverflow魔術再次工作。

1

可以是服務器響應500被記錄在訪問日誌不是在錯誤日誌

在nginx的默認文件

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

我認爲<h1><p>Internal Server Error</p></h1>由nginx的生產`

在調試

=假產生

將異常處理爲錯誤或http500,因此除非您更改了handler500的視圖,否則d EFAULT 500錯誤頁面將顯示

調試=真 引發異常顯示在看中djnago的調試頁面