nginx在65k字节后终止连接


11

我已经将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

看看(a)gunicorn如何选择将回复范围从110k字节压缩到120k字节,以及(b)然后nginx如何针对110k到120k字节之间的相同样本有效负载大小选择帧,将很有帮助。HTTP可以通过三种方式构造数据帧:提供内容长度;进行分块编码;或完全不做任何框架,除非保证在主体完成后将其关闭。
布兰登·罗兹

提供了内容长度标头。让我丢包,看看两者之间是怎么回事……
David Wolever 2014年

嗯,很奇怪。tcpdump建议nginx正在主动RST连接(请参见编辑)。nginx也使用HTTP / 1.0和Connection: close。我也已经确认Content-Length标题正确。
David Wolever

Answers:


10

好的!仔细检查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正确缓冲到该目录。


1
是的,我只是解决了一个这样的问题,在nginx日志中查看了一行包含的代码[crit] 6636#0: *16817 open() "/var/lib/nginx/proxy/7/03/0000000037" failed (13: Permission denied) while reading upstream,并做sudo chown -R www-data:www-data /var/lib/nginx/了修复。
Epigene
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.