nginx负载均衡设置

nginx的upstream目前支持4种方式的分配

1)、轮询(默认) 
      每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 
2)、weight 
      指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 
2)、ip_hash 
      每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。  
3)、fair(第三方) 
      按后端服务器的响应时间来分配请求,响应时间短的优先分配。  
4)、url_hash(第三方)
配置:
在http节点里添加:

#定义负载均衡设备的 Ip及设备状态 

upstream myServer {   

    server 127.0.0.1:9090 down; 
    server 127.0.0.1:8080 weight=2; 
    server 127.0.0.1:6060 weight=1 max_fails=2 fail_timeout=30s; 
    server 127.0.0.1:7070 backup; 
}

在需要使用负载的Server节点下添加

proxy_pass http://myServer;

upstream 每个设备的状态:

down 表示单前的server暂时不参与负载 
weight  默认为1.weight越大,负载的权重就越大。 
max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 
fail_timeout:max_fails 次失败后,暂停的时间。 
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。



       location /myhttp {
            index  index.jsp;
            proxy_pass      http://myServer/myhttp/;
            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;
            client_max_body_size    10m;
            client_body_buffer_size 128k;
            proxy_connect_timeout   90;
            proxy_send_timeout      90;
            proxy_read_timeout      90;
            proxy_buffer_size       4k;
            proxy_buffers           4 32k;
            proxy_busy_buffers_size 64k;
            proxy_temp_file_write_size 64k;

         }

处理session的情况

1)使用memcached或其它方式保存
2)ip_hash
upstream backend {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
ip_hash;
}
注意:
(1)nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用 的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。

(2)nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一 台session应用服务器上。这么算起来,nginx后端只能直接指向应用服务器,或者再搭一个squid,然后指向应用服务器。最好的办法是用 location作一次分流,将需要session的部分请求通过ip_hash分流,剩下的走其它后端去。
3) upstream_hash
解决ip_hash的问题,使用,nginx_upstream_jvm_route
    
    --add-module=/path/to/this/directoryEXAMPLE¶1.For resin 
upstream backend {     
server 192.168.0.100 srun_id=a;     
server 192.168.0.101 srun_id=b;    
server 192.168.0.102 srun_id=c;    
server 192.168.0.103 srun_id=d;      
jvm_route $cookie_JSESSIONID; //resion
#jvm_route $cookie_JSESSIONID reverse;//tomcat
}


For all resin servers 
    <server id="a" address="192.168.0.100" port="8080">    
    <http id="" port="80"/>     </server>    
    <server id="b" address="192.168.0.101" port="8080">     
    <http id="" port="80"/>     
    </server>
    
And start each resin instances like this: 
server a 
shell $> /usr/local/resin/bin/httpd.sh -server a start
server b 
shell $> /usr/local/resin/bin/httpd.sh -server b start


    <server id="a" address="192.168.0.100" port="8080">    
    <http id="" port="80"/>     </server>   
    <server id="b" address="192.168.0.101" port="8080">   
    <http id="" port="80"/>     
    </server>
    And start each resin instances like this: 
server a 
shell $> /usr/local/resin/bin/httpd.sh -server a start
server b 
shell $> /usr/local/resin/bin/httpd.sh -server b start

具体参考:
http://code.google.com/p/nginx-upstream-jvm-route/

http://apps.hi.baidu.com/share/detail/43299477
如何优化
http://www.yanghengfei.com/archives/326/

相关推荐