作者:网络傅老师
特别提示:未经作者允许,不得转载任何内容。违者必究!
Debian如何配置Nginx+Tomcat负载均衡
《傅老师Debian知识库系列之36》——原创
==前言==
傅老师Debian知识库特点:
1、拆解Debian实用技能;
2、所有操作在VMware虚拟机实测完成;
3、致力于最终形成Debian知识手册;
适合人群:想通俗易懂地学习Debian相关知识的同学
阅读建议:无。过于精炼易懂,正常看就行。
所用版本:Debian 12.4
一、概念
本篇开始讲解一些常见的高可用部署,今天我们来聊聊Nginx和Tomcat这对黄金搭档,它们在构建高性能Web服务时可是大显身手的。想象一下,你的网站突然火了,成千上万的用户同时涌进来,这时候怎么办?别担心,Nginx+Tomcat负载均衡群集来帮你!
首先,说说它们的高并发处理能力。
Nginx这家伙,简直就是处理高并发的神器。它能同时应对好几万用户的访问,还不带喘气的。而Tomcat呢,擅长处理动态内容,比如JSP、Servlet这些。但单独用它来扛高并发,可能会有点吃力。所以,我们让Nginx站前台,处理静态文件和分发请求;Tomcat则躲在后面,专心处理动态内容。这样一来,两者搭配,干活不累,效率翻倍!
再来说说负载均衡的灵活性。
Nginx很聪明,它会根据你的设置,把用户的请求分配给不同的Tomcat服务器。你可以用“轮询”的方式,让每个Tomcat轮流接客;也可以用“权重”的方式,让性能好的Tomcat多干点活;还有“ip_hash”,确保同一个用户的请求总是去同一个Tomcat,这样就不会出现session丢失的问题了。这些策略,就像你分配班级任务一样,灵活又实用。
然后,是故障转移和自动剔除。
想象一下,如果某个Tomcat服务器突然“罢工”了,怎么办?Nginx这时候就会说:“嘿,这家伙不行了,我把它从名单里划掉。”然后,它会自动把请求分给其他还活着的Tomcat。这样,即使有个别服务器出问题,也不会影响到整个系统的运行,是不是很贴心?
还有啊,Nginx的资源消耗特别低。
它就像个勤俭节约的好学生,不占用过多的内存和CPU。这意味着,你可以在不增加太多硬件成本的情况下,通过增加Nginx和Tomcat的数量,来提升整个系统的处理能力。这对于预算有限的项目来说,可是个大好消息!
最后,我们来说说应用场景。
Nginx+Tomcat这套组合,简直就是为那些需要处理大量并发请求的Web应用量身定制的。比如电商网站、在线游戏平台,还有那些动不动就搞秒杀、抢购的网站。它们都需要快速响应成千上万的用户请求,这时候Nginx+Tomcat就派上用场了。
而且啊,在微服务架构越来越流行的今天,Nginx还可以作为API网关,帮助你把请求分发到不同的微服务实例上。这样一来,你的系统就更加灵活、可扩展了
二、前置知识
本篇案例需要对Nginx主配置文件和默认网站配置文件的结构稍有了解。需要查阅的话可参考之前的文章《25 Debian如何部署LNMP环境》。
三、操作方法
案例:如图36.1所示。随着某在线购物平台的用户量不断增长,平台面临的访问压力也越来越大。最初,平台使用单个Tomcat服务器来处理所有请求,包括动态页面渲染、数据库交互以及静态资源的传输。然而,随着用户并发访问量的增加,单个Tomcat服务器逐渐出现了性能瓶颈,导致响应速度变慢,甚至在某些高峰时段出现服务不可用的情况。
为了解决这个问题,平台决定采用Nginx+Tomcat的架构方案。Nginx作为高性能的反向代理和负载均衡器,被部署在前端,负责接收用户的所有请求。Nginx根据配置的负载均衡策略(如轮询、权重等),将请求分发到后端的多个Tomcat服务器上。每个Tomcat服务器都负责处理一部分请求,并返回相应的结果给Nginx,再由Nginx将结果返回给用户。
图36.1 Nginx+Tomcat案例环境
1、部署Tomcat01
(1)安装Java环境
root@Tomcat01:~# apt update
root@Tomcat01:~# apt install default-jdk
root@Tomcat01:~# java --version
openjdk 17.0.11 2024-04-16
OpenJDK Runtime Environment (build 17.0.11+9-Debian-1deb12u1)
OpenJDK 64-Bit Server VM (build 17.0.11+9-Debian-1deb12u1, mixed mode, sharing)
(2)安装Tomcat
root@Tomcat01:~# apt install tomcat10*
安装完后Tomcat默认已经启动状态,可以访问其默认首页,如图36.2所示。Tomcat的默认端口为8080。
图36.2 Tomcat10的默认首页
关于Tomcat10配置文件内容以及各种管理方法,不是本文的目的。感兴趣的同学可自行查找Tomcat官方文档。本文重点是配置Nginx实现负载均衡群集。
所以接下来我们只要修改这个Tomcat首页就够了,以便使客户端能看出来是由哪台Tomcat响应的。
(3)创建测试页面
root@Tomcat01:~# mkdir -pv /web/javaweb
root@Tomcat01:~# nano /web/javaweb/index.jsp
//内容如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP测试页面</title>
</head>
<body>
<% out.println("Tomcat01响应的JSP页面");%>
</body>
</html>
(4)修改主配置文件
目的有2个:
- 能够监听来自Nginx作为代理发来的请求
- 定位测试页面的位置
root@Tomcat01:~# nano /etc/tomcat10/server.xml
把下面这段代码前面的“<!--” 和后面的“-->” 删掉,以启用之,用于监听来自Nginx作为代理发来的请求。
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443" />
然后在</Host>之前插入以下内容,以定位测试页面的位置
<Context docBase="/web/javaweb" path="" reloadable="false" >
</Context>
重启服务并查看测试页面,如图36.3。
root@Tomcat01:~# systemctl restart tomcat10.service
图36.3 Tomcat01的测试页面
2、部署Tomcat02
方法与Tomcat01相同,不再赘述,唯一区别就是测试页面的内容。如图36.3所示。
图36.4 Tomcat02的测试页面
3、安装和配置Nginx
root@Nginx:~# apt install nginx*
编辑nginx的静态页面(咱们实验环境就用默认首页了)。
root@Nginx:~# nano /etc/nginx/sites-enabled/default
在location / {……}中加入以下内容,意思是访问nginx根目录的请求都匹配到后端服务器组“tomcat-cluster”
proxy_pass http://tomcat-cluster;
那么这个名为“tomcat-cluster”的后端服务器组都包括哪些主机呢?如何分配客户端的请求呢?我们来编辑nginx的主配置文件。
root@Nginx:~# nano /etc/nginx/nginx.conf
在http{……}中加入以下内容,定义后端服务器组名为tomcat-cluster,默认算法为轮询,其中weight表示权重,权重值越大那么被分配到的概率就越大,此处都为1,表示平均分配。
upstream tomcat-cluster {
server 192.168.9.201:8080 weight=1;
server 192.168.9.202:8080 weight=1;
}
重启nginx服务
root@Nginx:~# systemctl restart nginx.service
4、测试负载均衡
客户端访问Nginx,并不断刷新页面,可看到分别由2台Tomcat服务器响应的页面。说明负载均衡部署成功。如图36.5所示。
图36.5 测试负载均衡
查看Tomcat的访问日志,也能看到由Nginx转发来的访问请求:
root@Tomcat02:~# tail -5 /var/log/tomcat10/localhost_access_log.2024-07-12.txt
192.168.9.75 - - [12/Jul/2024:11:40:24 +0800] "GET / HTTP/1.0" 200 121
192.168.9.75 - - [12/Jul/2024:11:59:15 +0800] "GET / HTTP/1.0" 200 121
192.168.9.75 - - [12/Jul/2024:11:59:17 +0800] "GET / HTTP/1.0" 200 121
192.168.9.75 - - [12/Jul/2024:11:59:18 +0800] "GET / HTTP/1.0" 200 121
192.168.9.75 - - [12/Jul/2024:11:59:19 +0800] "GET / HTTP/1.0" 200 121
好了,Nginx+Tomcat负载均衡群集部署就介绍到这。
同学们快做起来~~
尾部有傅老师的微信名片
欢迎沟通交流:)