nginx+tocmat 负载均衡时,一台tomcat宕机时的问题


在windows下作nginx负载均衡测试。

我的nginx的配置文件如下:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

     upstream localhost {
       server 127.0.0.1:8080   max_fails=2 fail_timeout=30s;
       server 127.0.0.1:8081   max_fails=2 fail_timeout=30s;
     }
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
   
    location /{
    proxy_pass http://localhost;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

 

 问题描述如下:

用了nginx负载均衡后,在两台tomcat正常运行的情况下,访问http://localhost 速度非常迅速,通过测试程序也可以看出是得到的负载均衡的效果,但是我们试验性的把其中一台tomcat(server localhost:8080)关闭后,再查看http://localhost,发现反应呈现了一半反映时间快,一半反映时间非常非常慢的情况,但是最 后都能得到正确结果。 
然后我又把关闭的那吧tomcat实例恢复,此时再访问http://localhost,又可以很快的访问,负载均衡也运行正常了!郁闷! 
分析怀疑可能是nginx将一半的左右的请求仍然发到了宕掉的tomcat实例上了,然后由于转发到宕掉的tomcat没有反映,nginx又重新分发到其它实例上处理。 
但是这个时间也太长了。当有一台宕机后,访问http://localhost有时候会现了大概30s左右的响应时间,非常郁闷! 

那么怎么样可以提高nginx对于宕掉的服务器的反应与处理,以使以后的请求到来不会还将期发送到原来宕掉的服务器。 

问题解决:

 server {
        listen       80;
        server_name  localhost;
    location /{
    proxy_pass http://localhost;
    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       1;
    proxy_read_timeout          1;
    proxy_send_timeout          1;

    }

}

或者

   upstream localhost {
       server 127.0.0.1:8080   max_fails=2 fail_timeout=1s;
       server 127.0.0.1:8081   max_fails=2 fail_timeout=1s;
     }

均可缩短连接超时时间!