小知识:使用Nginx+Tomcat实现负载均衡的全过程

Nginx + Tomcat 实现负载均衡

1. 环境

?
1
2
3
4
5
6
Linux version:  5.4.0-96-generic
OS Version:     ubuntu1~20.04
Architecture:   amd64
Nginx version:  nginx/1.18.0 (Ubuntu)
JVM Version:    11.0.15+10-Ubuntu-0ubuntu0.20.04.1
Tomcat Version: Apache Tomcat/9.0.63

2. 安装

2.1 安装 Nginx

在命令行输入:

?
1
sudo apt-get install nginx

测试命令:

?
1
sudo nginx -t

窗口显示:

?
1
2
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

在浏览器输入服务器 ip:

%小知识:使用Nginx+Tomcat实现负载均衡的全过程-猿站网-插图

2.2 安装 Java

安装 jdk:

?
1
sudo apt-get -y install openjdk-11-jdk

查看版本:

?
1
java –version

输出如下:

?
1
2
3
openjdk 11.0.15 2022-04-19
OpenJDK Runtime Environment (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1)
OpenJDK 64-Bit Server VM (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1, mixed mode, sharing)

安装成功。

查看 Java 的安装位置:

?
1
update-alternatives –config java

输出如下:

?
1
There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-11-openjdk-amd64/bin/java

将 $JAVA_HOME 添加到环境变量:

?
1
2
sudo vim $HOME/.bashrc
shift+G

在行尾添加:

?
1
2
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$PATH:$JAVA_HOME

退出 vim ,激活环境变量:

?
1
source $HOME/.bashrc

验证环境变量:

?
1
echo $JAVA_HOME

输出如下,激活成功。

?
1
/usr/lib/jvm/java-11-openjdk-amd64

2.3 安装 Tomcat

官网下载的 Tomcat 9.0.63,注意需为 Core/tar.gz(pgp, sha512) 版本,或 点此下载 ,将文件上传到服务器中的路径 /usr/local 下,输入下列命令解压:

?
1
cd /usr/local && tar -zxvf apache-tomcat-9.0.63.tar.gz

配置环境变量,打开 Tomcat 启动脚本:

?
1
2
cd apache-tomcat-9.0.63 && vim bin/startup.sh
shift+G

在语句 exec “$PRGDIR”/”$EXECUTABLE” start “$@” 的上一行插入下列语句:

?
1
2
3
4
5
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME
CLASSPATH=.:$JRE_HOME/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
TOMCAT_HOME=/usr/local/apache-tomcat-9.0.63

保存并退出。

开放服务器的 8080 端口:

?
1
firewall-cmd –zone=public –add-port=8080/tcp –permanent

重启防火墙

?
1
systemctl restart firewalld.service

去云服务器管理控制台添加安全组:

%小知识:使用Nginx+Tomcat实现负载均衡的全过程-1猿站网-插图

运行:

?
1
./bin/shutdown.sh && rm -rf logs/catalina.out && ./bin/startup.sh ; tail -f logs/catalina.out

输出应该如下所示:

%小知识:使用Nginx+Tomcat实现负载均衡的全过程-2猿站网-插图

在浏览器访问 $ip:8080,显示:

%小知识:使用Nginx+Tomcat实现负载均衡的全过程-3猿站网-插图

说明你配置成功。

3. 部署

3.1 Tomcat 服务器部署

本实验需要使用 3 个端口,分别使用 8001,8082,8083,在腾讯云控制台开放端口后,在 shell 中手动开放端口并重启防火墙:

?
1
2
3
4
firewall-cmd –zone=public –add-port=8081/tcp –permanent
firewall-cmd –zone=public –add-port=8082/tcp –permanent
firewall-cmd –zone=public –add-port=8083/tcp –permanent
systemctl restart firewalld.service

注意去腾讯云开启你的安全组

我们使用 Tomcat 自带的 3 个 Web 项目来实现不同的端口访问不同的应用,假设你完全按照上文的方式操作,那么此时你的 Tomcat 为 /usr/local/apache-tomcat-9.0.63,根据根路径打开服务器的配置文件:

?
1
cd /usr/local/apache-tomcat-9.0.63/conf && vim server.xml

删除掉原代码,换成以下代码:

?
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?xml version=”1.0″ encoding=”UTF-8″?>
<Server port=”8005″ shutdown=”SHUTDOWN”>
<Listener className=”org.apache.catalina.startup.VersionLoggerListener” />
<Listener className=”org.apache.catalina.core.AprLifecycleListener” SSLEngine=”on” />
<Listener className=”org.apache.catalina.core.JreMemoryLeakPreventionListener” />
<Listener className=”org.apache.catalina.mbeans.GlobalResourcesLifecycleListener” />
<Listener className=”org.apache.catalina.core.ThreadLocalLeakPreventionListener” />
<GlobalNamingResources>
<Resource name=”UserDatabase” auth=”Container”
type=”org.apache.catalina.UserDatabase”
description=”User database that can be updated and saved”
factory=”org.apache.catalina.users.MemoryUserDatabaseFactory”
pathname=”conf/tomcat-users.xml” />
</GlobalNamingResources>
<Service name=”Catalina”>
<Connector port=”8081″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ />
<Engine name=”Catalina” defaultHost=”localhost”>
<Realm className=”org.apache.catalina.realm.LockOutRealm”>
<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>
</Realm>
<Host name=”localhost”  appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”>
<Context path=”” docBase=”ROOT” reloadable=”true” />
<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”
prefix=”localhost_access_log” suffix=”.txt”
pattern=”%h %l %u %t &quot;%r&quot; %s %b” />
</Host>
</Engine>
</Service>
<Service name=”Catalina2″>
<Connector port=”8082″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ />
<Engine name=”Catalina2″ defaultHost=”localhost”>
<Realm className=”org.apache.catalina.realm.LockOutRealm”>
<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>
</Realm>
<Host name=”localhost”  appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”>
<Context path=”” docBase=”examples” reloadable=”true” />
<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”
prefix=”localhost_access_log” suffix=”.txt”
pattern=”%h %l %u %t &quot;%r&quot; %s %b” />
</Host>
</Engine>
</Service>
<Service name=”Catalina3″>
<Connector port=”8083″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ />
<Engine name=”Catalina3″ defaultHost=”localhost”>
<Realm className=”org.apache.catalina.realm.LockOutRealm”>
<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>
</Realm>
<Host name=”localhost”  appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”>
<Context path=”” docBase=”examples/websocket” reloadable=”true” />
<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”
prefix=”localhost_access_log” suffix=”.txt”
pattern=”%h %l %u %t &quot;%r&quot; %s %b” />
</Host>
</Engine>
</Service>
</Server>

这样,通过 $ip:8081、$ip:8082、$ip:8083 分别访问就可以得到不同的服务端。

8083 端口的资源不完整,因为 Tomcat 默认只提供了 2 个有效的 app,第三个端口会返回一个 404 页面,某种程度上它也是一个应用。

3.2 Nginx 反向代理

编辑 nginx.conf 配置文件:

?
1
vim /etc/nginx/nginx.conf

将下列语句插入到模块 http 的末尾:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
upstream tomcat_server {
server 101.42.117.143:8081;
server 101.42.117.143:8082;
server 101.42.117.143:8083;
}
server {
listen 80;
server_name 101.42.117.143;
location / {
proxy_pass http://tomcat_server;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

启动或重启 nginx:

?
1
nginx 或 nginx -s reload

这样,可以直接访问 80 端口,或 $ip 后将其代理到后端的 3 台服务器上。

nginx 默认采用轮询策略。

4. 负载均衡

4.1 轮询

轮询策略 nginx.conf 的配置如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
upstream tomcat_server {
server 101.42.117.143:8081 weight=1;
server 101.42.117.143:8082 weight=1;
server 101.42.117.143:8083 weight=1;
}
server {
listen 80;
server_name 101.42.117.143;
location / {
proxy_pass http://tomcat_server;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

重启 nginx:

?
1
nginx -s reload

使用 postman 频繁访问,页面出现的频率是 ABC ABC ABC ABC。

4.2 加权轮询

加权轮询策略 nginx.conf 的配置如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
upstream tomcat_server {
server 101.42.117.143:8081 weight=1;
server 101.42.117.143:8082 weight=3;
server 101.42.117.143:8083 weight=5;
}
server {
listen 80;
server_name 101.42.117.143;
location / {
proxy_pass http://tomcat_server;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

重启 nginx:

?
1
nginx -s reload

使用 postman 频繁访问,页面出现的频率是 CBCACBCBC CBCACBCBC。

该算法称为提案者轮换选择算法,每一轮都会将被选中的对象减去总权重值,每一轮都会将各结点的权重值加上固定的预设权重值,这是一个公平的轮换算法,可以防止权重过大的结点持续占据资源。过程如下:

初始权重 加权 选择 选中者减去权重和 0 0 0 1 3 5 C 1 3 -4 1 3 -4 2 6 1 B 2 -3 1 2 -3 1 3 0 6 C 3 0 -3 3 0 -3 4 3 2 A -5 3 2 -5 3 2 -4 6 7 C -4 6 -2 -4 6 -2 -3 9 3 B -3 0 3 -3 0 3 -2 3 8 C -2 3 -1 -2 3 -1 -1 6 4 B -1 -3 4 -1 -3 4 0 0 9 C 0 0 0 0 0 0 1 3 5 C 1 3 -4 1 3 -4 2 6 1 B 2 -3 1 2 -3 1 3 0 6 C 3 0 -3 … … … …

4.2 IP Hash

IP Hash 策略 nginx.conf 的配置如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
upstream tomcat_server {
server 101.42.117.143:8081;
server 101.42.117.143:8082;
server 101.42.117.143:8083;
ip_hash;
}
server {
listen 80;
server_name 101.42.117.143;
location / {
proxy_pass http://tomcat_server;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

重启 nginx:

?
1
nginx -s reload

它会将主机的 $ip 哈希映射到一个随机的固定值,然后对 3 取模得到响应的端口序号;

使用主机 1 的 postman 频繁访问,页面出现的频率是 AAAAAA;

使用主机 2 的 postman 频繁访问,页面出现的频率是 BBBBBB。

总结

到此这篇关于使用Nginx+Tomcat实现负载均衡的文章就介绍到这了,更多相关Nginx+Tomcat负载均衡内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/Elford/article/details/124996274

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:Linux 系统中如何更改 IP 地址

2023-3-15 4:26:59

建站知识

小知识:如何在Linux中查看系统环境变量

2023-3-15 4:35:27

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索