我已经将 nginx 配置为在 gunicorn 下运行的 Python 应用程序的前端,但是 nginx 在发送大约 65k 数据后终止连接。
例如,我有一个如下所示的视图:
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 数据包:
答案1
好的!仔细检查了 nginx 日志后,发现问题出在这里:
2014/05/26 16:50:56 [crit] 31396#0: *11 open() "…/proxy_temp/2/00/0000000002" failed (13: Permission denied) while reading upstream, client: 1.2.3.4, server: _, request: "GET /debug/big-file HTTP/1.1", upstream: "http://127.0.0.1:1234/debug/big-file", host: "example.com"
由于某种原因,目录的权限proxy_temp
出现混乱,导致 nginx 无法正确缓冲它。