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集群解决均衡负载及生产环境热部署的更多相关文章
- Tomcat6+nginx集群,达到负载均衡和session复制
nginx+tomcat做web项目集群,达到负载均衡.故障转移.session复制功能. 1.nginx配置文件见上一篇“nginx配置文件(反向代理+集群+动静分离)” 2.tomcat集群,修改 ...
- 5 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之生产环境下drbd裂脑处理
preface 公司的业务变更,导致服务器要搬迁,所以需要关闭服务器,然后到新地在开启服务器. 关机前确定drbd+heartbeat+mysql是正常使用的,没有异常,Heartbeat和drbd都 ...
- Tomcat集群,Nginx集群,Tomcat+Nginx 负载均衡配置,Tomcat+Nginx集群
Tomcat集群,Nginx集群,Tomcat+Nginx 负载均衡配置,Tomcat+Nginx集群 >>>>>>>>>>>> ...
- Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享
Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享 ============================= 蕃薯耀 2017年11月27日 http: ...
- Apache反向代理结合Tomcat集群来实现负载均衡(一)、概念理解
好的博文一般都能做到"望题知文",看下标题就知道下边要讲的内容,写这个标题时犹豫了一下,本来要将标题定位apache+tomcat实现负载均衡,但是又认为这样显得比較模糊.后来想了 ...
- nginx 集群
Nginx是什么? Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器.一直纳闷这个X是怎么来 ...
- linux 下nginx 集群CAS单点登录实现
1.单点登录服务器CAS应用配置于tomcat下. 1)key生成: keytool -genkey -alias mycas -keyalg RSA -keysize 2048 -keystore ...
- nginx集群配置
一.nginx集群目标 以nginx作为代理服务器,分别在两台部署web站点的机器上面轮询访问. 3台机器IP地址分别为: 1)192.168.189.133 (nginx代理服务器) 2)192 ...
- Nginx集群配置与redis的session共享策略
一.什么是Nginx? Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Ramb ...
随机推荐
- android上的i-jetty (1)环境搭建
介绍下如果把android设备作为一个web服务器使用, 编译i-jetty 1. 将源码download下来,http://code.google.com/p/i-jetty/downloads/l ...
- MEAN 26
MEAN 纸质书,第26章内容,使用社交媒体账户作为身份验证来源 先不看. 功能:登录,注册 或者 用户,身份认证和会话管理 功能描述:用户注册,登录,查看,编辑信息,logout. 1.expres ...
- Python自动化开发 - 流程控制
一.拾遗主题 1.变量 理解变量在计算机内存中的表示 >>> a = "ABC" Python解释器干了两件事情: 在内存中创建了一个'ABC'的字符串: 在内存 ...
- petaPoco
petaPoco出现在2011年...因此老鸟可忽略该贴...目前最新版是 5.0, 但核心文件变化不大. 在众多的ORM框架中, 其中不乏非常优秀的EF, 但今天仍然想写点关于PetaPoco的文字 ...
- linux常用命令(二)文件上传下载及软件安装
1.上传下载工具安装 (1)WINDOWS 到linux的文件上传及下载: windows下打开secureCRT,通过SSH连到⾄至远程linux主机:上传下载工具安装命令:yum -y insta ...
- fcitx、ibus、scim
我觉得还是小企鹅fcitx好用点,兼容性好.速度快.配置简单. 在debian stable下,ibus用apt-get install完以后根本就不出现. scim倒是不用配置自己出来了,但是问题多 ...
- MS SQL的某一数据库成了Single User模式
数据库恢复失败,原来的数据却变成了 当尝试打开数据库的属性,即出现上面图片异常的信息. 正常来说,是可以打开数据库的属性 此刻,你可以运行SQL语句来解决: USE master; GO ALTER ...
- 背水一战 Windows 10 (45) - 控件(图标类): IconElement, SymbolIcon, FontIcon, PathIcon, BitmapIcon
[源码下载] 背水一战 Windows 10 (45) - 控件(图标类): IconElement, SymbolIcon, FontIcon, PathIcon, BitmapIcon 作者:we ...
- 201621123018《Java程序设计》第6周学习报告
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 2. 书面作业 1. clone方法 1.1 在 ...
- CodeForces - 940C + CodeForces - 932B (两道比较好的模拟题)
940C链接:http://codeforces.com/problemset/problem/940/C C. Phone Numbers time limit per test 2 seconds ...