我已经将 nginx 配置为在 gunicorn 下运行的 Python 应用程序的前端,但是在发送了大约 65k 的数据后,nginx 正在终止连接。
例如,我有一个看起来像这样的视图:
def debug_big_file(request):
return HttpResponse("x" * 500000)
但是当我通过 nginx 访问该 URL 时,我只得到 65283 个字节:
$ curl https://example.com/debug/big-file | wc
…
curl: (18) transfer closed with outstanding read data remaining
0 1 65283
请注意,直接访问 gunicorn 时,一切都按预期工作:
$ curl http://localhost:1234/debug/big-file | wc
…
0 1 500000
相关的 nginx 配置:
location / {
proxy_pass http://localhost:1234/;
proxy_redirect off;
proxy_headers_hash_bucket_size 96;
}
和 nginx 版本 1.7.0
其他一些事实:
- 每个请求的字节数是一致的,但是根据内容的不同而不同(我第一次注意到它是用一个大的PNG文件,它在65,372字节后被截断,而不是65,283)
- 110k 字节正确发送(即
"x" * 110000
返回所有 110,000 字节),但 120k 字节不正确 tcpdump
表明 nginx 正在向 gunicorn 发送 RST 数据包:
好的!在仔细检查了 nginx 日志后,原来是这个问题:
一些目录的权限
proxy_temp
被搞砸了,这阻止了 nginx 正确缓冲它。