当前位置: 首页 > 科技观察

注意这几点,轻松配置Nginx+Tomcat集群和负载均衡

时间:2023-03-20 22:00:30 科技观察

Tomcat集群是当单台服务器达到性能瓶颈时,通过横向扩展来提升系统整体性能的有效手段。Nginx是一个高性能的HTTP和反向代理Web服务器,可以通过简单的配置实现Tomcat集群的负载均衡。本文使用的Tomcat是8.5.35版本,Nginx是1.14.2版本。下面我们就来看看配置过程以及可能遇到的问题。首发于微信公众号“启蒙源码”。1.概述对于web应用来说,集群安全的问题在于Session信息的共享。一般有以下解决方案:使用粘性会话,例如使用IPHash负载均衡策略,将当前用户请求集中到一个缺点是单点故障,会话丢失使用Session复制,使用自带的Session复制策略与Tomcat同步会话信息到集群的各个节点;缺点是比较耗内存和带宽,适用于小型集群。三方缓存中间件缓存了整个集群的session信息,比如Redis缓存,可以控制应用与Session的关联,也可以适配Tomcat。当然,会话信息也可以存储在共享文件系统或数据库中。在配置Nginx的过程中,你可能会遇到以下问题:配置upstream名称时不要使用下划线,比如tomcat_ha,否则Tomcat会抛出Thecharacter[_]isnevervalidinadomainname的异常killallnginx.exe进程在windows上,taskkill/fi"imagenameeqnginx.exe"/f在windows上有一个pid为4的系统进程会占用80端口,所以这里把nginx改成8000。在配置Tomcat集群的过程中,需要注意的问题:确保web.xml配置元素保证ContextManager不会被标准的sessionmanager替换Receiver.address不要配置为auto,因为默认可能绑定到127.0.0.1;receiver.port可以改也可以不改,tomcat会检测4000-4100范围内的可用端口,自动处理冲突如果在不同的服务器,需要关闭防火墙或者打开端口,还有时间同步2、Nginx核心配置Nginx使用默认配置,新增和修改的核心配置如下:http{...#gzipon;#设置负载均衡服务器列表和权重upstreamtomcat-ha{#ip_hash;server172.31.1.41:8080weight=1;server172.31.1.42:8080w八=1;}服务器{listen8000;server_namelocalhost;#charsetkoi8-r;#access_loglogs/host.access.logmain;location/{roothtml;indexindex.htmlindex.htm;#forwardrequestproxy_passhttp://tomcat-ha$request_uri;proxy_set_headerHost$http_host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_headerX-Forwarded-Proto$scheme;}...}}3.Tomcat集群配置启用集群配置,在元素中添加如下配置:-->简述工作原理:nginx将请求转发给Tomcat1,request登录认证,创建session,生成cookie,在response返回前将session信息复制到Tomcat2,再次请求时,nginx将带有sessioncookie的请求转发给Tomcat2,Tomcat2发现在关联中有认证成功内部会话池Session对象,不再认证和返回请求资源4.验证负载均衡和会话复制4.1测试环境使用两台PC部署Tomcat,对应关系为:172.31.1.41-Tomcat1,172.31.1.42-Tomcat2部署基于使用Tomcat自带的SessionExample程序,结合Man编写一个tomcat-benchmarkweb应用tomcat自带的ager应用,查看部署应用的内部Session池4.2负载均衡修改tomcat-benchmark部署描述符文件中的context-param为“我是Tomcat1/2”用于区分两个Tomcat,启动Nginx和Tomcat,在浏览器中访问172.31.1.42:8000,可以看到请求跨服务器切换:4.3Session复制为了便于理解,先将Nginx负载均衡策略设置为ip_hash:假设Nginx始终将请求定位到Tomcat1上,然后在Tomcat1上创建一个session,并在session中添加一些属性,关闭Tomcat1模拟Fault,此时Nginx会把请求和之前的sessionCookie一起转发给Tomcat2,并查看Tomcat2上是否有Cookie关联的Session信息(JSESSIONID),如果有则表示复制成功。可以看到Session信息从Tomcat2复制到Tomcat1