Heim  >  Artikel  >  Backend-Entwicklung  >  Nginx+Tomcat做负载平衡

Nginx+Tomcat做负载平衡

WBOY
WBOYOriginal
2016-07-30 13:31:14941Durchsuche

Nginx负载均衡

最近项目要设计到并发,所以设计项目架构时考虑到用Nginx搭建Tomcat集群,再用Redis搭建分布式Session,下面将一步步分享我摸索的过程。

    Nginx虽然小,但是功能方面确实非常的强大,支持反向代理,负载平衡,数据缓存,URL重写,读写分离,动静分离等方面。下面最要说一下负载均衡的配置,下一篇将试验与Redis的结合。

Nginx负载均衡调度的方法

     Nginx的负载均衡模块upstream模块主要支持如下4中调度算法:

     1、服务器轮询(默认方式):每个请求访问按照时间顺序逐一分配到不同的服务器端,如果后端某台服务器宕机时,故障系统会被自动的剔除,使用户访问不受           影响。Weight(权重)指定轮询的权值,Weight值越大,分配到的访问几率越高,主要用于服务器端性能不均的情况下。

     2、ip_hash:每个请求按照访问的IP的Hash值进行分配,这行来自同一个IP的用户将会固定到后端的一个服务器,固定服务器后可以有效的解决网页存在的                   session共享的问题。

    

     3、fair:该算法可以根据页面大小和加载时间长短智能的进行决策负载均衡,即根据后端服务器的响应时间来分配请求,响应时间段的优先分配。Nginx本身未集           成fair模块,如果需要该调度算法,必须下载Nginx的upstream_fair模块,然后在config中配置加载。

     4、url_hash:此调度算法是根据访问的url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步的提高后端服务器的效率。Nginx本身未集成            该模块,如果使用需安装Nginx的hash包,并编译加载到nginx。

Nginx的upstream模块支持的状态参数

    在http的upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。通常设置的状态参数如下:

   1、down:表示当前的server暂时不参与负载均衡。

   2、backup:预留的备份服务器。当其他的所有非backup机器出现故障或者忙的时间,才会请求backup服务器,因此这台服务器的压力最轻。

   3、max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。

   4、fail_timeout:在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。

   注:当负载均衡调度算法使用ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。

Nginx的参数配置以及说明

    

#user  nobody;
worker_processes  2;

error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


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

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    gzip  on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_vary on;


    upstream andy {
		server 192.168.1.110:8080 weight=1 max_fails=2 fail_timeout=30s;
		server 192.168.1.111:8080 weight=1 max_fails=2 fail_timeout=30s;
        ip_hash;
    }

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

	location /andy_server {
	    proxy_next_upstream http_502 http_504 error timeout invalid_header;
	    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_pass http://andy; #此处proxy_pass定义的name需要跟upstream 里面定义的name一致
	    expires      3d;
		
	   #以下配置可省略
	   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;
	}

        error_page  404              /404.html;
		
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

}

注释:详细的配置解释查看上一篇。

Nginx负载均衡测试

     

      现在在192.168.1.110上部署的是Nginx,192.168.1.110和192.168.111上部署的tomcat服务器。

      1、当打开http://192.168.1.110/andy_server/ 时,Nginx负载集群采用默认方式时,每次都会轮询服务器。

            如下:

                  

          此种方法不能够解决集群的session问题。       

    

       2、当采用ip_hash时,刷新一直是固定的服务器

             

         这种方式解决了session问题,如果192.168.1.110服务器宕机掉的话,Nginx会将请求转到未宕机的服务器上面(经测试,将192.168.1.110服务器shutdown,再此请求会跳转      到192.168.1.111服务器)。但是也存在个问题,当hash到的服务器宕机,Nginx调到另一个服务器,自然session会丢失。

    3、剩余的两种安装Nginx所需对应的模块,和上面同理就不在测试。

    

总结

      无论是采用哪种负载均衡方式,都会出现session丢失问题。要解决该问题,要对session单另存放,无论是存库,文件,还是分布式内存服务器存放,是集群搭建必不可少的。下篇将测试并解决session问题

版权声明:本文为博主原创文章,未经博主允许不得转载。

以上就介绍了Nginx+Tomcat做负载平衡,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn