Nginx + Tomcat 负载均衡、动静分离群集

article/2025/6/10 18:05:06

一、 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

特性NginxApache
架构事件驱动(异步非阻塞)多进程 / 线程(同步阻塞)
并发处理高(单进程数万连接)中等(受进程 / 线程数限制)
资源消耗
模块扩展需编译时添加运行时动态加载
配置复杂度简洁(基于块结构)灵活但复杂

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 &quot;%r&quot; %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.shsetenv.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. 验证


http://www.hkcw.cn/article/uJTtXEsDIK.shtml

相关文章

5.Nginx+Tomcat负载均衡群集

Tomcat服务器应用场景&#xff1a;tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&#xff0c;Tomcat虽然和Apache或…

【算法设计与分析】实验——汽车加油问题, 删数问题(算法实现:代码,测试用例,结果分析,算法思路分析,总结)

说明&#xff1a;博主是大学生&#xff0c;有一门课是算法设计与分析&#xff0c;这是博主记录课程实验报告的内容&#xff0c;题目是老师给的&#xff0c;其他内容和代码均为原创&#xff0c;可以参考学习&#xff0c;转载和搬运需评论吱声并注明出处哦。 4-1算法实现题 汽车…

网络爬虫 - App爬虫及代理的使用(十一)

App爬虫及代理的使用 一、App抓包1. App爬虫原理2. reqable的安装与配置1. reqable安装教程2. reqable的配置3. 模拟器的安装与配置1. 夜神模拟器的安装2. 夜神模拟器的配置4. 内联调试及注意事项1. 软件启动顺序2. 开启抓包功能3. reqable面板功能4. 夜神模拟器设置项5. 注意事…

SQLite详细解读

一、SQLite 是什么&#xff1f; SQLite 是一个嵌入式关系型数据库管理系统&#xff08;RDBMS&#xff09;。它不是像 MySQL 或 PostgreSQL 那样的客户端-服务器数据库引擎&#xff0c;而是一个自包含的、无服务器的、零配置的、事务性的 SQL 数据库引擎。 核心特点 嵌入式/库…

线程池详细解析(三)

本章我们来讲一讲线程池的最后一个方法shutdown&#xff0c;这个方法的主要作用就是将线程池进行关闭 shutdown&#xff1a; public void shutdown() {ReentrantLock var1 this.mainLock;var1.lock();try {this.checkShutdownAccess();this.advanceRunState(0);this.interrup…

口碑对比:杭州白塔岭画室和燕壹画室哪个好?

从口碑方面来看&#xff0c;杭州燕壹画室和白塔岭画室各有特点&#xff0c;以下是具体分析&#xff1a; 燕壹画室 教学成果突出&#xff1a; 其前身燕壹设计工作室在2019 - 2023年专注美院校考设计&#xff0c;有一定的教学积淀&#xff0c;2023年转型后第一年攻联考就斩获浙…

车载雷达:超声波雷达、毫米波雷达、激光雷达相关技术场景介绍和技术比较

随着技术发展,如今的汽车智能化程度越来越高,配备的传感器也越来越多,特别是与辅助驾驶相关的汽车雷达,它们如同汽车的 “眼睛”,帮助车辆感知周围环境。为了适配不同的使用场景和功能需求,汽车雷达也分为很多类型,并且各具特点。 一、技术特点 一)超声波雷达 超声波…

Spring AI Advisor机制

Spring AI Advisors 是 Spring AI 框架中用于拦截和增强 AI 交互的核心组件&#xff0c;其设计灵感类似于 WebFilter&#xff0c;通过链式调用实现对请求和响应的处理5。以下是关键特性与实现细节&#xff1a; 核心功能 ‌1. 请求/响应拦截‌ 通过 AroundAdvisor 接口动态修…

GPTBots在AI大语言模型应用中敏感数据匿名化探索和实践

背景 随着人工智能技术的快速发展&#xff0c;尤其是大语言模型&#xff08;LLM-large language model&#xff09;在金融、医疗、客服等领域的广泛应用&#xff0c;处理海量数据已成为常态。然而&#xff0c;这些数据中往往包含个人可识别信息&#xff08;PII-Personally Ide…

使用 C++/OpenCV 制作跳动的爱心动画

使用 C/OpenCV 制作跳动的爱心动画 本文将引导你如何使用 C 和 OpenCV 库创建一个简单但有趣的跳动爱心动画。我们将通过绘制参数方程定义的爱心形状&#xff0c;并利用正弦函数来模拟心跳的缩放效果。 目录 简介先决条件核心概念 参数方程绘制爱心动画循环模拟心跳效果 代码…

入门AJAX——XMLHttpRequest(Get)

一、什么是 AJAX AJAX Asynchronous JavaScript And XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 1、XML与异步JS XML: 是一种比较老的前后端数据传输格式&#xff08;已经几乎被 JSON 代替&#xff09;。它的格式与HTML类似&#xff0c;通过严格的闭合自定义标…

MDP的observations部分

文章目录 1.isaaclab的observations1.1 根状态相关观测base_pos_zbase_lin_vel &#xff08;use&#xff09;base_ang_vel &#xff08;use&#xff09;projected_gravity (use)root_pos_wroot_quat_wroot_lin_vel_wroot_ang_vel_w 1.2 关节状态相关观测joint_posjoint_pos_rel…

Rhino插件大全下载指南:解锁犀牛潜能,提升设计效率

Rhinoceros&#xff08;简称Rhino&#xff0c;犀牛&#xff09;以其强大的NURBS曲面建模能力、灵活的脚本环境以及与Grasshopper参数化设计工具的无缝集成&#xff0c;在全球工业设计、建筑设计、珠宝设计、船舶设计等领域备受推崇。为了进一步拓展Rhino的功能&#xff0c;满足…

百万级临床试验数据库TrialPanorama发布!AI助力新药研发与临床评价迎来新基石

2025年5月22日&#xff0c;伊利诺伊大学厄巴纳-香槟分校的研究团队在《arXiv》上发表了一篇前瞻性研究论文《TrialPanorama: Database and Benchmark for Systematic Review and Design of Clinical Trials》&#xff0c;该研究建立了一个临床试验数据库TrialPanorama&#xff…

运维 vm 虚拟机ip设置

虚拟网络设置 nat 模式 网卡 主机设置网卡地址 虚拟机绑定网卡

问题七、isaacsim中添加IMU传感器

0 前言 NVIDIA Isaac Sim 中的 IMU 传感器可跟踪车身运动并输出模拟加速度计和陀螺仪读数。与真实 IMU 传感器一样,模拟 IMU 可通过平台单元提供局部 x、y、z 轴的加速度和角速度测量值。 1 创建IMU传感器 按照下述步骤依次点击 使用python创建 基于IsaacSensorCreateImuSe…

AutoGenTestCase - 借助AI大模型生成测试用例

想象一下&#xff0c;你正在为一个复杂的支付系统编写测试用例&#xff0c;需求文档堆积如山&#xff0c;边缘场景层出不穷&#xff0c;手动编写让你焦头烂额。现在&#xff0c;有了AutoGenTestCase&#xff0c;这个AI驱动的“测试用例生成机”可以从需求文档中自动生成数百个测…

警惕假冒 CAPTCHA 攻击通过多阶段payload链部署远控和盗窃信息

在过去几个月中&#xff0c;Trend Micro 托管检测与响应&#xff08;MDR&#xff09;调查中发现假冒 CAPTCHA 的案例激增。这些 CAPTCHA 通过钓鱼邮件、URL 重定向、恶意广告或 SEO 污染投放。所有观察到的案例均表现出类似行为&#xff1a;指导用户将恶意命令复制粘贴到 Windo…

2024-2025-2-《移动机器人设计与实践》-复习资料-8……

2024-2025-2-《移动机器人设计与实践》-复习资料-1-7-CSDN博客 08 移动机器人基础编程 单选题&#xff08;6题&#xff09; 在ROS中&#xff0c;用于移动机器人速度控制的消息类型通常是&#xff1f; A. std_msgs/StringB. geometry_msgs/TwistC. sensor_msgs/ImageD. nav_ms…

楼宇自控系统赋能设备管理智能化集中化,驱动建筑节能高效运行

在建筑行业追求可持续发展与高效运营的当下&#xff0c;传统建筑设备管理模式因信息分散、调控粗放等问题&#xff0c;导致能源浪费严重、设备维护成本高企。而楼宇自控系统凭借对建筑内各类设备的智能化、集中化管理能力&#xff0c;成为解决这些难题的关键。通过实时监测、智…