本文主要介绍了Nginx + Tomcat负载均衡集群的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
正文
Nginx+Tomcat负载均衡集群的实现示例
引言
通常情况下,一个 tomcat 站点由于可能出现单点故障以及无法应付过多客户复杂多样的请求等问题,不能单独应用于生产环境中,所以需要一套更可靠的解决方案来完善 web 站点架构。
一、案例概述
nginx 是一款非常优秀的 http 服务器软件,它能够支持高达 50000 个并发连接数的响应,拥有强大的静态资源处理能力,运行十分的稳定,并且内存、cpu 等系统资源消耗非常低。
目前很多大型网站都应用 nginx 服务器作为后端网站程序的反向代理及负载均衡器,来提升整个站点的负载并发能力
案例由 nginx 作为负载均衡器,tomcat 作为应用服务器的负载集群的设置方法,架构图如下

二、环境部署
案例环境如下
| 主机 | 操作系统 | ip地址 | 主要软件 |
|---|---|---|---|
| nginx服务器 | centos 7.4 x86_64 | 192.168.8.140 | nginx-1.12.2.tar.gz |
| tomcat服务器1 | centos 7.4 x86_64 | 192.168.8.133 | ①apache-tomcat-9.0.16.tar.gz / ②jdk-8u201-linux-x64.rpm |
| tomcat服务器2 | centos 7.4 x86_64 | 192.168.8.134 | ①apache-tomcat-9.0.16.tar.gz / ② jdk-8u201-linux-x64.rpm |
关闭防火墙,关闭开机自启
|
1
2
3
4
|
[root@ng133 ~]#systemctl stop firewalld.service #关闭防火墙及开机自启功能[root@ng133 ~]#systemctl status firewalld.service[root@ng133 ~]#setenforce 0 #关闭安全增强系统[root@ng133 ~]#setenforce: selinux is disabled |
三、nginx 主机安装
安装 nginx 服务,这里用的一键部署脚本
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
#!/bin/bashiptables -fyum -y install epel-release && yum clean all && yum makecacheyum -y install pcre-devel zlib-devel gcc gcc-c++ make wgetuseradd -m -s /sbin/nologin nginxwget http://nginx.org/download/nginx-1.12.2.tar.gz -p /opttar zxvf /opt/nginx-1.12.2.tar.gz -c /optcd /opt/nginx-1.12.2./configure \--prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_stub_status_modulecd /opt/nginx-1.12.2make -j 4 && make installln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/cat > /usr/lib/systemd/system/nginx.service <<eof[unit]description=nginxafter=network.target[service]type=forkingpidfile =/usr/local/nginx/logs/nginx.pidexecstart=/usr/local/nginx/sbin/nginxexecrreload=/bin/kill -s hup $mainpidexecrstop=/bin/kill -s quit $mainpidprivatetmp=true[install]wantedby=multi-user.targeteofchmod 754 /usr/lib/systemd/system/nginx.servicesystemctl daemon-reload && systemctl start nginx.service && systemctl enable nginx.serviceecho " "pgrep "nginx" &> /dev/nullif [ $? -eq 0 ];then echo -e "\033[32mnginx服务运行正常,可 curl 查看\033[0m"else echo -e "\033[31mnginx服务运行异常,请检查\033[0m"fi |
安装完成后查看结果
|
1
2
3
4
5
6
7
8
9
10
|
[root@ng140 /opt/nginx-1.12.2]#curl -i http://192.168.8.140http/1.1 200 okserver: nginx/1.12.2date: fri, 15 oct 2021 01:46:17 gmtcontent-type: text/htmlcontent-length: 612last-modified: fri, 15 oct 2021 01:45:34 gmtconnection: keep-aliveetag: "6168dd3e-264"accept-ranges: bytes |

四、tomcat 安装及配置
1. 安装 tomcat
tomcat 服务器1与 tomcat 服务器2 配置方法基本相同
安装 jdk ,配置环境
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@tm1133 ~]#cd /opt/ #上传安装包到/opt 目录[root@tm1133 /opt]#lsapache-tomcat-9.0.16.tar.gz jdk-8u201-linux-x64.rpm [root@tm1133 /opt]#rpm -ivh jdk-8u201-linux-x64.rpm #安装export java_home=/usr/java/jdk1.8.0_201-amd64export classpath=.:$java_home/lib/tools.jar:$java_home/lib/dt.jar export path=$java_home/bin:$path[root@tm1133 /opt]#source /etc/profile.d/java.sh #将脚本导入到环境变量中,使其生效[root@tm1133 /opt]#java -version #查看版本java version "1.8.0_201"java(tm) se runtime environment (build 1.8.0_201-b09)java hotspot(tm) 64-bit server vm (build 25.201-b09, mixed mode) |
解包
|
1
2
|
[root@tm1133 /opt]#tar zxvf apache-tomcat-9.0.16.tar.gz #解包[root@tm1133 /opt]#mv apache-tomcat-9.0.16 /usr/local/tomcat #转移包位置并改名 |
启动并优化管理 tomcat(创建软连接,优化开启命令)
|
1
2
3
4
5
6
7
8
9
10
11
|
[root@tm1133 /opt]#ln -s /usr/local/tomcat/bin/startup.sh /usr/local/bin/[root@tm1133 /opt]#ln -s /usr/local/tomcat/bin/shutdown.sh /usr/local/bin/[root@tm1133 /opt]#startup.sh #开启using catalina_base: /usr/local/tomcatusing catalina_home: /usr/local/tomcatusing catalina_tmpdir: /usr/local/tomcat/tempusing jre_home: /usr/java/jdk1.8.0_201-amd64using classpath: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jartomcat started.[root@tm1133 /opt]#netstat -antp |grep 8080 #查看是否开启成功tcp6 0 0 :::8080 :::* listen 2520/java |
2. tomcat 服务器1配置
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
[root@tm1133 ~]#mkdir /usr/local/tomcat/webapps/gl #创建一个测试的目录[root@tm1133 ~]#vim /usr/local/tomcat/webapps/gl/index.jsp<%@ page language="java" import="java.util.*" pageencoding="utf-8"%> #动态页面的配置<html> <head><title>jsp test1 page </title></head><body><% out.println("动态页面 1,http://www.test1.com");%></body></html>#编辑tomcat主配置文件,添加虚拟主机配置,这里要先删掉原先的主机名等配置[root@tm2134 /opt]#vim /usr/local/tomcat/conf/server.xml -------------------------------------------------------------------------------------------------<host name="localhost" appbase="webapps" unpackwars="true" autodeploy="true"#找到这个先删掉,否则最后会出错-------------------------------------------------------------------------------------------------#在行尾162行处插入下面配置,需注意结尾的</host><host name="localhost" appbase="webapps" unpackwars="true" autodeploy="true" xmlvalidation="false" xmlnamespaceaware="false"> <context docbase="/usr/local/tomcat/webapps/gl" path="" reloadable="true" /></host>-------------------------------------------------------------------------------------------------[root@tm2134 /opt]#shutdown.sh [root@tm2134 /opt]#startup.sh #重启服务 |
3. tomcat 服务器2配置
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
[root@tm2134 /opt]#mkdir /usr/local/tomcat/webapps/gl #创建一个测试的目录[root@tm2134 /opt]#vim /usr/local/tomcat/webapps/gl/index.jsp #动态页面的配置<%@ page language="java" import="java.util.*" pageencoding="utf-8"%><html><head><title>jsp test2 page </title></head><body><% out.println("动态页面 2,http://www.test2.com");%></body></html>#编辑tomcat主配置文件,添加虚拟主机配置,这里要先删掉原先的主机名等配置[root@tm2134 /opt]#vim /usr/local/tomcat/conf/server.xml -------------------------------------------------------------------------------------------------<host name="localhost" appbase="webapps" unpackwars="true" autodeploy="true"#找到这个先删掉,否则最后会出错-------------------------------------------------------------------------------------------------#在行尾162行处插入下面配置,需注意结尾的</host><host name="localhost" appbase="webapps" unpackwars="true" autodeploy="true" xmlvalidation="false" xmlnamespaceaware="false"> <context docbase="/usr/local/tomcat/webapps/gl" path="" reloadable="true" /></host>-------------------------------------------------------------------------------------------------[root@tm2134 /opt]#shutdown.sh [root@tm2134 /opt]#startup.sh #重启服务 |
五、nginx server 配置
静态页面配置
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[root@ng140 ~]#echo '<html><body><h1>this is static</h1></body></html>' > /usr/local/nginx/html/index.html[root@ng140 ~]#cat /usr/local/nginx/html/index.html <html><body><h1>this is static</h1></body></html>[root@ng140 /usr/local/nginx/html]#mkdir /usr/local/nginx/html/picture #上传图片[root@ng140 /usr/local/nginx/html]#cd picture/[root@ng140 /usr/local/nginx/html/picture]#rz -erz waiting to receive.[root@ng140 /usr/local/nginx/html/picture]#lsha.jpg#主配置文件57行下添加下面配置参数,让页面能够加载图片[root@ng140 /usr/local/nginx/html/picture]#vim /usr/local/nginx/conf/nginx.conflocation ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {root /usr/local/nginx/html/picture;expires 10d; }[root@ng140 /usr/local/nginx/html/picture]#nginx -t[root@ng140 /usr/local/nginx/html/picture]#systemctl restart nginx.service |
配置nginx主配置文件
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@ng140 ~]#vim /usr/local/nginx/conf/nginx.conf......#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大#gzip on; #33行下面加入以下内容upstream tomcat_server {server 192.168.8.133:8080 weight=1;server 192.168.8.134:8080 weight=1;} #45行下加入下面配置参数 45 #access_log logs/host.access.log main; 46 location ~ .*\.jsp$ { 47 proxy_pass http://tomcat_server; 48 proxy_set_header host $host; 49 proxy_set_header x-real-ip $remote_addr; 50 proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for; 51 } |
添加参数解析
|
1
2
3
4
5
6
7
8
9
10
11
12
|
location ~ .*\.jsp$ { #把nginx接收到的客户端的ip地址赋值给跳转到tomcat请求中的源ip,识别客户的真实ip,并且赋值与跳转proxy_pass http://tomcat_server; proxy_set_header host $host; #设定后端的web服务器接收到的请求访问的主机名(域名或ip、端口),默认host的值为proxy_pass直连设置的主机名proxy_set_header x-real-ip $remote_addr; #把$remote_addr复制给x-real-ip(自定义),来回去源ipproxy_set_header x-forwarded-for $proxy_add_x_forwarded_for; #在nginx最为代理服务器时,设置的ip列表,会把经过的及其ip,代理及其ip都记录下来 |
检查主配置文件语法并重启服务
|
1
2
3
4
|
[root@ng140 ~]#nginx -tnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful[root@ng140 ~]#systemctl restart nginx.service |
六、验证结果
用火狐浏览器测试静态页面的效果


测试负载均衡是否生效,刷米米素材网页可以看到在动态页面1和2之间来回切换
http://192.168.8.140/index.jsp


总结
可将两个或多个tomcat server 放到 nginx 的 upstream 中组成一个负载均衡集群,然后通过 proxy_pass 这种 web 代理的方式在 location 中设置集群站点,然后再通过 weight 值来分别对 tomcat server 进行权重的设置。
在生产环境中,tomcat server 的硬件配置可能不尽相同,可以通过修改相应服务器的 weight 值,对配置较高或配置较低的服务器的访问请求进行分配控制。
到此这篇关于nginx+tomcat负载均衡集群的实现示例的文章就介绍到这了,更多相关nginx+tomcat负载均衡集群内容请搜索米米素材网以前的文章或继续浏览下面的相关文章希望大家以后多多支持米米素材网!
原文链接:https://blog.csdn.net/m0_56444183/article/details/120775527

发表评论