我已经将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数据包:
看看(a)gunicorn如何选择将回复范围从110k字节压缩到120k字节,以及(b)然后nginx如何针对110k到120k字节之间的相同样本有效负载大小选择帧,将很有帮助。HTTP可以通过三种方式构造数据帧:提供内容长度;进行分块编码;或完全不做任何框架,除非保证在主体完成后将其关闭。
—
布兰登·罗兹
提供了内容长度标头。让我丢包,看看两者之间是怎么回事……
—
David Wolever 2014年
嗯,很奇怪。tcpdump建议nginx正在主动RST连接(请参见编辑)。nginx也使用HTTP / 1.0和
—
David Wolever
Connection: close
。我也已经确认Content-Length
标题正确。