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的参数配置以及说明
  1. #usernobody;
  2. worker_processes2;
  3.  
  4. error_loglogs/error.log;
  5. error_loglogs/error.lognotice;
  6. error_loglogs/error.loginfo;
  7.  
  8. #pidlogs/nginx.pid;
  9.  
  10.  
  11. events{
  12. worker_connections1024;
  13. }
  14.  
  15.  
  16. http{
  17. includemime.types;
  18. default_typeapplication/octet-stream;
  19.  
  20. log_formatmain'$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_loglogs/access.logmain;
  25.  
  26. sendfileon;
  27. #tcp_nopushon;
  28.  
  29. #keepalive_timeout0;
  30. keepalive_timeout65;
  31.  
  32. gzipon;
  33. gzip_min_length1k;
  34. gzip_buffers416k;
  35. gzip_http_version1.0;
  36. gzip_varyon;
  37.  
  38.  
  39. upstreamandy{
  40. server192.168.1.110:8080weight=1max_fails=2fail_timeout=30s;
  41. server192.168.1.111:8080weight=1max_fails=2fail_timeout=30s;
  42. ip_hash;
  43. }
  44.  
  45. server{
  46. listen80;
  47. server_namelocalhost;
  48.  
  49. #charsetkoi8-r;
  50.  
  51. #access_loglogs/host.access.logmain;
  52.  
  53. location/andy_server{
  54. proxy_next_upstreamhttp_502http_504errortimeoutinvalid_header;
  55. proxy_set_headerHost$host;
  56. proxy_set_headerX-Real-IP$remote_addr;
  57. proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;
  58. proxy_passhttp://andy;#此处proxy_pass定义的name需要跟upstream里面定义的name一致
  59. expires3d;
  60.  
  61. #以下配置可省略
  62. client_max_body_size10m;
  63. client_body_buffer_size128k;
  64. proxy_connect_timeout90;
  65. proxy_send_timeout90;
  66. proxy_read_timeout90;
  67. proxy_buffer_size4k;
  68. proxy_buffers432k;
  69. proxy_busy_buffers_size64k;
  70. proxy_temp_file_write_size64k;
  71. }
  72.  
  73. error_page404/404.html;
  74.  
  75. error_page500502503504/50x.html;
  76. location=/50x.html{
  77. roothtml;
  78. }
  79. }
  80.  
  81. }

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

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问题

http://www.kuqin.com/shuoit/20150824/347754.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值