Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3583558
  • 博文数量: 601
  • 博客积分: 15410
  • 博客等级: 上将
  • 技术积分: 6884
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-16 08:11
个人简介

独学而无友,则孤陋而寡闻!

文章分类

全部博文(601)

文章存档

2020年(1)

2018年(4)

2017年(7)

2016年(42)

2015年(25)

2014年(15)

2013年(36)

2012年(46)

2011年(117)

2010年(148)

2009年(82)

2008年(37)

2007年(41)

分类: 系统运维

2016-11-25 11:47:56

一、现象:
  Nginx反向代理,被代理也是nginx,客户端在下载大文件时,下载到1G时就会显示“下载失败”,FireFox中如果继续下载,则还会再下载1G,然后再失败。
  反向代理服务器错误日志: 
  1. 2016/11/25 11:23:47 [error] 67663#0: *11 upstream prematurely closed connection while reading upstream, client: ...
     被代理服器错误日志:

  1. 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 ;

  1. proxy_pass
  2. proxy_redirect default ;
  3. proxy_buffering off;

  2、加大两个服务器之间的timeout,在被代理服务器的配置里添加:

  1. client_body_timeout 3600;
  2. client_header_timeout 1800;
  3. keepalive_timeout 15;
  4. send_timeout 3600;
这几个实际上是有很大差别的,如果区分不清,还是全部设置上吧。





--end--



阅读(12518) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~