Tomcat 集群是当单台服务器达到性能瓶颈,经过横向扩展的方式提升总体系统性能的有效手段。Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,能够经过简单的配置实现 Tomcat 集群的负载均衡。css
本文使用的 Tomcat 是 8.5.35 版本,Nginx 是 1.14.2 版本。接下来看下配置的过程以及可能会遇到的问题,首发于微信公众号「顿悟源码」。html
对于 Web 应用来讲,集群最大的问题就是 Session 信息的共享,通常有如下解决方法:nginx
在配置 Nginx 的过程当中,可能会遇到如下问题:web
taskkill /fi "imagename eq nginx.exe" /f
在配置 Tomcat 集群的过程当中,须要注意的问题:数据库
Nginx 使用的是默认配置,添加和修改的核心配置以下:apache
http { ... #gzip on; #设置负载均衡的服务器列表和权重 upstream tomcat-ha { #ip_hash; server 172.31.1.41:8080 weight=1; server 172.31.1.42:8080 weight=1; } server { listen 8000; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; #转发请求 proxy_pass http://tomcat-ha; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } ... } }
启用集群配置,在 <Engine> 元素中添加如下配置:windows
<!-- channelSendOptions=6 同步复制 --> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6"> <!-- 集群 Session 管理器 --> <Manager className="org.apache.catalina.ha.session.BackupManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true" mapSendOptions="6"/> <!-- <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> --> <!-- 集群内部通讯配置 --> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="192.168.10.2" port="5000" selectorTimeout="100" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/> </Channel> <!-- 此 vavle 拦截请求,并将 Session 信息发给内部节点 --> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
简单描述下工做原理:浏览器
修改 tomcat-benchmark 部署描述符文件中的 context-param 为 "I'm Tomcat 1/2" 用于区分两个 Tomcat,启动 Nginx 和 Tomcat,在浏览器访问 172.31.1.42:8080 能够看到请求在两个服务器间切换:缓存
为了方便理解,这里先把 Nginx 的负载均衡策略设置成 ip_hash:tomcat
整个过程以下:
动图正好与上述描述的相反,能够看到 Session 信息从 Tomcat2 复制到了 Tomcat1 中。
搜索微信号「顿悟源码」,回复「Tomcat」后,可获取本文测试使用的工程以及 Nginx 和 Tomcat 的配置文件。