Nginx+Tomcat负载平衡

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的参数配置以及说明

    

[plain] view plain copy
  1. #user  nobody;  
  2. worker_processes  2;  
  3.   
  4. error_log  logs/error.log;  
  5. error_log  logs/error.log  notice;  
  6. error_log  logs/error.log  info;  
  7.   
  8. #pid        logs/nginx.pid;  
  9.   
  10.   
  11. events {  
  12.     worker_connections  1024;  
  13. }  
  14.   
  15.   
  16. http {  
  17.     include       mime.types;  
  18.     default_type  application/octet-stream;  
  19.   
  20.     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
  21.                       '$status $body_bytes_sent "$http_referer" '  
  22.                       '"$http_user_agent" "$http_x_forwarded_for"';  
  23.   
  24.     access_log  logs/access.log  main;  
  25.   
  26.     sendfile        on;  
  27.     #tcp_nopush     on;  
  28.   
  29.     #keepalive_timeout  0;  
  30.     keepalive_timeout  65;  
  31.   
  32.     gzip  on;  
  33.     gzip_min_length 1k;  
  34.     gzip_buffers 4 16k;  
  35.     gzip_http_version 1.0;  
  36.     gzip_vary on;  
  37.   
  38.   
  39.     upstream andy {  
  40.         server 192.168.1.110:8080 weight=1 max_fails=2 fail_timeout=30s;  
  41.         server 192.168.1.111:8080 weight=1 max_fails=2 fail_timeout=30s;  
  42.         ip_hash;  
  43.     }  
  44.   
  45.     server {  
  46.         listen       80;  
  47.         server_name  localhost;  
  48.   
  49.         #charset koi8-r;  
  50.   
  51.         #access_log  logs/host.access.log  main;  
  52.   
  53.     location /andy_server {  
  54.         proxy_next_upstream http_502 http_504 error timeout invalid_header;  
  55.         proxy_set_header Host  $host;  
  56.         proxy_set_header X-Real-IP $remote_addr;  
  57.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  58.         proxy_pass http://andy; #此处proxy_pass定义的name需要跟upstream 里面定义的name一致  
  59.         expires      3d;  
  60.           
  61.        #以下配置可省略  
  62.        client_max_body_size        10m;  
  63.        client_body_buffer_size     128k;  
  64.        proxy_connect_timeout       90;  
  65.        proxy_send_timeout          90;  
  66.        proxy_read_timeout          90;  
  67.        proxy_buffer_size           4k;  
  68.        proxy_buffers               4 32k;  
  69.        proxy_busy_buffers_size     64k;  
  70.        proxy_temp_file_write_size 64k;  
  71.     }  
  72.   
  73.         error_page  404              /404.html;  
  74.           
  75.         error_page   500 502 503 504  /50x.html;  
  76.         location = /50x.html {  
  77.             root   html;  
  78.         }  
  79.     }  
  80.   
  81. }  

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

Nginx负载均衡测试

     Nginx+Tomcat负载平衡

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

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

            如下:

                  Nginx+Tomcat负载平衡Nginx+Tomcat负载平衡

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

    

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

             Nginx+Tomcat负载平衡

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

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

    

总结

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

相关推荐