一、现象:
Nginx反向代理,被代理也是nginx,客户端在下载大文件时,下载到1G时就会显示“下载失败”,FireFox中如果继续下载,则还会再下载1G,然后再失败。
反向代理服务器错误日志:
-
2016/11/25 11:23:47 [error] 67663#0: *11 upstream prematurely closed connection while reading upstream, client: ...
被代理服器错误日志:
-
2016/11/24 23:33:02 [error] 5833#101125: *8559 upstream timed out (60: Operation timed out) while reading response header from upstream, client: ....
二、分析:
1、代理服务器报告:上游过早的关闭连接,好像问题出在被代理服务器;而被代理服务器则抱怨:上游服务器超时。那么一个很合理的推论是:代理服务器很长时间没向被代理服务器请求数据,被代理服务器认为代理服务器已经掉线或完成任务,于是主动断开连接,代理服务器发现需要数据,再连接时,已经连接不上了。
2、正常的流程应该是:只要客户端一直下载,“客户机->代理服务器->被代理服务器”,这一连串的数据流不会中断,也就不会出现超时。
3、出现超时只能有一种情况:代理服务器缓存了大文件。
4、代理服务器接到下载请求,向被代理服务器请求数据,由于两个服务器之间网速快,所以代理服务器请求速度要远大于向客户端发送的速度,这就导致一下正常的代理方式:代理服务器要缓存数据。
5、但是两个服务器之间的速度实在是太快了,缓存1G数据也就是分分钟的事情,而客户端需要慢慢下载,可能需要十几、甚至几十分钟。代理服务器和被代理服务器这段时间内没有什么事可干,与是两端静默的时间一长,超过了timeout的时间(一般是60s),被代理服务器就认为代理服务器掉线。
三、解决:
有两个方案可以解决:
1、禁用缓存,客户端的每次清求都转发到被代理服务器,做法是在代理服务器的ngnix配置里面添加:proxy_redirect default ;
-
proxy_pass
-
proxy_redirect default ;
-
proxy_buffering off;
2、加大两个服务器之间的timeout,在被代理服务器的配置里添加:
-
client_body_timeout 3600;
-
client_header_timeout 1800;
-
keepalive_timeout 15;
-
send_timeout 3600;
这几个实际上是有很大差别的,如果区分不清,还是全部设置上吧。
--end--
阅读(17120) | 评论(0) | 转发(0) |