2

次のようなビューを使用して、django 1.5.1 を介して動的に生成された pdf を提供しています。

pdf = generate_pdf()
response = HttpResponse(pdf, mimetype="application/pdf")
response['Content-Disposition'] = 'attachment; filename=1234_2013_10_30.pdf'
return response

開発サーバーで常に 100% 動作します。ただし、uwsgi バージョン 1.9.18.2 と nginx バージョン 1.1.19 を使用しており、次の動作が発生します。

$ curl -v -o test.out "http://localhost/demo/awc.pdf?submissionType=addition&permit=1234"
...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /demo/awc.pdf?submissionType=addition&permit=1234 HTTP/1.1
> User-Agent: curl/7.21.2 (Windows) libcurl/7.21.2 OpenSSL/1.0.0a zlib/1.2.3
> Host: localhost
> Accept: */*
>
  0     0    0     0    0     0      0      0 --:--:--  0:00:10 --:--:--     0

< HTTP/1.1 200 OK
< Server: nginx/1.1.19
< Date: Wed, 30 Oct 2013 22:14:23 GMT
< Content-Type: application/pdf
< Transfer-Encoding: chunked
< Connection: keep-alive
< Vary: Accept-Language, Cookie
< Content-Language: en-us
< Content-Disposition: attachment; filename=1234_2013_10_30.pdf
<
{ [data not shown]
100 2313k    0 2313k    0     0  270k       0 --:--:--  0:00:12 --:--:--     0
.....
100 2313k    0 2313k    0     0  77452      0 --:--:--  0:00:30 --:--:--     0* transfer closed with outstanding read data remaining
100 2313k    0 2313k    0     0  75753      0 --:--:--  0:00:31 --:--:--     0* Closing connection #0

curl: (18) transfer closed with outstanding read data remaining

要約すると、クライアントは 10 秒で応答を受け取り、約 2 秒ですべてのデータをダウンロードし、さらに 18 秒間ハングします。

偶然ではありませんが、私の nginx 設定では が指定されていますkeepalive_timeout 20s;。keepalive_timeout 秒待った後、コンテンツは完全に問題ありません。keepalive_timeout をゼロに設定することで問題を「解決」できますが、それは実際には実行可能な解決策ではありません。

コンテンツが小さい (~1MB 未満) 場合、問題は不可解に解消されます。

> GET "http://localhost/demo/awc.pdf?submissionType=addition&permit=5678" HTTP/1.1
> User-Agent: curl/7.21.2 (Windows) libcurl/7.21.2 OpenSSL/1.0.0a zlib/1.2.3
> Host: localhost
> Accept: */*
>
  0     0    0     0    0     0      0      0 --:--:--  0:00:04 --:--:--     0< HTTP/1.1 200 OK
< Server: nginx/1.1.19
< Date: Wed, 30 Oct 2013 22:39:12 GMT
< Content-Type: application/pdf
< Transfer-Encoding: chunked
< Connection: keep-alive
< Vary: Accept-Language, Cookie
< Content-Language: en-us
< Content-Disposition: attachment; filename=1234_2013_10_30.pdf
<
{ [data not shown]
100  906k    0  906k    0     0   190k      0 --:--:--  0:00:04 --:--:--  246k* Connection #0 to host localhost left intact 

チャンクエンコーディングまたはコンテンツ長ヘッダーの欠如と関係があると推測していますが、魔法の呪文を見つけることができないようです. 何か案は?

4

2 に答える 2

0

私は同じ問題を抱えていましたが、動的に生成されたコンテンツでも発生していました。私はnginx 1.5.8とubuntu 12.04LTSでphp-fpmへのfastcgi_passを実行しています-そして私のkeepalive_timeoutもハングを引き起こしていました!

keepalive_timeouts は静的コンテンツにのみ使用される (と思われる?) と思いますが、静的なように動的な JavaScript ファイル (js.php) をだましているので、キープアライブ タイムアウトが適用されますか?

この説明とは対照的に、恒久的な解決策を見つけることができれば...投稿します。ああ、おそらくこれが答えです。nginx.confファイルでこれを指定するように言われています-

fastcgi_keep_conn on;

私はまだ keepalive_timeout を 1 秒だけに残しましたが、その受け入れられた回答で提供された解決策は理にかなっています - 私の動的ファイルは fastcgi に渡されましたが、キープアライブ接続は fastcgi によって保持されませんでした -これに関する公式の nginx ドキュメントもあります。

デフォルトでは、FastCGI サーバーは応答を送信した直後に接続を閉じます。ただし、このディレクティブの値が on に設定されている場合、nginx は FastCGI サーバーに接続を開いたままにするように指示します。これは特に、FastCGI サーバーへのキープアライブ接続が機能するために必要です。

于 2014-01-17T11:44:15.463 に答える