前言
Nginx和Tomcat的负载均衡配置 只能用http 协议 但是nginx的优秀性能 值得你去尝试
负载均衡
1 | upstream a_psvmc { |
Tomcat下多个项目配置
如果Tomcat下时多个项目该怎么配
先说一种错误配法
错误配法
Nginx配置同上
Tomcat中又配置了多个Host节点
1 | <Host name="a.psvmc.cn" appBase="webapps/aaa" unpackWARs="true" autoDeploy="true"> |
这样配置的话大部分情况下是没问题的,但是如果页面上有验证码的话 会生成两个SessionID,导致验证码不可用
正确的配法
Nginx中
1 | upstream a_psvmc { |
Tomcat中用默认的配置
1 | <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> |
注意
变动项有
1 | proxy_pass http://a_psvmc/test/; |
因为proxy_pass http://a_psvmc/test/;
访问http://a.psvmc.cn
,url会变成http://a.psvmc.cn/test/
,
cookie中的path会变成/test/
,proxy_cookie_path /test/ /;
会把cookie中的path改为/
,proxy_redirect /test/ /;
会吧url重定向到http://a.psvmc.cn
总结
当我们的直接访问Tomcat下的不同项目时,可以配置多个Host
但是如果我们是从Apache或者Nginx代理过来的,就使用默认配置就行了
情景
上面的例子用在 一台服务器上有两个tomcat
通过a.psvmc.cn访问进来的请求分摊在两个tomcat上,但是因为设置了黏性Session
所以只会访问一个服务器
建议每一个nginx配置都建一个nginx-vhosts-a.psvmc.cn.conf
文件 放在/etc/nginx/conf.d
目录下 这样方便管理
黏性Session的其它方式
Nginx配置类似Apache的黏性Session有很多方式
1)ip_hash(原生支持)
ip_hash使用源地址哈希算法,将同一客户端的请求总是发往同一个后端服务器,除非该服务器不可用。
ip_hash简单易用,但有如下问题:
当后端服务器宕机后,session会丢失;
来自同一局域网的客户端会被转发到同一个后端服务器,可能导致负载失衡;
不适用于CDN网络,不适用于前段还有代理的情况。
1 | upstream a_psvmc { |
2)其它方式
可以参看官方
两个Tomcat上的配置
TomcatA
1 | <Server port="8005" shutdown="SHUTDOWN"> |
TomcatB
1 | <Server port="9005" shutdown="SHUTDOWN"> |
注意点
0) 要修改tomcat的server.xml
添加jvmRoute="tomcat7_8080"
1 | <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7_8080"> |
jvmRoute="tomcat7_8080"
该配置在Apache做粘性Session
时时必要的
在Nginx中用ip_hash;
方式 就不需要
测试文件
我们可以在参与负载均衡或集群的项目下新建一个index.jsp的测试文件 文件代码如下
1 | <%@ page contentType="text/html; charset=UTF8" %> |
访问测试的网页 我们会发现SessionID: F342BA5723DBE6ACE4B3C21E4F34FE4F.tomcat7_8080
SessionID的后面都会显示我们在Tomcat的server.xml中配置的jvmRoute
所以上面我们配置的jvmRoute在真正部署的时候是不需要的,只是让我们测试是能比较容易的看出访问的是哪个服务器
- 如果只配置了负载均衡 我们会发现SessionID的.的前面和后面都会变化
- 如果只配置了负载均衡和粘性Session 我们会发现SessionID是不会变的,除非重启浏览器
- 如果配置了负载均衡和Session复制并且取消粘性Session 我们会发现SessionID变化的只会是.后面的jvmRoute
集群
如果设置Session复制,最好取消粘性Session,因为设置Session复制后,各个服务器上Session已经同步了,就没必要让同一个用户只访问一个服务器了
Session复制和粘性Session是集群的两种策略,各有利弊
如果参与集群的服务器过多就不建议用Session复制
使用粘性Session的话,用户访问的那台服务器崩溃的话,用户的Session就回丢失,不会故障转移
集群和负载均衡的区别就是集群包括Session复制和故障转移。
Session复制是广义的,实际上就是故障转移的时候,还可以继续读取这个用户的Session。
Session复制只是其中的一种方式,也可以采用Session服务器的方式。
Tomcat Session复制很简单 只需要两步
第一步
只需要把所有参与集群的Tomcat的配置文件server.xml中的一下配置取消注释就行了
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
这里使用的是默认配置,如果需要更详细的配置,可以参看官网
参与集群的服务器要在一个内网中,因为Tomcat的Session复制用的是组播
组播会导致网络风暴的问题,因此在公网上的交换机或者路由器通常将此功能禁止。
原则上,只要没有禁止,其功能和在局域网上一样。
第二步
在所有参与集群的项目中的web.xml中的web-app节点下添加<distributable/>
告诉Tomcat我要参加集群
如果项目没有web.xml
我们就在项目的根目录添加文件夹WEB-INF,再在文件夹下新建文件web.xml ,复制下面的配置
1 | <?xml version="1.0" encoding="UTF-8"?> |
就这样集群就配好了