Tomcat学习总结(8)——Tomcat+Nginx集群解决均衡负载及生产环境热部署

近日,为解决生产环境热部署问题,决定在服务器中增加一个tomcat组成集群,利用集群解决热部署问题。

这样既能解决高并发瓶颈问题,又能解决热部署(不影响用户使用的情况下平滑更新生产服务器)问题。

因为项目是前后端分离的,所以本以为成本很低,没想到遇到了一系列的坑,解决了2天才搞定,发现了很多不是集群而是项目本身的问题。

我是同一个服务器下配置tomcat和nginx等,本文主要面向有一定基础的读者,基本配置就不在本文累述了(基础问题可以留言或者发邮件)。

0x0_1 服务器环境

服务器: CentOS 6.5

web容器:Tomcat 7.0.25

反向代理:Nginx 1.8

java: jdk 1.7

0x0_2 集群

我是同一个服务器部署两个tomcat,所以地址是127.0.0.1 也可以换成其他服务器的ip

tomcat文件名 ip地址 端口 项目名
tomcat7-1 127.0.0.1 8080 borrow
tomcat7-2 127.0.0.1 8090 borrow

0x1 tomcat集群配置

修改tomcat的conf/server.xml 如下

tomcat7-1:

<Server port="8005" shutdown="SHUTDOWN"><Connector port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"

URIEncoding="UTF-8"

compression="on"

compressionMinSize="2048"

noCompressionUserAgents="gozilla,traviata" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" /><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />123456789123456789

tomcat7-2:

<Server port="8015" shutdown="SHUTDOWN"><Connector port="8090" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"

URIEncoding="UTF-8"

compression="on"

compressionMinSize="2048"

noCompressionUserAgents="gozilla,traviata" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" /><Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />123456789123456789

以上配置,只有端口号(port)是必要配置,其他按平常配置即可,多个tomcat以此类推。

创建测试页面

自己分别在tomcat中创建测试页面,可以区分不同的tomcat服务器即可

<table align="centre" border="1">

<tr>

<td>Tomcat7_1 Session ID</td>

<% session.setAttribute("www.zemo.com","www.zemo.com"); %>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created on</td>

<td><%= session.getCreationTime() %></td>

</tr></table>12345678910111234567891011

启动2个tomcat,确认都启动了即可。

0x2 nginx均衡负载配置

这里使用ip_hash 集群方式,尽量分流。但是如果是同一个局域网下用户大量访问就没有用了,不过可以再增加其他的措施,比如缓存session,因为这里主要是为了解决热部署问题, 所以都不是问题。

upstream borrow {

ip_hash;

server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=20s;

server 127.0.0.1:8090 weight=1 max_fails=3 fail_timeout=20s;

}

server {

listen 80;

server_name www.zemo.com;#这个是随便写的...不用访问了

access_log /usr/local/var/log/nginx/borrow_access.log;

location / {

proxy_redirect off;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

client_max_body_size 20m;

client_body_buffer_size 128k;

proxy_connect_timeout 600;

proxy_send_timeout 600;

proxy_read_timeout 900;

proxy_buffer_size 4k;

proxy_buffers 4 32k;

proxy_busy_buffers_size 64k;

proxy_temp_file_write_size 64k;

proxy_pass http://borrow; #这里borrow 指向上面名为borrow的upstream

}

}123456789101112131415161718192021222324252627123456789101112131415161718192021222324252627

  • weight 访问权重
  • max_fails 最大失败次数
  • fail_timeout 最大失败等待时间

测试配置是否正确

zemochen:Program SuperZemo$ sudo nginx -t

nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok

nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful123123

重启nginx

zemochen:Program SuperZemo$ sudo nginx -s reload11

观察tomcat的session

  • 先访问以下www.zemo.com
  • 关闭tomcat7_1,只留tomcat7_2观察session id
  • 开启tomcat7_1,关闭tomcat7_2观察session id

你会发现两个session id,下面讲解tomcat 的session共享

0x3 tomcat session共享

0x3_1 server.xml配置

tomcat 有自带复制session功能,在server.xml中增加<Cluster> 配置即可,不知道写在哪里的,找到server.xml中的<Cluster>注释样例,写在下面即可。基本上就是写在<Host></Host>里面最后就行了。配置如下:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6">

<Manager className="org.apache.catalina.ha.session.BackupManager"

expireSessionsOnShutdown="false"

notifyListenersOnReplication="true"

mapSendOptions="6"/>

<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="127.0.0.1" <!--这里写本tomcat的IP地址 -->

port="5000"

selectorTimeout="100" /> <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"/>

<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>

</Channel>

<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>

<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"

tempDir="/tmp/war-temp/"

deployDir="/tmp/war-deploy/"

watchDir="/tmp/war-listen/"

watchEnabled="false"/>

<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/></Cluster>12345678910111213141516171819202122232425262728293031321234567891011121314151617181920212223242526272829303132

修改server.xml 中的<Engine> 增加jvmRoute="tomcat7-1",配置如下:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7-1">11

tomcat7-2同理,配置这两个。

0x3_2 web.xml配置

conf/web.xml中的<webapp></webapp> 中增加<distributable /> 我的项目是j2ee项目,所以写在了项目的web.xml 里,项目中的web.xml优先级高于tomcat本身的。

配置代码块如下:

<web-app>

<!--其他配置省略,下面mime-mapping 也是与本问无关,为了体现最下面所以带了一部分-->

<mime-mapping>

<extension>apk</extension>

<mime-type>application/vnd.android.package-archive</mime-type>

</mime-mapping>

<distributable /></web-app>1234567812345678

0x4 注意:

这里要注意,Nginx只需要配置一份,而tomcat有几个节点,server.xml 、web.xml就配置几个:

  • shutdown端口都不同
  • Connect 的http端口都不同
  • Ajp 端口不同
  • <Cluster> 中的<Receiver> 属性 address 指向改tomcat的IP地址
  • <Engine> 中的jvmRoute 名要与tomcat文件名相同

0x5 结果截图

整个环境全都启动后, 访问域名, 可以看到如下截图,我的图可以看出,访问到的是tomcat7-1,注意,我的测试网页并没有写tomcat7-1,而是自己加到session id里的,这里是自动增加jvmRoute的值,说明session复制成功…

因为刚才确定被代理到了tomcat7-1,我们用的是ip_hash的分配方式,所以我们直接关闭tomcat7-1,再刷新页面,确保代理到另一个tomcat,效果图如下,可以看到只有后缀.tomcat7-2不同,至此一个均衡负载集群就可以了,既解决了热部署问题,又解决了分担服务器压力,负载均衡问题。

Tomcat学习总结(8)——Tomcat+Nginx集群解决均衡负载及生产环境热部署

时间: 2024-10-07 18:44:19

Tomcat学习总结(8)——Tomcat+Nginx集群解决均衡负载及生产环境热部署的相关文章

greenplum集群安装与增加节点生产环境实战

1.准备环境 1.1集群介绍 系统环境:centos6.5 数据库版本:greenplum-db-4.3.3.1-build-1-RHEL5-x86_64.zip greenplum集群中,2台机器IP分别是 [[email protected] ~]# cat /etc/hosts 127.0.0.1   localhost localhost.localdomain ::1         localhost localhost.localdomain localhost6 localhos

LVS+keeplived+nginx+tomcat高可用、高性能jsp集群

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://kerry.blog.51cto.com/172631/557749 #!/bin/bash # BY kerryhu # MAIL:[email protected] # BLOG:http://kerry.blog.51cto.com # Please manual operation yum of before Operation..... #yum -y install

Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享 ============================= 蕃薯耀 2017年11月27日 http://www.cnblogs.com/fanshuyao/ 代码美化版或附件下载见:http://fanshuyao.iteye.com/blog/2400975 一.Session共享使用tomcat-cluster-redis-session-manager插件实现 插件地址见:https://g

Tomcat+Nginx集群

# Tomcat+Nginx集群## Tomcat* 修改/etc/profile中的环境变量```export JAVA_HOME=/usr/java/jdk1.7.0_80export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME$/lib/tools.jarexport MAVEN_HOME=/home/developer/apache-maven-3.0.5export PATH=$PATH:

Nginx+Tomcat+Keepalived实现高可用web集群

Nginx+Tomcat+Keepalived实现高可用web集群: 环境:CenOS 6.5Nginx-Master:10.10.10.128Nginx-Backup:10.10.10.129Tomcat1:10.10.10.130Tomcat2:10.10.10.131VIP:10.10.10.100 一.环境基础配置1.更换国内yum源2.关闭防火墙.SELinux3.时间同步 二.Web端安装Web服务 1.查看是否安装JDK [[email protected] ~]# java -v

实践出真知——一文教你搭建Nginx+Tomcat集群,实现负载均衡及动静分离

实践出真知--一文教你搭建Nginx+Tomcat集群,实现负载均衡及动静分离 前言 ? 想必大家对于Nginx和Tomcat都非常熟悉了,Nginx的应用非常广泛,不仅是对web静态资源非常友好,而且也是非常实用的反向代理和负载均衡软件.结合后端Tomcat的服务,从而搭建Nginx+Tomcat集群. ? 对于直接想要实践的朋友而言可以获取本文的链接中的软件包后直接看第三备份的内容. 一.集群搭建结构及拓扑 1.1集群架构图示 Nginx+Tomcat集群的结构示意图如下: 1.2系统环境与

Apache反向代理结合Tomcat集群来实现负载均衡(一)

好的博文一般都能做到"望题知文",看下标题就知道下边要讲的内容,写这个标题时犹豫了一下,本来要将标题定位apache+tomcat实现负载均衡,可是又觉得这样显得比较模糊,后来想了一下,觉得利用Apache做负载均衡底层结合的是tomcat的集群功能,所以便用了这个标题. 首先先做下集群与负载均衡的概念区分,很多人一直都不理解这两个概念,不知道该如何区分这两个概念,又觉得这两个概念仿佛是一个技术的两个术语,其实不然,下边介绍下这两个概念: 什么是集群(Cluster) 所谓集群是指一组

Apache反向代理结合Tomcat集群来实现负载均衡(一)、概念理解

好的博文一般都能做到"望题知文",看下标题就知道下边要讲的内容,写这个标题时犹豫了一下,本来要将标题定位apache+tomcat实现负载均衡,但是又认为这样显得比較模糊.后来想了一下,认为利用Apache做负载均衡底层结合的是tomcat的集群功能.所以便用了这个标题. 首先先做下集群与负载均衡的概念区分,非常多人一直都不理解这两个概念,不知道该怎样区分这两个概念,又认为这两个概念仿佛是一个技术的两个术语,事实上不然,下边介绍下这两个概念: 什么是集群(Cluster) 所谓集群是指

Apache反向代理结合Tomcat集群来实现负载均衡(四)、Apache反向代理

上文中主要介绍了tomcat的集群方式,下边再来说下apache的反向代理.反向代理可以这样来理解,我们通常认为的代理(正向代理)是局域网内部机器本身不能上网,网关可以上网,大家在局域网内是通过网关上网的,这个网关就是个代理机器.反向代理意思就反了过来,现在网关并不是给内部局域网做代理的,而是给外部请求内部局域网做代理的,例如,当前一个应用系统在局域网内的A机器上,外部网络不能直接访问A机器,而是通过网关访问到了A,这里网关就是个反向代理了. 总结:正向代理---为在防火墙内的局域网客户端提供I