2012-04-21 18 views
38

this siteのdjango-on-twistedスクリプトを使用してツイストでdjangoアプリケーションを実行しています。djangoの実行中にツイスター・サーバーが予期せずクラッシュする

すべてのリクエストは、関連するリクエストをひっくり返してプロキシするnginxサーバーによって処理されます。私は基本的にちょうどget要求を受け取り、応答を送る前にgetパラメータで何らかの処理を行うAPI用のURL設定をしています。しかし、特定のクライアントが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 

クライアントからのリクエストは有効なリクエストであり、逆の処理には影響しません。私はシェルからテストしました。私がdjango開発サーバーで試してみたところ、リクエストを受け取る痕跡を残さずに同じ方法でクラッシュしました。ブラウザからテストするときは、すべてが完璧に機能します。また、ねじれたサーバーは、すべての通常の使用例でうまく機能します。私が問題に直面しているのは初めてです。どんな助けや指針も感謝します。

+1

「シャットダウンします」意味ですか?それはきれいに終了しますか?シグナルがそれを終了させますか? –

+0

ねじれたサーバーはログに何も書き込まれません。私はそれがきれいな出口ではないと確信しています。それは単に動作を停止します。どのように私は出口信号をキャッチすることができるかもしれないの任意のアイデア? – tapan

+6

bashを使用している場合は、 '$?'が役に立ちます。 bashのmanページから:**?最後に実行されたフォアグラウンドパイプラインの終了ステータスに展開されます。**したがって、例えば、 'twistd ...; echo $? ' –

答えて

1

rfcには499のHTTPコードはありません。 Nginxは499コード自体を定義しています。

クライアントが要求を送信し、 応答を待たずに接続を終了すると、499コードが発生します。あなたの access_logに499個のものがたくさんある場合、それは主に低速のバックエンドによって引き起こされます(あなたの ユーザーが待機するには遅すぎます)。ウェブサイトのパフォーマンスを最適化する必要があるかもしれません。それはgunicornであなたのために働くが、ジャンゴ・オン・ツイストではないので、あなたが

  • (?再現性)の問題は、特定のURLを打つクライアントからと言う、いずれかのスクリプトではありません

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

  • +0

    バックエンドは実際には問題ありません。 499は、変数を取得してバックエンドにデータをダンプするボットによって引き起こされます。要求を送信し、応答を待たずにすぐに接続を閉じます。これは容認できる動作です。私はちょうどそれのためにねじれがクラッシュすることを望まない。私は今、gunicornを使用しており、同じユースケースに対して完全に動作します。 – tapan

    1
    • 正常に動作しているか、またはtwisted.web2が問題です。

    $ sh init.sh yourdjangoproject standをお試しください。

    あなたもSystemExitをキャッチするrun.pyを変更しようとすることができます。

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

    答えをありがとう!私はまったく新しいアーキテクチャに移行して以来、これをテストする立場にはありません。しかし、私はこの特定のケースのための環境をいつか後で設定し、あなたの答えが役立つかどうかを見ていきます。 – tapan

    関連する問題