2012-04-21 115 views
38

我正在使用來自this site的django-on-twisted腳本以扭曲方式運行django應用程序。扭曲的服務器在運行時意外崩潰django

所有請求都由一個nginx服務器提供服務,該服務器將相關請求反向代理爲twisted。我有一個API的API設置,它基本上只接收get請求,並在發送響應之前對get參數進行一些處理。但是,當一個特定的客戶端正在訪問api時,扭曲的服務器就會關閉。下面粘貼的是Nginx日誌:

the.ip.of.client - - [21/Apr/2012:11:30:36 -0400] "GET /api/url/?get=params&more=params HTTP/1.1" 499 0 "-" "Java/1.6.0_24" 

扭曲的日誌顯示什麼,但在這一點上扭曲停止工作。通過錯誤代碼499,我假設客戶端意外關閉了連接,這與我沒有任何問題。客戶是否收到回覆對我來說並不重要。以下是相關的django視圖:

def api_url(request): 
    if request.GET: 
     get_param = request.GET.get('get', [''])[0] 
     more_param = request.GET.get('more', [''])[0] 
     #some processing here based on the get params 
     return HttpResponse('OK') 
    else: 
     raise Http404 

來自客戶端的請求是有效請求,不會以不利方式影響處理。我從shell中測試過它。當我在django開發服務器上嘗試它時,它也以同樣的方式崩潰,沒有留下任何接收請求的痕跡。從瀏覽器進行測試時,一切正常。此外,扭曲的服務器適用於所有常規用例。這是我第一次面臨一個問題。任何幫助或指針將不勝感激。

+1

什麼是 「關閉」 是什麼意思?它乾淨地退出嗎?信號是否會導致它退出? – 2012-04-21 19:32:06

+0

扭曲的服務器不會向日志寫入任何內容。我很確定這不是一個乾淨的退出。它只是停止工作。任何想法我怎麼能夠趕上退出信號? – tapan 2012-04-21 20:12:59

+6

如果你使用bash,那麼'$?'會有幫助。從bash手冊頁:**?擴展到最近執行的前臺管道的退出狀態。**因此,例如,'扭轉...; echo $?' – 2012-04-22 00:27:57

回答

1

rfc中沒有499 http代碼。 Nginx自己定義了499個代碼。

當客戶端發送請求並關閉連接而不等待 響應時,會出現499代碼。如果您的access_log中有大量499s,這主要是由後端緩慢(您的 用戶等待太慢)造成的。您可能必須優化您的網站性能。

http://forum.nginx.org/read.php?2,213789,213794#msg-213794

+0

實際上,後端很好。 499是由一個bot通過獲取變量將數據轉儲到後端引起的。它發送請求並立即關閉連接而不等待響應。這是可以接受的行爲。我只是不想因爲它而扭曲墜毀。我現在正在使用gunicorn,它對於相同的用例完美地工作。 – tapan 2012-09-03 07:30:23

1
  • 你說的問題是從客戶端打一個特定的URL(重現?)
  • ,因爲它爲你的作品與gunicorn而不是Django的上扭曲,無論是劇本不正常工作或twisted.web2是問題。

請嘗試$ sh init.sh yourdjangoproject stand

你也可以嘗試修改run.py趕上SystemExit

import pdb 
try: 
    # __main__ stuff here. 
except (KeyboardInterrupt, SystemExit): 
    pdb.set_trace() 
+0

感謝您的回答!自從我們轉向全新的架構以來,我實在無法對此進行測試。但是,我會嘗試在稍後的某個時間爲此特定情況設置一個環境,並查看您的答案是否有幫助。 – tapan 2012-10-12 16:58:05