Tomcat结合nginx实现负载均衡的配置方式

本文介绍了在Windows7系统上,利用Nginx作为反向代理,配合两台在同一台计算机上运行的Tomcat实例实现负载均衡。详细步骤包括JDK和Nginx的安装,Nginx配置文件的修改,以及解决session共享问题的四种方案,重点讲述了使用Tomcat Cluster进行session复制的方法。
摘要由CSDN通过智能技术生成

软件环境:

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共享的问题。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值