Nginx + Tomcat 负载均衡、动静分离群集
一、 nginx 简介
Nginx 是一款轻量级的高性能 Web 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强,在同类型的网页服务器中表现优异,常用于处理高并发场景。
1. 核心功能
高性能
- 采用事件驱动的异步非阻塞架构(epoll/kqueue),单进程可处理数万并发连接,资源消耗极低。
- 静态文件处理速度极快,适合作为静态资源服务器。
反向代理与负载均衡
- 支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议的代理转发。
- 提供多种负载均衡算法(轮询、IP 哈希、加权负载等),可自动检测后端服务器健康状态。
高可用性
- 支持热部署,更新配置无需重启服务。
- 通过
keepalive
机制减少连接开销,提升稳定性。模块化设计
- 支持丰富的第三方模块(如缓存、压缩、认证等),可扩展性强。
2. 典型应用场景
Web 服务器
- 直接托管静态网站(HTML、CSS、JS、图片等)。
- 通过
fastcgi
模块支持 PHP 等动态语言(需配合后端服务)。反向代理与负载均衡
- 作为前端代理服务器,隐藏真实后端服务器,提升安全性。
- 分摊流量到多个后端服务器,避免单点故障。
HTTP 终端代理
- 集中处理 SSL/TLS 加密,降低后端服务器负载。
API 网关
- 实现请求路由、限流、鉴权等功能。
3. 对比 apache
特性 Nginx Apache 架构 事件驱动(异步非阻塞) 多进程 / 线程(同步阻塞) 并发处理 高(单进程数万连接) 中等(受进程 / 线程数限制) 资源消耗 低 高 模块扩展 需编译时添加 运行时动态加载 配置复杂度 简洁(基于块结构) 灵活但复杂
4.适用场景
- 高并发场景:如电商大促、流量突发的网站。
- 微服务架构:作为 API 网关或服务间的负载均衡器。
- 静态资源服务:托管前端项目、CDN 节点等。
5. 基础配置示例
以下是一个简单的 Nginx 配置文件片段,展示了静态网站托管和反向代理的基本配置:
# 全局配置 worker_processes auto; error_log /var/log/nginx/error.log warn;events {worker_connections 1024; }http {include /etc/nginx/mime.types;default_type application/octet-stream;# 静态网站配置server {listen 80;server_name example.com;root /var/www/html;index index.html;location / {try_files $uri $uri/ =404;}}# 反向代理配置server {listen 80;server_name api.example.com;location / {proxy_pass http://backend_server:8080;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}} }
二、 tomcat 简介
Apache Tomcat 是一个开源的 Servlet 容器,由 Apache 软件基金会开发和维护。它实现了 Java Servlet、JavaServer Pages (JSP)、Java Expression Language (EL) 和 WebSocket 等技术规范,是运行 Java Web 应用程序的核心平台。
1. 核心功能
轻量级
- 相比完整的 Java EE 应用服务器(如 WebLogic、WebSphere),Tomcat 体积小、启动快,适合开发和测试环境。
开源免费
- 基于 Apache License 2.0 发布,可自由使用和修改。
扩展性强
- 支持各种插件和连接器(如 APR、NIO2),可通过修改配置文件灵活调整。
与 Apache HTTP Server 集成
- 可作为后端 Servlet 容器,与 Apache HTTP Server 配合实现负载均衡。
2. 基本架构
Tomcat 的核心组件包括:
- Server:代表整个 Servlet 容器,包含多个 Service
- Service:连接 Connector 和 Container
- Connector:负责接收客户端请求(如 HTTP、HTTPS)
- Container:处理请求的核心组件,包含 Engine、Host、Context 等
- Web 应用:部署在 Context 中的 WAR 或目录
3. 典型应用场景
Java Web 应用部署
- 运行基于 Spring、Spring Boot、Struts 等框架开发的 Web 应用。
微服务架构
- 作为轻量级服务容器,部署独立的微服务实例。
开发测试环境
- 快速启动和调试 Web 应用,支持热部署。
与其他服务器配合
- 作为应用服务器,与 Nginx/Apache HTTP Server 配合实现动静分离。
4. 配置示例
以下是一个简化的server.xml
配置片段,展示了基本的 HTTP 连接器和虚拟主机配置:
<?xml version="1.0" encoding="UTF-8"?> <Server port="8005" shutdown="SHUTDOWN"><Listener className="org.apache.catalina.startup.VersionLoggerListener" /><Service name="Catalina"><!-- HTTP连接器 --><Connector port="8080" 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"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t "%r" %s %b" /></Host></Engine></Service> </Server>
5. 与 nginx 的协作模式
在生产环境中,Tomcat 通常与 Nginx 配合使用:
Nginx 作为反向代理
server {listen 80;server_name example.com;location / {proxy_pass http://tomcat_server:8080;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;} }
动静分离
- Nginx 处理静态资源(HTML、CSS、JS、图片)
- Tomcat 处理动态请求(Servlet、JSP)
负载均衡
- Nginx 通过 upstream 模块将请求分发到多个 Tomcat 实例:
upstream tomcat_cluster {server tomcat1:8080;server tomcat2:8080; }server {listen 80;location / {proxy_pass http://tomcat_cluster;} }
6. 性能优化建议
(1) 调整 JVM 参数
修改catalina.sh
或setenv.sh
,设置合适的堆内存和垃圾回收器:
JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"
(2) 优化连接器
在server.xml
中调整 HTTP 连接器参数:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"maxThreads="200" acceptCount="100" />
(3) 禁用不必要的服务
注释掉server.xml
中不需要的组件(如 AJP 连接器)。
(4) 使用 APR 连接器
对于高并发场景,启用 APR(Apache Portable Runtime)以提升性能:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" />
三、 实验步骤
1. 实验环境
部署nginx+tomcat负载均衡需要以下设备
tomcat1 服务器 | 192.168.10.102 |
tomcat2 服务器 | 192.168.10.103 |
nginx 服务器 | 192.168.10.101 |
2. 准备 tomcat 网站
##两台tomcat服务器配置一致 [root@localhost /]# dnf -y install java //安装实验需要的环境 [root@localhost /]# mkdir -p /web/webapp1 [root@localhost webapp1]# ls index.jsp##第一台tomcat服务器 [root@localhost webapp1]# cat index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head><title>JSP test2 page</title> </head><body><% out.println("动态页面 1,http://www.test2.com");%></body> <body> <div>动态页面的图片 1</div><br><img src="logo.png"> </body> </html>##第二台tomcat服务器 [root@localhost webapp1]# cat 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> <body> <div>动态页面的图片 2</div><br><img src="logo.png"> ##为了方便验证两台服务器页面可以不一致</body> </html>
3. 修改 nginx 的配置文件
[root@nginx /]# vim /usr/local/nginx/conf/nginx.conf ##这个要写在http部分upstream my_tomcat {server 192.168.10.102:8080 weight=1;server 192.168.10.103:8080 weight=2;}##新添加的localtion部分 location ~ .*\.jsp$ {proxy_set_header HOST $host; proxy_pass http://my_tomcat; }##检查配置文件是否有误 [root@nginx /]# nginx -t##重载nginx服务 [root@nginx /]# nginx -s reload
4. 修改 tomcat 的配置文件
##两台服务器都要配置 [root@localhost /]# vim /usr/local/tomcat/conf/server.xml <Context docBase="/web/webapp1" path="" reloadable="false"> ##在150行添加</Context>docBase ##指定网页的路径 path="" ##定义 Web 应用的访问路径(上下文路径) reloadabel ##控制 Tomcat 是否自动检测应用文件的修改并重新加载应用 false(默认值) ##不自动重新加载,修改文件后需手动重启 Tomcat 或应用。 true ##开启自动重新加载##重启两台服务器,使配置文件生效 [root@localhost /]# /usr/local/tomcat/bin/shutdown.sh [root@localhost /]# /usr/local/tomcat/bin/startup.sh
5. 验证
相关文章:

Nginx + Tomcat 负载均衡、动静分离群集
一、 nginx 简介 Nginx 是一款轻量级的高性能 Web 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强,在同类型的网页服务器中表现优异,常用…...
【maker-pdf 文档文字识别(包含ocr),安装使用完整教程】
测试效果还比较好,比markitdown要好 安装环境 conda create -n maker-pdf python3.12 conda activate marker-pdf pip install modelscope pip install marker-pdf -U下载模型 建议用modelscope上缓存的模型,不然下载会很慢 from modelscope import s…...

c++ algorithm
cheatsheet:https://hackingcpp.com transform 元素变换 https://blog.csdn.net/qq_44961737/article/details/146011174 #include <iostream> #include <vector> #include <algorithm>int main() {std::vector<int> a {1, 2, 3, 4, 5};…...
《前端面试题:BFC(块级格式化上下文)》
前端BFC完全指南:布局魔法与面试必备 🎋 端午安康! 各位前端探险家,端午节快乐!🥮 愿你的代码如龙舟竞渡般乘风破浪,样式如香糯粽子般完美包裹!今天我们来解锁CSS中的布局魔法——B…...
HertzBeat的告警规则如何配置?
HertzBeat配置告警规则主要有以下步骤: 配置告警阈值 1. 登录HertzBeat管理界面,点击“阈值规则”菜单,选择“新增阈值”。 2. 选择要配置告警阈值的指标对象。例如,若监控Spring Boot应用,可选择如“状态线程数”等…...

安全-JAVA开发-第一天
目标: 安装环境 了解基础架构 了解代码执行顺序 与数据库进行连接 准备: 安装 下载IDEA并下载tomcat(后续出教程) 之后新建项目 注意点如下 1.应用程序服务器选择Web开发 2.新建Tomcat的服务器配置文件 并使用 Hello…...

6月2日上午思维训练题解
好好反思一下,自己在学什么,自己怎么在做训练赛的,真有这么难吗 ????? A - Need More Arrays 题解 想尽可能多的拆出新数组的个数,只需要从原本的数组中提取出最长的一…...
高考数学易错考点01 | 临阵磨枪
文章目录 前言集合与函数不等式数列三角函数前言 本篇内容下载于网络,网络上的都是以 WORD 版本呈现,缺字缺图很不完整,没法使用,我只是做了补充和完善。有空准备进行第二次完善,添加问题解释的链接。 集合与函数 1.进行集合的交、并、补运算时,不要忘了全集和空集的特…...

【CF】Day69——⭐Codeforces Round 897 (Div. 2) D (图论 | 思维 | DFS | 环)
D. Cyclic Operations 题目: 思路: 非常好的一题 对于这题我们要学会转换和提取条件,从特殊到一般 我们可以考虑特殊情况先,即 k n 和 k 1时,对于 k 1,我们可以显然发现必须满足 b[i] i,而…...
MySQL中的字符串分割函数
MySQL中的字符串分割函数 MySQL本身没有内置的SPLIT()函数,但可以通过其他方式实现字符串分割功能。以下是几种常见的方法: 1. SUBSTRING_INDEX函数 SUBSTRING_INDEX()是MySQL中最常用的字符串分割函数,它可以根据指定的分隔符从字符串中提…...

前端八股之Vue
目录 有使用过vue吗?说说你对vue的理解 你对SPA单页面的理解,它的优缺点分别是什么?如何实现SPA应用呢 一、SPA 是什么 二、SPA 和 MPA 的区别 三、SPA 的优缺点 四、实现 SPA 五、给 SPA 做 SEO 的方式(基于 Vueÿ…...
Matlab数值计算
MATLAB数值计算 数值计算函数句柄匿名函数线性与非线性方程组求解1. \(左除运算)2. fzero3. fsolve4. roots 函数极值的求解1. fminbnd2. fmincon3. fminsearch与fminunc 数值积分1. quad / quadl2. quadgk3. integral4. trapz5. dblquad, quad2d, integ…...

谷歌地图高清卫星地图2026中文版下载|谷歌地图3D卫星高清版 V7.3.6.9796 最新免费版下载 - 前端工具导航
谷歌地图高清卫星地图2024中文版是一款非常专业的世界地图查看工具。通过使用该软件,你就可以在这里看到外太空星系、大洋峡谷等场景,通过高清的卫星地图,可以清晰查看地图、地形、3D建筑、卫星图像等信息,让你可以更轻松的探索世…...

条形进度条
组件 <template><view class"pk-detail-con"><i class"lightning" :style"{ left: line % }"></i><i class"acimgs" :style"{ left: line % }"></i><view class"progress&quo…...
悟饭游戏厅iOS版疑似流出:未测试版
网传悟饭游戏厅iOS版安装包流出,提供百度网盘/夸克网盘双渠道下载。本文客观呈现资源信息,包含文件验证数据、安装风险预警及iOS正版替代方案。苹果用户请谨慎测试,建议优先考虑官方渠道。 一、资源基本信息 1.1 文件验证数据 属性夸克网盘…...
95. Java 数字和字符串 - 操作字符串的其他方法
文章目录 95. Java 数字和字符串 - 操作字符串的其他方法一、分割字符串二、子序列与修剪三、在字符串中搜索字符和子字符串四、将字符和子字符串替换为字符串五、String 类的实际应用 —— 文件名处理示例示例:Filename 类示例:FilenameDemo 类 总结 95…...

IBM DB2分布式数据库架构
一、什么是分布式数据库架构 分布式数据库架构是现代数据库系统的重要发展方向,特别适合处理大规模数据、高并发访问和高可用性需求的应用场景。下面我们从原理、架构模式、关键技术、实现方式和常见产品几个方面来系统讲 1、分布式数据库的基本概念与原理 1. 什…...
初始化已有项目仓库,推送远程(Git)
初始化Git仓库(如果还没初始化) git init 添加并提交文件 git add . ("."表示当前项目所有文件) git commit -m “first commit” 关联远程仓库(如果还没关联) git remote add origin http://xxxxxxxx 推送代码 …...

Android Studio 向模拟器手机添加照片、视频、音乐
Android Studio 向模拟器手机添加照片、视频、音乐(其实都是一样的,只是添加到不同的文件夹),例如我们在很多程序中功能例如:选择头像,跳转到手机相册选择头像,此时相册为空,即模拟器没有图片资…...

数据结构-算法学习C++(入门)
目录 03二进制和位运算04 选择、冒泡、插入排序05 对数器06 二分搜索07 时间复杂度和空间复杂度08 算法和数据结构09 单双链表09.1单双链表及反转09.2合并链表09.2两数相加09.2分隔链表 013队列、栈、环形队列013.1队列013.2栈013.3循环队列 014栈-队列的相互转换014.1用栈实现…...
访谈 | 吴恩达全景解读 AI Agents 发展现状:多智能体、工具生态、评估体系、语音栈、Vibe Coding 及创业建议一文尽览
在最新的 LangChain Interrupt 大会上(2025),LangChain 联合创始人 & CEO Harrison Chase 与吴恩达(Andrew Ng)就 AI Agnets 的发展现状,进行了一场炉边谈话。 吴恩达回顾了与 LangChain 的渊源&#…...

连接关键点:使用 ES|QL 联接实现更丰富的可观测性洞察
作者:来自 Elastic Luca Wintergerst ES|QL 的 LOOKUP JOIN 现已进入技术预览阶段,它允许你在查询时对日志、指标和追踪进行丰富处理,无需在摄取时进行非规范化。动态添加部署、基础设施或业务上下文,减少存储占用,加速…...
Tiktok App 登录账号、密码、验证码 XOR 加密算法
抖音 App 登录账号、密码、验证码 XOR 加密算法% E9 n z, \& R1 a4 b. ^ 流程分析 登录 Tiktok APP 时,通过抓包发现账号密码是非明文传输的。 <?php// http://xxx.xx.x.x.x/tiktok/$tiktok new TikTokClient();$userId 7212597544604484614; $secUid …...

Flask + Celery 应用
目录 Flask Celery 应用项目结构1. 创建app.py2. 创建tasks.py3. 创建celery_worker.py4. 创建templates目录和index.html运行应用测试文件 Flask Celery 应用 对于Flask与Celery结合的例子,需要创建几个文件。首先安装必要的依赖: pip install flas…...

奥威BI+AI数据分析:企业数智化转型的加速器
在当今数据驱动的时代,企业对于数据分析的需求日益增长。奥威BIAI数据分析的组合,正成为众多企业数智化转型的加速器。 奥威BI以其强大的数据处理和可视化能力著称。它能够轻松接入多种数据源,实现数据的快速整合与清洗。通过内置的ETL工具&…...

python打卡day43
复习日 作业: kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:并拆分成多个文件 找了个街头食物图像分类的数据集Popular Street Foods(其实写代码的时候就开始后悔了),原因在于&…...
MySQL 如何判断某个表中是否存在某个字段
在MySQL中,判断某个表中是否存在某个字段,可以通过查询系统数据库 INFORMATION_SCHEMA.COLUMNS 实现。以下是详细步骤和示例: 方法:使用 INFORMATION_SCHEMA.COLUMNS 通过查询系统元数据表 COLUMNS,检查目标字段是否存…...

Linux --进程优先级
概念 什么是进程优先级,为什么需要进程优先级,怎么做到进程优先级这是本文需要解释清楚的。 优先级的本质其实就是排队,为了去争夺有限的资源,比如cpu的调度。cpu资源分配的先后性就是指进程的优先级。优先级高的进程有优先执行的…...

安装和配置 Nginx 和 Mysql —— 一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录6
前言 昨天更新了四篇博客,我们顺利的 安装了 ubuntu server 服务器,并且配置好了 ssh 免密登录服务器,安装好了 服务器常用软件安装, 配置好了 zsh 和 vim 以及 通过 NVM 安装好Nodejs,还有PNPM包管理工具 。 作为服务器的运行…...
Linux 测试本机与192.168.1.130 主机161/udp端口连通性
Linux 测试本机与 192.168.1.130 主机 161/UDP 端口连通性 161/UDP 端口是 SNMP(简单网络管理协议)的标准端口。以下是多种测试方法: 🛠️ 1. 使用 nmap 进行专业测试(推荐) sudo nmap -sU -p 161 -Pn 1…...