0、基本信息
Tomcat8.0.37、JDK1.7.0_79-b15、Nginx1.9.13、CentOS7.0
1、需要实现的效果
需要实现的效果(单台服务器):
1、使用Nginx实现负载均衡
2、使用多个Tomcat作为应用服务器
3、静态资源从Tomcat中分离
Nginx端口为8080,反向代理3个Tomcat(8288、8289、8290)。
2、在Linux下安装Nginx
具体安装过程参见以下链接:
nginx安装路径:/usr/local/nginx
3、在Linux下安装Tomcat及配置
单个Tomcat的安装过程:
# 解压 注意:不要使用windows版的tomcat复制到Linux下运行,否则会有你想不到的事情!!!
tar -zxf apache-tomcat-8.0.37.tar.gz
# 给sh文件添加可执行权限
cd apache-tomcat-8.0.37/bin
chmod x+ *.sh
# 启动tomcat
./startup.sh
安装后的Tomcat信息:
tomcat1 | tomcat2 | tomcat3 | |
版本 | 8.0.37 | 8.0.37 | 8.0.37 |
安装路径 | /home/software/tomcat1 | /home/software/tomcat2 | /home/software/tomcat3 |
端口信息 | SHUTDOWN 8005 HTTP 8288 AJP 8009 |
SHUTDOWN 8006 HTTP 8289 AJP 8010 |
SHUTDOWN 8007 HTTP 8290 AJP 8011 |
管理账号 | admin/admin@woyi1 | admin/admin@woyi2 | admin/admin@woyi3 |
Tomcat性能优化配置(server.xml):
<!-- 启用APR生命周期监听器,且不使用SSL -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
<!-- 创建执行器(线程池),指定线程数量 -->
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="1000" minSpareThreads="100"
maxIdleTime="60000"/>
<!-- Connector中使用线程池 -->
<Connector executor="tomcatThreadPool"
port="8290" protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="30000" redirectPort="8443" URIEncoding="UTF-8" enableLookups="false"
connectionUploadTimeout="150000" acceptCount="300" keepAliveTimeout="120000"/>
注意:这里Tomcat配置了APR模式,
Tomcat配置APR模式详细配置过程参见以下链接:
3、Nginx负载均衡配置
这里以公司移动门户项目为例(登录时验证码放在session里面,登录后才能进入到首页)。
在http节点下配置如下:
# 使用默认策略,轮询
upstream ydzwV3{
# 下面介绍几种负载均衡策略,其中轮询、weight、ip_hash是nginx内置的,可以直接使用。fair和url_hash需要第三方支持才可以使用。
# 1、轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
server localhost:8288;
server localhost:8289;
server localhost:8290;
# 2、weight:指定权重,按照权重进行请求的分配。wight和访问比例成正比,适合后端服务器性能不均的情况。
# 下面的配置就会经常访问8288的服务。如果后端服务器8288 down掉,能够立刻切换到8299或者8290。如果8288再次启动,则又能回到原有的权重配置上。8288可以继续提供服务。
# server localhost:8288 weight=10;
# server localhost:8289 weight=1;
# server localhost:8290 weight=1;
# 3、ip_hash:每个请求按照ip的hash结果进行分配,这样的话每个访客固定请求一个后端服务器,可以解决session没共享的问题。
# 如果8288 down掉,则依然可以访问,可能会缓存8289或者8290。如果8288启动,则会从8289或8290切换到8288。
# ip_hash;
# server localhost:8288;
# server localhost:8289;
# server localhost:8290;
# 4、fair(第三方):后端服务器响应时间短的优先分配。
# fair;
# server localhost:8288;
# server localhost:8289;
# server localhost:8290;
# 5、url_hash(第三方):按访问的url的hash结果来分配请求,这样相同url会分配到相同的后端服务器。适合后端服务器有缓存的情况。
# hash $request_uri;
# hash_method crc32;
# server localhost:8288;
# server localhost:8289;
# server localhost:8290;
}
在server节点下配置如下:
listen 8080;
server_name 192.168.1.233; # 这里是服务器的IP或者域名
location /ydzwV3 {
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_pass http://ydzwV3;
}
所以结果是怎样呢?
访问http://192.168.1.233:8080/ydzwV3实际上会把负载分摊到后面的3个Tomcat服务器,也就是说访问
http://192.168.1.233:8080
/ydzwV3可能是http://localhost:8288/ydzwV3、http://localhost:8289/ydzwV3或http://localhost:8290/ydzwV3给与的响应。
存在的问题:Session没有共享
一个典型的情况:假设进入登录页面是tomcat1基于的响应,所以验证码也会存储在tomcat1的session中。现在输入完用户名、密码和验证码,单击提交,很大可能会提示“验证码错误”,这是因为执行登录请求可能访问的是tomcat2或者tomcat3。
所以需要去做Session共享(当然也可以使用ip_hash策略来解决这个问题)。
4、Tomcat Session共享配置
这一块单独编写,请参考如下链接:
5、结果
经过上述配置后,访问tomcat1后,将tomcat1关闭,然后刷新页面,项目依然能就够切换到其它tomcat上,并且当前用户的session信息仍然保留。
6、一些想法
1、实际应该采用何种负载均衡策略?
weight方式适合后端服务器性能不均的情况。轮询与ip_hash相比,个人偏向于使用
i
p_hash这种方式,固定访问后端服务器。
参考
参考2:Nginx简单介绍以及linux下使用Nginx进行负载均衡的搭建(https://blog.csdn.net/liboyang71/article/details/77371595)
参考3:使用nginx搭建集群tomcat8,redis实现session共享,文件共享问题(https://blog.csdn.net/hua1586981/article/details/78132710)
参考4:Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享(https://blog.csdn.net/u012702547/article/details/72991283?utm_source=tuicool&utm_medium=referral)