nginx 在做负载均衡时,如果其中一台挂了,为什么还会等待超时?

李萨 发布于 2017/04/14 16:29
阅读 2K+
收藏 1

我用 nginx 做负载均衡,使用了3个tomcat做web服务器。

其中1个tomcat挂了,其他2个tomcat正常运行的情况下,nginx还是会分发到那台挂掉的服务器,并且就算通讯不成功,nginx还是会等待60s超时,这是为什么?

我希望的结果是 nginx 在1台挂掉的情况下也能立刻将请求分发到其他2台正常的tomcat上。

就算它要等待超时,但是也不应该所有请求都在等待,并且nginx配置的 max_fails=1 fail_timeout=600s; 似乎根本一点作用都没有。

以下是我的配置:

    upstream yth_pool {
        server 127.0.0.1:8084 max_fails=1 fail_timeout=600s;
        server 127.0.0.1:8085 max_fails=1 fail_timeout=600s;
        ip_hash;
    }
    server {
        listen       80;
        server_name  www.xxx.com;
        location / {
            proxy_pass http://yth_pool;
            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 600;
            proxy_read_timeout 600;
            proxy_send_timeout 600;
            access_log off;
            break;
        }
    }

加载中
0
mickelfeng
mickelfeng

不使用ip_hash,使用  轮询  每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。或者指定轮询几率

0
李萨
李萨

哦,ip_hash是关掉的。配置贴错了-_-!!。是否是因为我的超时时间设置的不够长呢,比如我关掉12003,轮询到12003时就会卡住,一直等待20s,而其他用户访问也是这样~

    # 移动及微信负载均衡池
    upstream m_pool {
        server 127.0.0.1:12001 max_fails=1 fail_timeout=30s;
        server 127.0.0.1:12002 max_fails=1 fail_timeout=30s;
        server 127.0.0.1:12003 max_fails=1 fail_timeout=30s;
    }

    server {
        listen       80;
        server_name  m.xxx.com;
        location / {
            proxy_pass http://m_pool;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Scheme $scheme;
            proxy_connect_timeout 20;
            proxy_read_timeout 20;
            proxy_send_timeout 20;
            access_log off;
            break;
        }

}

0
玖伍陈海天
玖伍陈海天
没有自己搭建过负载均衡,但是,要做定时健康检查,不健康的自动排除
0
冯某某
冯某某

可以试试淘宝的nginx_upstream_check_module模块,支持高级后端检测

0
夏天的夏呢

 fail_timeout=600s 这个设置是服务器无响应后再隔600秒在去连接服务器,和你说得等待60秒超时根本不是一个概念。这个参数要通过proxy_connect_timeout time 来设置,这个才是和服务器建立连接的时间,你设置成1秒,如果1秒内没有响应,服务就会立刻跳转到另外的机器上了。

0
cpplc
cpplc

楼上说的很对,心跳包设置时间短一点。我一般给30秒。或者你可以考虑换架构使用zookeeper来作为监控服务。有页面实时监控服务。

返回顶部
顶部