巴拉巴拉
小魔仙

多个Tomcat服务器 + Nginx负载均衡

今天稍微的看了一下Nginx,并不算深入的了解,只是一个初步的配置入门,负载均衡在当下高并发和当某一个服务器突然宕机之后会展现它的作用。
Nginx是一个高性能的HTTP和反向代理服务器,那么什么是反向代理服务器呢。
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
以上内容摘自百度百科。
这里顺便简单的说一下Tomcat的一些简单的端口配置吧。

因为做测试的时候我本地开了两个tomcat,一个Tomcat6一个Tomcat7,因为他们的ROOT应用的界面不一样~方便参考。他们的端口号为了不冲突,所以其中一个tomcat需要修改一下。
conf-->server.xml文件中

<!-- 修改Shutdown端口(默认为8005端口)-->
<Server port="8005" shutdown="SHUTDOWN">

<!-- 修改http访问端口(默认为8080端口)设置UTF-8编码 -->
<Connector port="8080" protocol="HTTP/1.1"
		   connectionTimeout="20000"
		   redirectPort="8443" URIEncoding="UTF-8" />
		   
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

 

nginx下载地址: http://nginx.org/en/download.html

cd xxxx#到nginx目录
start nginx		启动nginx
nginx -t		检查nginx设置文件是否正确
nginx -s reload	重启nginx
nginx -s stop	停止nginx
nginx -s quit	退出nginx


启动nginx之后就已经可以在本地的浏览器访问http://localhost访问nginx的本地欢迎页了,前提是80端口没有被其他程序占用。

这时候我们来简单的设置一下nginx,进入conf-->nginx.conf

#首先找到一个类似这样的代码,中间省略了一部分。
server {
	listen       80;
	server_name  localhost;
	
	location / {
		root	html;
		index	index.html index.htm;
	}
}

#我们来简单的修改
server {
	listen       80;
	server_name  localhost;
	
	location / {
		root	html;
		index	index.html index.htm;
		proxy_pass http://localhost:8080;
	}
}

其实这个时候已经可以先执行nginx -t检查一下设置代码,然后再nginx -s reload来重启nginx了。

如果都没有出错的话,当我们访问http://localhost之后就会发现,访问的主页已经不是ngxin了,而是tomcat的ROOT应用。

当我们需要负载均衡,让两个tomcat同时运行,并且自动的跳转到两个不同的tomcat服务器上,我们需要修改一下设置。

#首先我们要先添加一个upstream ,这个是和server平行的。
#里面写了两个server,分别是他们的地址和端口
#后面的weight的参数是他们对应的的权值,数字越大,越有可能被访问到
upstream local_tomcat {
	server	localhost:8080 weight=1;
	server	localhost:8081 weight=2;
}
#我们修改server的location配置
#将里面的proxy_pass代理设置为刚刚我们添加的upstream地址
server {
	listen       80;
	server_name  localhost;
	
	location / {
		proxy_pass http://local_tomcat;
	}
}

这时候我们再来检查一下配置并重启nginx,如果还是运气好没有出错的话~多次访问http://locathost的话,就会发现tomcat加载的ROOT应用并不一样。

经过多次刷新,这个时候大家可能发现了一些问题,那就是有的时候访问的非常的卡顿,有的时候又很卡,甚至logo有的时候加载的是tomcat6的,有的时候加载的是tomcat7的,区别就在于那个TM标志。其实是因为,里面所有的请求都被nginx分配到了两个服务器下面了,包括静态文件。那么也就会造成两个请求的地址不一样的情况,比如我要找一个css,在tomcat6下的ROOT内是能找到的,但是在tomcat7下的ROOT是找不到的,那么就会造成404,所以就会卡顿了。

如果单独写一个Servlet来测试Nginx的话会发现,其实我们分配的weight参数是这样执行的:
比如我们两个地址的weight分配的都是1,我访问一次Servlet,第一次分配在第一个服务器,第二次请求必然会被分配到第三个服务器,第三次请求又回到了第一个服务器,也就是这样的平均分配。

我测试关闭了一台服务器,看看Nginx怎么处理, 但是Nginx好像并没有智能的吧我们的请求都直接转移到另一个正常的服务器,依旧会每隔次都会分配我们的请求去访问这个服务器。

在修改了如下的代码后正常:

location / {
	proxy_pass http://local_tomcat;
	proxy_connect_timeout       1;
	proxy_read_timeout          1;
	proxy_send_timeout          1;
}

添加了三个timeout的时间,我设置的是1s,但是我想应该在设置大一点的,毕竟我们的服务器访问情况不一定会非常的快,一两秒或者几秒的延迟可能还是会存在的,所以可以稍微设置大一点,但是太大也不太好。

为了解决多个服务器的Session共享问题也要考虑一下,因为我们的请求都被平均的分配到了多个服务器,那么势必Session会出现一些问题需要我们来解决。
1.将Session改用Cookie是一个办法,但是并不推荐。
2.Nginx有一个自带的方法,ip_hash 是通过hash计算你的IP,使你总是只请求固定的一个服务器。

upstream local_tomcat {
	server	192.168.1.40:8081 weight=1 max_fails=2 fail_timeout=30s;
	server	192.168.1.40:8080 weight=2 max_fails=2 fail_timeout=30s;
	ip_hash;
}

3.网上还提供了其他的方法,memcached缓存来做Session共享的策略。这里就没有详细的阐述了,我这里暂时也还没有研究这一实现的方式,等后续研究的话会追加内容。

现有问题:

  1. 多个tomcat服务器下的memcached方式session共享
  2. 静态文件的处理
  3. 权限的处理
赞(0) 打赏
如果文章对你有帮助,欢迎你来评价反馈。AgainFly » 多个Tomcat服务器 + Nginx负载均衡

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  • Q Q(选填)
  1. #0
    头像

    你的评论一针见血

    卖固体胶的4年前 (2016-06-24)回复

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏