proxy_next_upstream和nginx upstream的排错逻辑可能导致的问题
2013-07-04 16:19
831 查看
proxy_next_upstream和nginx upstream的排错逻辑可能导致的问题
upstream kjh {
server 172.17.3.131:8081 max_fails=2 fail_timeout=30s;
server 172.17.3.132:8081 max_fails=2 fail_timeout=30s;
}
server
{
listen 80;
server_name report.kjh.com ;
proxy_redirect off;
location / {
1.
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
在nginx配置反向代理时,此配置对客户体验影响较大,当客户端请求一个不存在的文件,导致较长时间才能返回请求失败,虽然在真实的环境中有一定的冗余作用,如不善用弊大于利!
语法: proxy_next_upstream [error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off]
确定在何种情况下请求将转发到下一个服务器。转发请求只发生在没有数据传递到客户端的过程中。
2.
关于max_fails参数的理解:根据上面的解释,max_fails默认为1,fail_timeout默认为10秒,也就是说,默认情况下后端服务器在10秒钟之内可以容许有一次的失败,如果超过1次则视为该服务器有问题,将该服务器标记为不可用。等待10秒后再将请求发给该服务器,以此类推进行后端服务器的健康检查。但如果我将max_fails设置为0,则代表不对后端服务器进行健康检查,这样一来fail_timeout参数也就没什么意义了。那若后端服务器真的出现问题怎么办呢?上文也说了,可以借助proxy_connect_timeout和proxy_read_timeout进行控制。
3.死循环
当设定proxy_next_upstream http_404,并且upstream里配置是max_fails=0,则访问到不存在文件时,将会有死循环现象,nginx负载明显升高,kill -HUP进程消逝很慢。同样的,proxy_next_upstream如果设定为其它值,例如http_503、invalid_header等也会有同样问题,但默认的error timeout不会出问题。
4.502 bad gateway
nginx的检测后端机制相对严格,默认的,某个后端一个失败的请求,就会令此后端暂停10秒。一般而言,不会有太多失败的请求,而且也不太可能所有机器在10秒内同时出问题;但世事总是难料,nginx->nginx的架构,常因后台服务器文件有错(通常是ssi),报出莫名其妙的错误,导致代理挂起此后端,然后proxy_next_upstream又将此请求导向下一台服务器,因此在10秒内,所有服务器都将被挂起……
解决此问题,最直接的办法是将max_fails设为0,关闭nginx屏蔽后端的功能,虽然有可能会造成死循环,但死循环还不至于很快停止服务,只是负载较高,至少可以挺一阵子。后端的错误如影响太大,还是要及时解决。
5.timeout
如果设定了max_fails=0,则某后端出了故障造成访问超时时不会被屏蔽,进而访问到此后端的请求都要等到超时才会跳到下一个后端,虽然请求最终还是成功了,但用户体验会变得很差。解决此问题的办法就是将超时时间调得很短,大概3-15秒,只要在用户(老板)能接受的范围内即可。
本文出自 “康建华” 博客,请务必保留此出处http://michaelkang.blog.51cto.com/1553154/1241565
相关文章推荐
- nginx 通过proxy_next_upstream实现容灾和重复处理问题
- 关于Nginx location中配置proxy_pass转发时斜线'/'导致的404问题
- 利用nginx的proxy_next_upstream实现线路容灾
- 利用nginx的proxy_next_upstream实现线路容灾
- Nginx做前端Proxy时TIME_WAIT过多的问题
- 软件测试通过下多条内存也可能存在某些问题导致死机
- 您的电池出现问题,因此可能导致您的计算机突然关机
- Nignx添加proxy_pass可能造成DNS解析超时的问题解决
- 更改Nginx网站根目录以及导致的403 forbidden问题解决
- 解决apache/nginx做反向代理导致request.getServerName()外网环境获取不到代理地址(或域名)的问题
- 018_nginx_proxy死循环问题
- nginx的proxy模块及upstream模块介绍
- 【WCF】 套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“00:00:56.9810000”。
- nginx的proxy_pass和 location为正则表达式的问题
- yum安装的nginx以及解决selinux导致无法访问的问题
- Android的硬件加速及可能导致的问题
- React在Render中使用bind可能导致的问题
- nginx使用proxy_pass反向代理时cookie丢失问题解决方案
- 利用nginx的upstream做反向代理解决内网域名转发的问题
- ERR_UNKNOWN_URL_SCHEME 导致的可能问题