我已经将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标题正确。