下面是详细讲解“LINUX中NGINX反向代理下的TOMCAT集群(详解)”的完整攻略。
简介
本篇攻略主要介绍在Linux系统中使用Nginx作为反向代理实现Tomcat集群的方法。
环境
- 操作系统: CentOS 7
- Nginx 1.16.1
- Tomcat 8.5.40
实现步骤
- 安装Nginx,可以使用yum命令进行安装:
yum install nginx
- 配置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;
}
}
}
“`
- 配置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
属性值必须不同,如tomcat1
和tomcat2
。
–<Membership>
标签中address
属性不能重复,最好使用组播地址,数据包最好能够在整个网段中广播,此处使用228.0.0.4
。
–<Channel>
标签中的address
属性必须为auto
–<Receiver>
标签中的port
属性要不同,以便避免冲突。
–<Sender>
标签中的className
必须为org.apache.catalina.tribes.transport.ReplicationTransmitter
。
–<Context>
标签中的内容是配置需要多实例共享的web context,需要添加到文本中。
- 最后重启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
属性值上保持唯一。