nginx 使用反向代理功能,代理本机后端IIS,很容易出现502,504错误.

duxer 发布于 2011/07/28 13:17
阅读 17K+
收藏 2

测试环境是在WINDOWS2003,IIS6,NGINX 1.0下.

 location ~/ {
	proxy_set_header Accept-Encoding "none"; 
	proxy_redirect off;
	proxy_set_header Host $host;
	proxy_set_header X-Real_IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_connect_timeout     120s;
	proxy_read_timeout       120s;
	proxy_send_timeout       120s;
	proxy_buffering off;
	proxy_pass http://127.0.0.1:8080;
 }
在测试的时候,如果直接访问,127.0.0.1:80,即访问nginx,就很容易出现错误:
upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond) while connecting to upstream

上面这是NGINX的错误日志.在浏览器上反应就是502,504错误.

但如果在测试的时候,把测试地址改成http://127.0.0.1:8080,即访问IIS,根本不会出现超时什么的.

有人说是IIS脚本执行时间太长,但问题时,使用静态页面也出现同样的问题.就不应该是IIS的问题了.

后来又把同样的程序,放到另外一台2003上运行,把NGINX的代理地址也改了,情况就好多.
为什么直接代理本机却出现一大堆超时错误.不要说把timeout的值改大,那个改大了,浏览器上的反应就是一直在等待.还不如直接输出错误呢.

请问这种问题应该怎么解决呢?

以下是问题补充:

@duxer:对了, 还有这个配置 proxy_buffer_size 16k; proxy_buffers 4 16k; (2011/07/28 13:43)
@duxer:请不要说不要使用NGINX,直接使用IIS.现在使用NGINX主要解决的问题是带宽. 服务器带宽和磁盘不够,必须压缩所有页面.使用IIS的话,压缩页面需要占用大量的磁盘空间和CPU,而NGINX却占用很少. 另外再强调一下,代理本机的IIS,就出现这个错误,不是一直出现,访问量大了,就出现.现在把程序布署到另外一台上,代理另外一台,就不会出现这个错误. (2011/07/28 14:33)
@duxer:使用AB测试 ab -n 10000 -c 50 测试NGINX,其中failed的有700个左右 测试IIS,failed的0 (2011/07/30 12:02)
@duxer:使用AB测试 ab -n 10000 -c 50 测试NGINX,其中failed的有700个左右 测试IIS,failed的0 (2011/07/30 12:02)
加载中
0
ddatsh
ddatsh

有个说
http://hi.baidu.com/yarcowang/blog/item/da7434257fd8593dd507425e.html
有个LINUX下的说是内核问题
http://ifaint.com/tag/upstream-timed-out/

第一个能搞定不

0
d
duxer

第一个是解决"如果脚本需要长时间运行, 有可能导致nginx的upstream timed out错误".

而我这里不存在脚本超长运行的问题.因为使用同样的测试,分别测试NGINX和IIS,只有NGINX会出现超时的情况,IIS不会.

0
dy810810
dy810810

events里的use配置是什么?iocp还是select?

尝试分别对这二种配置进行测试。

不能解决的话,找台机装linux来跑nginx试试看还有没有这种问题 。

d
duxer
主要是代理另外一台机器就基本上不会报错(到目前为止没出现),但代理本机就要出错
d
duxer
events 开始的时候没有配置USE属性,后来换成SELECT后,感觉是一样的,也有同样的错误出现.换成IOCP后,NGINX就一直弹错误窗口出来,无法使用
0
dy810810
dy810810
 江郎才尽的说。。。
0
匿名t3a
匿名t3a

proxy_buffering on 

为后端的服务器启用应答缓冲。
如果启用缓冲,nginx假设被代理服务器能够非常快的传递应答,并将其放入缓冲区,可以使用 proxy_buffer_size和proxy_buffers设置相关参数。

d
duxer
还是一样,有时连静态文件也会报同样的错
0
匿名t3a
匿名t3a

修改 keepalive_timeout 

 keepalive_timeout 默认是60s

改成  keepalive_timeout 185; 看看

d
duxer
谢谢了.不过是一样,没效果.
0
dy810810
dy810810

今天遇到跟你同样的问题,不过后端是apache。

在worker_processes  1;的时候屁事都没有

一但改成真实的cpu核数就over了。

感谢万能的gg,在配置中加入:

events {

    accept_mutex off;

}

就没事了,希望能对你的帮助。

张玉风
张玉风
这个管用,谢谢啦
d
duxer
谢谢了.加上了,经过一个小时的观察,还是出现同样的问题.现在怀疑是系统或硬件问题,因为在另外一台上,同样是NGINX代理本机的IIS,不会出现问题.不过也有可能是这台的访问量比较少,差不多是有问题那台的一半吧.
0
sdpengfei1018
sdpengfei1018
把proxy_pass里面的localhost改成127.0.0.1试试看呢
0
妩媚的悟空
妩媚的悟空
兄弟,你这个问题解决了没有,我这边出现同类的问题,交流一下!
0
jroam
jroam
我也是这样的情况,还没有解决
返回顶部
顶部