nginx 在 65k 字节后终止连接

nginx 在 65k 字节后终止连接

我已经将 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 数据包:nginx 发送 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 无法正确缓冲它。

相关内容