LINUX中NGINX反向代理下的TOMCAT集群(详解)

  • Post category:Linux

下面是详细讲解“LINUX中NGINX反向代理下的TOMCAT集群(详解)”的完整攻略。

简介

本篇攻略主要介绍在Linux系统中使用Nginx作为反向代理实现Tomcat集群的方法。

环境

  • 操作系统: CentOS 7
  • Nginx 1.16.1
  • Tomcat 8.5.40

实现步骤

  1. 安装Nginx,可以使用yum命令进行安装:

yum install nginx

  1. 配置Nginx反向代理
    在Nginx配置文件/etc/nginx/nginx.conf中加入以下内容:

“`
http {
upstream tomcat_cluster{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}

   server {
       listen 80;
       server_name www.example.com;

       location / {
           proxy_pass http://tomcat_cluster;
       }
   }

}
“`

  1. 配置Tomcat集群
    在Tomcat的conf目录下的server.xml文件中,添加以下内容:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<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="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
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.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif;.*\.jpg;.*\.png;.*\.js;.*\.css.*"
requestURIEncooding="UTF-8"
requestAttributesEnabled="true"
errorOnFailedRepliation="true"
/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<ReplicationListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<Context>
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
<!-- 在这里添加对应的context -->
</Context>
</Cluster>
</Engine>

这里假设有两个Tomcat实例。需要修改以下内容:
<Engine>标签中的jvmRoute属性值必须不同,如tomcat1tomcat2
<Membership>标签中address属性不能重复,最好使用组播地址,数据包最好能够在整个网段中广播,此处使用228.0.0.4
<Channel>标签中的address属性必须为auto
<Receiver>标签中的port属性要不同,以便避免冲突。
<Sender>标签中的className必须为org.apache.catalina.tribes.transport.ReplicationTransmitter
<Context>标签中的内容是配置需要多实例共享的web context,需要添加到文本中。

  1. 最后重启Nginx和Tomcat即可:

systemctl restart nginx
systemctl restart tomcat

示例

示例1

环境搭建和配置成功后,访问http://www.example.com,得到的是Tomcat节点1返回的网页;此时关闭Tomcat节点1,再次访问http://www.example.com,得到的是Tomcat节点2返回的网页。

示例2

由于Tomcat可以实现Session共享,我们可以使用示例2进行验证。

  • 在Tomcat节点1上访问http://www.example.com/test.jsp,保存一些Session内容。
  • 刷新页面,确保Session内容没有丢失。
  • 关闭Tomcat节点1。
  • 在Tomcat节点2上访问http://www.example.com/test.jsp,可以发现之前保存的Session内容仍然存在。

注意事项

  • 在多实例共享相同web context时,需要注意web.xml文件中的内容。
  • 配置组播地址和端口时,需要保证网段内没有其他使用相同地址和端口的应用。
  • 在Nginx配置文件中location后的/不能省略,否则可能导致HTTP响应码502。
  • 需要在jvmRoute属性值、Membership标签的address属性值、Receiver标签的port属性值上保持唯一。