0

私のスタックは、geventループ、flask、mysql、およびpythonmysql.connectorを備えたuWSGIです。非同期mysqlクエリを作成できます。Lateleyクエリを実行すると、nginxログで以下のエラーが発生します。クエリが完了するまでに最大60秒かかる場合があります。スタックの外側では、クエリが機能します。組み込みのflaskdevサーバーをラップトップでローカルに使用して実行し、世界中のmysqlサーバーにアクセスすると動作します。だから..私はnginx構成の問題を想定しています。

2013/01/05 01:49:48 [error] 7267#0: *2878 upstream timed out (110: Connection timed out) while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: 127.0.0.1, request: "GET /ajax_grid?date_from=2013-01-02&date_to=2013-01-04&rt=crpr&a_dhx_rSeed=1357350534901 HTTP/1.1", upstream: "uwsgi://127.0.0.1:6000", host: "test.com", referrer: "http://test.com/"

以下は、nginxに関連するオプションです。エラーが発生しないようにするには、何を調整する必要がありますか?

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 100000;
types_hash_max_size 2048;
proxy_read_timeout 200;
reset_timedout_connection on;
client_body_timeout 60;
send_timeout 2;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;

server {
        listen   80;
        server_name 127.0.0.1;



    location / {
                   include uwsgi_params;
                   uwsgi_buffering off;
                   #uwsgi_param X-Real-IP $remote_addr;
                   #uwsgi_param Host $http_host;
                   #uwsgi_pass uwsgi_dashboard;
                   uwsgi_pass 127.0.0.1:6000;
             }
4

1 に答える 1

3

おそらくuwsgi_read_timeout、nginxがアップストリームサーバーからのデータを待機する時間を延長するように設定する必要があります。デフォルトは60秒です。


実際、実際行う必要があるのは、長時間実行されるジョブをバックグラウンド/非同期タスクにシフトすることです。これは、ほとんどのhttpクライアントがサーバーからのデータを120秒以上待つことを望まないためです。とにかくタイムアウトします。celeryのような非同期処理フレームワークを使用し、クライアントがURLを照会して実行中のジョブのステータスを検索し、場合によってはキャンセルして、終了したら取得できるようにします。

wsgiコンテナをブロックすることにした場合は、データが完成したらリダイレクトを使用できます。ある種のコンテンツをクライアントに送信して、接続を維持します。

于 2013-01-05T02:39:27.170 に答える