经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Nginx » 查看文章
使用Nginx+Tomcat实现负载均衡的全过程
来源:jb51  时间:2022/5/30 9:34:11  对本文有异议

Nginx + Tomcat 实现负载均衡

1. 环境

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

2. 安装

2.1 安装 Nginx

在命令行输入:

  1. sudo apt-get install nginx

测试命令:

  1. sudo nginx -t

窗口显示:

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

在浏览器输入服务器 ip:

image-20220525212228322

2.2 安装 Java

安装 jdk:

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

查看版本:

  1. java --version

输出如下:

  1. openjdk 11.0.15 2022-04-19
  2. OpenJDK Runtime Environment (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1)
  3. 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. sudo vim $HOME/.bashrc
  2. shift+G

在行尾添加:

  1. export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
  2. 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. cd apache-tomcat-9.0.63 && vim bin/startup.sh
  2. shift+G

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

  1. JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
  2. JRE_HOME=$JAVA_HOME/jre
  3. PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME
  4. CLASSPATH=.:$JRE_HOME/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  5. 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

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

image-20220525234438235

运行:

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

输出应该如下所示:

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

image-20220526002245669

说明你配置成功。

3. 部署

3.1 Tomcat 服务器部署

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

  1. firewall-cmd --zone=public --add-port=8081/tcp --permanent
  2. firewall-cmd --zone=public --add-port=8082/tcp --permanent
  3. firewall-cmd --zone=public --add-port=8083/tcp --permanent
  4. 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. <?xml version="1.0" encoding="UTF-8"?>
  2. <Server port="8005" shutdown="SHUTDOWN">
  3. <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  4. <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  5. <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  6. <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  7. <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  8. <GlobalNamingResources>
  9. <Resource name="UserDatabase" auth="Container"
  10. type="org.apache.catalina.UserDatabase"
  11. description="User database that can be updated and saved"
  12. factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
  13. pathname="conf/tomcat-users.xml" />
  14. </GlobalNamingResources>
  15.  
  16. <Service name="Catalina">
  17. <Connector port="8081" protocol="HTTP/1.1"
  18. connectionTimeout="20000"
  19. redirectPort="8443" />
  20. <Engine name="Catalina" defaultHost="localhost">
  21. <Realm className="org.apache.catalina.realm.LockOutRealm">
  22. <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
  23. resourceName="UserDatabase"/>
  24. </Realm>
  25. <Host name="localhost" appBase="webapps"
  26. unpackWARs="true" autoDeploy="true">
  27. <Context path="" docBase="ROOT" reloadable="true" />
  28. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
  29. prefix="localhost_access_log" suffix=".txt"
  30. pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  31. </Host>
  32. </Engine>
  33. </Service>
  34.  
  35. <Service name="Catalina2">
  36. <Connector port="8082" protocol="HTTP/1.1"
  37. connectionTimeout="20000"
  38. redirectPort="8443" />
  39. <Engine name="Catalina2" defaultHost="localhost">
  40. <Realm className="org.apache.catalina.realm.LockOutRealm">
  41. <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
  42. resourceName="UserDatabase"/>
  43. </Realm>
  44. <Host name="localhost" appBase="webapps"
  45. unpackWARs="true" autoDeploy="true">
  46. <Context path="" docBase="examples" reloadable="true" />
  47. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
  48. prefix="localhost_access_log" suffix=".txt"
  49. pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  50. </Host>
  51. </Engine>
  52. </Service>
  53.  
  54. <Service name="Catalina3">
  55. <Connector port="8083" protocol="HTTP/1.1"
  56. connectionTimeout="20000"
  57. redirectPort="8443" />
  58. <Engine name="Catalina3" defaultHost="localhost">
  59. <Realm className="org.apache.catalina.realm.LockOutRealm">
  60. <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
  61. resourceName="UserDatabase"/>
  62. </Realm>
  63. <Host name="localhost" appBase="webapps"
  64. unpackWARs="true" autoDeploy="true">
  65. <Context path="" docBase="examples/websocket" reloadable="true" />
  66. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
  67. prefix="localhost_access_log" suffix=".txt"
  68. pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  69. </Host>
  70. </Engine>
  71. </Service>
  72. </Server>
  73.  

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

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

3.2 Nginx 反向代理

编辑 nginx.conf 配置文件:

  1. vim /etc/nginx/nginx.conf

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

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

启动或重启 nginx:

  1. nginx nginx -s reload

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

nginx 默认采用轮询策略。

4. 负载均衡

4.1 轮询

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

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

重启 nginx:

  1. nginx -s reload

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

4.2 加权轮询

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

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

重启 nginx:

  1. nginx -s reload

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

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

初始权重加权选择选中者减去权重和
0 0 01 3 5C1 3 -4
1 3 -42 6 1B2 -3 1
2 -3 13 0 6C3 0 -3
3 0 -34 3 2A-5 3 2
-5 3 2-4 6 7C-4 6 -2
-4 6 -2-3 9 3B-3 0 3
-3 0 3-2 3 8C-2 3 -1
-2 3 -1-1 6 4B-1 -3 4
-1 -3 40 0 9C0 0 0
0 0 01 3 5C1 3 -4
1 3 -42 6 1B2 -3 1
2 -3 13 0 6C3 0 -3

4.2 IP Hash

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

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

重启 nginx:

  1. nginx -s reload

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

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

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

总结

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号