![nginx 代理响应终止/截断](https://linux22.com/image/616855/nginx%20%E4%BB%A3%E7%90%86%E5%93%8D%E5%BA%94%E7%BB%88%E6%AD%A2%2F%E6%88%AA%E6%96%AD.png)
我在主机(host1)上有这个 nginx 配置:
server {
...
location /foo {
proxy_pass http://127.0.0.1:8091/;
}
}
后端 nginx 配置如下:
server {
listen localhost:8091;
root /store;
autoindex on;
}
后端实际上位于不同的主机(host2)上,并且由于我们的防火墙配置,我需要反向隧道连接(这可能与问题无关,但为了完整性而包括):
ssh -R8091:localhost:8091 host1
此设置用于处理较大文件(GB)。问题是,我发现请求会突然终止/截断,大小总是比其完整大小小一点,例如 1081376535、1082474263 等。但是日志中没有错误,详细的调试日志中也没有跳出任何内容。响应中也总是有一个 Content-Length。
经过一番挖掘,我发现proxy_max_temp_file_size
默认情况下有一个 1GB。事实上,通过检查 /proc 中 nginx 工作进程的 FD,临时文件实际上被填充到 1073741824 字节,而且填充速度比下游客户端能够接收的速度快得多。将其降低到 1MB 基本上可以解决问题 [1](我想,用 0 完全禁用它会解决问题)。但为什么这会成为问题?如果超时,为什么没有错误消息,为什么默认值是 1GB,为什么下游客户端能够接收超过 1073741824 个字节的几个额外(数量不等)字节?
无论如何,我只是想知道是否有人可能知道发生了什么。如果有区别的话,两个主机都是 Ubuntu 12.04。
[1] 我说大多因为问题已被另一个问题取代,即下载全部停止在 2147484825 字节处,恰好是 0x80000499,但我还没有进行足够的调试来确定这是否是(正如我怀疑的那样)前端服务器和客户端之间的问题。
答案1
不久之后,我从 Maxim 那里找到了这个答案,它似乎证实了我的假设:
http://forum.nginx.org/read.php?2,155864,215181#msg-215181
我的看法是,默认磁盘缓冲区为 1GB 是没有充分理由的,并且 nginx 在出现意外的上游截断/断开连接时发出警告会很有帮助。