使用nginx和tomcat配置负载均衡 | 张扎瓦的博客

使用nginx和tomcat配置负载均衡

本文介绍了使用nginx和tomcat配置简单的负载均衡


背景

做开发的常常会遇到这样一个问题:项目上线了,而后续又需要添加新功能,常常是把服务停掉,将新功能部署到服务器上,再重启服务器。这样会导致服务一段时间不可用,能不能不停服务器把新功能更新呢?

说明

我们可以使用nginx和多个tomcat实现这样的效果,当需要部署新功能时,可以先停掉一个tomcat进行部署,此时如果有客户端进行请求,nginx会自动将请求转发到运行的tomcat中。等部署完成后再启动,nginx检测到服务可用时,就会自动将请求转发到正常运行的tomcat中。这样就完成了不停机更新。

正常

部署

准备

安装Nginx

nginx安装方式有好多种,我这里偷个懒,使用oneinstack一键安装脚本进行安装。如果你对这个感兴趣,可以到这里去看看。安装过程很简单,执行脚本后,就可以自动安装上。

安装tomcat

tomcat是不用进行安装的,直接解压就可以使用,可以从tomcat官网获取需要的版本。在Linux下使用wget下载。

1
2
3
wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.32/bin/apache-tomcat-8.5.32.tar.gz
# 解压
tar -zxvf apache-tomcat-8.5.32.tar.gz

将tomcat复制两份,我放到/usr/local下,这个位置大家可以随意放置

1
2
cp -r apache-tomcat-8.5.32 /usr/local/tomcat1
cp -r apache-tomcat-8.5.32 /usr/local/tomcat2

修改tomcat2的端口号,否则无法启动两个tomcat。将conf/service.xml中的 8005 8080 8009 分别修改成其他的端口号,比如 8006 8081 8010。

为了方便看效果,修改tomcat中的webapps/ROOT/index.jsp,在其中加入如下代码

1
<h1>tomcat1</h1>

tomcat2类似。这样tomcat就配置好了。分别启动两个tomcat进行访问测试。

tomcat1

tomcat2

如果浏览器无法访问,请检查防火墙是否阻止了端口。

Nginx配置

编辑nginx的配置文件nginx.conf,在http{}中加入如下配置:

1
2
3
4
upstream test {
server 127.0.0.1:8080; #tomcat1访问地址
server 127.0.0.1:8081; #tomcat2访问地址
}

server{}中加入如下配置:

1
2
3
4
5
location / {
root html;
index index.html index.htm index.jsp;
proxy_pass http://test;
}

然后重启nginx

1
/usr/local/nginx/sbin/nginx -s reload

此时再次访问的时候,就可以看到效果了。多次刷新页面,可以看到tomcat1和tomcat2互相切换,这样简单的负载均衡就配置好了。

负载均衡策略

轮询

默认的配置,请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕掉,能自动剔除。

1
2
3
4
upstream test {
server 127.0.0.1:8080; #tomcat1访问地址
server 127.0.0.1:8081; #tomcat2访问地址
}

最少连接

请求会转发到连接最少的服务器上处理

1
2
3
4
5
upstream test {
least_conn;
server 127.0.0.1:8080; #tomcat1访问地址
server 127.0.0.1:8081; #tomcat2访问地址
}

weight 权重

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况,weight默认是1。

1
2
3
4
5
upstream test {
# 服务器A和服务器B的访问比例为:2-1;比如有3个请求,前两个会访问A,三个访问B,其它规则和轮询一样
server 127.0.0.1:8080 weight=2; #tomcat1访问地址
server 127.0.0.1:8081; #tomcat2访问地址
}

ip_hash

每个请求按访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一服务器进行处理,可以解决session的问题。

1
2
3
4
5
upstream test {
ip_hash;
server 127.0.0.1:8080; #tomcat1访问地址
server 127.0.0.1:8081; #tomcat2访问地址
}

url_hash(第三方)

url_hash是nginx的第三方模块,nginx本身不支持,需要打补丁。

nginx按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器、文件服务器、静态服务器时比较有效。缺点是当后端服务器宕机的时候,url_hash不会自动跳转的其他缓存服务器,而是返回给用户一个503错误。

1
2
3
4
5
upstream nginxDemo {
hash $request_url;
server 127.0.0.1:8080; #tomcat1访问地址
server 127.0.0.1:8081; #tomcat2访问地址
}

fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

1
2
3
4
5
upstream nginxDemo {
fair;
server 127.0.0.1:8080; #tomcat1访问地址
server 127.0.0.1:8081; #tomcat2访问地址
}
如果我的文章对您有所帮助,不妨打赏一杯豆浆以资鼓励(○` 3′○)