软件环境:
windows7
JDK 版本:jdk-8u151-windows-x64
apache-tomcat 版本:apache-tomcat-8.0.48-windows-x64
nginx 版本:nginx-1.13.8
既然是做负载均衡,那么至少需要两台tomcat服务器,为了方便测试,我是在一台电脑上部署两套tomcat,前端用nginx做反向代理。一台电脑上如何跑两个或者多个tomcat,我在下面会有说明。
首先,安装JDK,并配置好环境变量。
接下来,安装nginx。将下载下来的nginx-1.13.8.zip解压到硬盘,nginx的目录结构如下图:
打开nginx的配置文件(conf\nginx.conf),添加upstream,
upstream server_lb{
#Nginx是如何实现负载均衡的,Nginx的upstream目前支持以下几种方式的分配
#1、轮询(默认)
#每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
#2、weight
#指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
#2、ip_hash
#每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
#3、fair(第三方)
#按后端服务器的响应时间来分配请求,响应时间短的优先分配。
#4、url_hash(第三方)
#按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
#ip_hash;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
修改location
location / {
root html;
index index.html index.htm;
#添加如下3个配置后,当一台server宕机,切换速度会很快,此时配置是3秒
proxy_connect_timeout 3; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 30; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 30; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_pass http://server_lb;
}
这样nginx就配置好了。
接下来配置tomcat。首先要解决的问题是,如何在一台电脑上运行多个tomcat。将下载的tomcat安装包(apache-tomcat-8.0.48-windows-x64.zip)解压两份,分别命名为tomcat1和tomcat2。然后修改两个tomcat的server.xml(位于conf文件夹下)文件,使它们的端口号不同,修改的地方有以下几处:
<Server port="8005" shutdown="SHUTDOWN">
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8012" protocol="AJP/1.3" redirectPort="8443" />
这样配置完之后,两个tomcat就可以分别启动起来了。在这里可能会遇到的问题,是端口号被占用,解决方法是换一个端口号,或者释放掉占用这个端口号的进程。
这样nginx+tomcat的负载均衡就配置完成了。
下面还需要再解决一个问题,就是session共享的问题。这个有多种解决方案,整理如下。
1、使用tomcat的session复制。
2、使用Cookie存储session。
3、使用数据库存储session。
4、使用内存数据库存储session。内存数据库如Redis、Memcached等。
以上顺序并不是解决方案的优先级排序,实际使用中,我个人喜欢使用第四种,尤其是Redis解决方案。
这里采用的是第一种tomcat Cluster的方式来做session复制。
在server.xml中加入如下代码,
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
并且要保证每个tomcat的Engine的jvmRoute统一,tomcat1配置如下,
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
tomcat2配置:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
最后在web项目的web.xml文件中加入<distributable/>。
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Archetype Created Web Application</display-name>
<distributable/>
<!-- root key -->
至此就解决了session共享的问题。