欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

nginx负载均衡设置 博客分类: nginx  

程序员文章站 2024-02-26 08:30:40
...
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/