nginx+tomcat负载均衡(含session共享)

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/ydzwV3http://localhost:8289/ydzwV3http://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这种方式,固定访问后端服务器。

参考

参考1:Nginx+Tomcat实现负载均衡( https://blog.csdn.net/dylanzr/article/details/52135196
参考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


猜你喜欢

转载自blog.csdn.net/u012383839/article/details/79801105