Nginx+Tomcat 负载均衡、动静分离
目录
一、Tomcat 和 Nginx
(1)Tomcat 概述
(2)Nginx 概述
(3)应用场景
(4)动静分离原理
(5)nginx负载均衡的原理
(6)nginx动静分离的原理
二、案例
(1)概述
(2)环境部署
一、Tomcat 和 Nginx
(1)Tomcat 概述
- 定位:Java Servlet 容器( Jakarta EE 实现之一),专注 动态 Java 应用部署(如 Servlet、JSP、Spring Boot 应用)。
- 核心能力:
- 支持 Java 生态(Spring、Hibernate 等框架无缝集成),作为嵌入式服务器(如 Spring Boot 默认内嵌)。
- 处理动态请求(数据库交互、业务逻辑计算等),通过多线程模型(BIO/NIO/APR 模式)处理并发。
- 场景:企业级 Java 系统(金融、后端服务)、微服务架构中的动态服务节点。
(2)Nginx 概述
- 定位:高性能 HTTP 服务器 + 反向代理 + 负载均衡器,主打 静态资源处理与 高并发流量管理。
- 核心能力:
- 静态资源加速(HTML、CSS、JS、图片等),通过事件驱动(异步非阻塞)模型,支持 10 万 + 并发连接,资源消耗极低。
- 负载均衡(轮询、权重、IP 哈希等策略)、反向代理(隐藏后端服务 IP,增强安全)、缓存(静态资源缓存、动态内容缓存)。
- 场景:高并发网站(电商、资讯)、前后端分离架构的前端代理、CDN 边缘节点、微服务网关(服务网关(API 路由)。
(3)应用场景
- 动静分离架构:Nginx 处理静态资源(直接返回或缓存),Tomcat 处理动态请求(如
/api
接口、JSP 页面),减少 Tomcat 负载,提升整体性能。 - 负载均衡集群:Nginx 作为前端负载均衡器,将请求分发到多台 Tomcat 服务器(横向扩展),实现 高可用(故障节点自动剔除)。
- 安全加固:Nginx 作为反向代理,屏蔽 Tomcat 直接暴露(如 Tomcat 的 8080 端口仅内网访问),并通过 Nginx 配置 限流、WAF(Web 应用防火墙) 增强安全。
(4)动静分离原理
- 分流逻辑:
- 静态资源:Nginx 通过
location
配置匹配文件扩展名(如*.css
、*.js
、*.png
),直接从本地文件系统或缓存返回(无需转发到 Tomcat)。 - 动态请求:Nginx 将
*.jsp
、/api
等动态路径的请求,通过反向代理(如proxy_pass
)转发到 Tomcat 处理。
- 静态资源:Nginx 通过
- 优势:
- 静态资源由 Nginx 高速处理(减少 Tomcat 线程占用),动态请求专注业务逻辑,实现 资源分工,提升整体吞吐量。
- 支持静态资源缓存(
proxy_cache
),进一步降低后端压力。
(5)nginx负载均衡的原理
- 策略:
- 轮询(默认):请求按顺序分发到后端 Tomcat 节点,适用于无状态服务。
- 权重(weight):按节点性能分配请求比例(如高性能服务器权重高)。
- IP 哈希(ip_hash):同客户端 IP 固定访问同一 Tomcat 节点(解决会话粘性问题)。
- 实现:
- 配置后端服务列表(
upstream
块),Nginx 定期检查节点健康(health_check
),自动隔离故障节点,确保流量仅分发到正常节点。
- 配置后端服务列表(
- 价值:提升系统 扩展性(横向扩展 Tomcat 节点)与 容错性(单个节点故障不影响整体服务)。
(6)nginx动静分离的原理
核心配置示例server {listen 80;server_name example.com;# 静态资源处理(直接返回,无需转发)location ~* \.(css|js|png|jpg|gif)$ {root /path/to/static/files; # 静态资源目录expires 30d; # 缓存过期时间}# 动态请求转发到 Tomcat(如 8080 端口)location / {proxy_pass http://tomcat_server:8080; # Tomcat 集群或单节点proxy_set_header Host $host; # 保留请求头信息}
}
- 原理总结:通过 正则匹配 分离动静请求,静态资源由 Nginx 直接响应(利用其静态处理优势),动态请求转发至 Tomcat(专注动态逻辑),实现 I/O 密集型(静态) 与 CPU 密集型(动态) 任务的高效分工。
二、案例
(1)概述
Tomcat 单节点易单点故障、难抗高并发,不适合生产。Nginx 作为 HTTP 服务器,高并发(5 万 +)、静态资源处理强、资源消耗低,常作反向代理和负载均衡器。其处理静态文件(图、HTML、CSS、JS 等),减轻 Tomcat 动态请求压力(Tomcat 动态处理效率弱)。通过 Nginx+Tomcat 架构,Nginx 负责静态资源、负载均衡,Tomcat 专注动态内容,二者互补,提升站点性能与稳定性,解决单 Tomcat 的架构缺陷,适用于生产环境的 Web 站点部署
(2)环境部署
- Tomcat 部署(两台)
--关闭防火墙 systemctl stop firewalld setenforce 0--安装JDK和Tomcat dnf -y install java java -version #检查 tar zxvf apache-tomcat-9.0.9.tar.gz #软件包安装(提前准备) mv apache-tomacat-9.0.8 /usr/local/tomcat--启动tomcat /usr/local/tomcat/bin/startup.sh netstat -anpt | grep java tcp6 0 0 127.0.0.1:8005 :::* LISTEN 2250/java tcp6 0 0 :::8009 :::* LISTEN 2250/java tcp6 0 0 :::8080 :::* LISTEN 2250/java ###解析端口 8005 端口 接收关闭服务器的命令,只有在服务器启动时才会开放 8009 端口 AJP端口用于和 Web 服务器进行通信,借助 AJP 协议,能够实现负载均衡或者静态资源的缓存 8080 端口 ava Web 应用最常用的端口--部署网站 mkdir -p /web/webapp1 cd /web/webapp1 vim index.jsp #添加 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head><title>JSP test1 page</title> </head><body><% out.println("动态页面 1,http://www.test1.com");%></body><body><div>动态页面的图片 1</div><br><img src="logo.png"></body> </html>--定义自己的网站目录(在配置文件中添加) cd /usr/local/tomcat/conf/server.xml <Context docBase="/web/webapp1" path=""></Context>--重启 /usr/local/tomcat/bin/shutdown.sh /usr/local/tomcat/bin/startup.sh
- nginx部署
安装nginx--改配置文件(指定代理处理) 用于定义反向代理设置 upstream my_tomcat { #上游服务器组server 192.168.10.102:8080 weight=1;server 192.168.10.103:8080 weight=1; } server { #服务器配置块location ~ .*\.jsp$ {proxy_set_header HOST $host #代理请求头中的 “HOST” 字段为客户端请求中的主机名proxy_pass http://my_tomcat; #匹配的请求转发到“my_tomcat” }location ~ .*\.(png|gif|jpg|jpeg)$ {root /usr/local/nginx/html/img; #指定图片路径位置expires 30d; #过期时间,缓存的时间 }
关于日志的设置(可选)
#让后端服务器能通过日志看到真正的访问IP,默认只能看到代理的IP(添加以下内容) nginx: location ~ .*\.jsp$ {proxy_set_header X-Real-IP $remote_addr; # 记录客户端真实IP(单级代理)proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 记录完整代理链IPproxy_set_header X-Forwarded-Proto $scheme; # 传递协议类型(HTTP/HTTPS) } 关键头信息说明: X-Real-IP:记录真实客户端 IP(适用于单级代理,如 Nginx 直接代理 Tomcat)。 X-Forwarded-For:记录代理链中的所有 IP(格式为客户端IP, 代理1IP, 代理2IP,...)。 X-Proxy-IP:记录当前代理的 IP(即 Nginx 的 IP)。tomcat: vim /usr/local/tomcat/conf/server.xml <Connector><Valve className="org.apache.catalina.valves.RemoteIpValve"remoteIpHeader="X-Real-IP" <!-- 解析X-Real-IP头作为客户端真实IP -->protocolHeader="X-Forwarded-Proto" <!-- 可选:处理HTTPS协议头 -->internalProxies="127\.0\.0\.1" <!-- 信任的代理IP(Nginx的IP) -->/> <Host> <Valve className="org.apache.catalina.valves.AccessLogValve"directory="logs"prefix="localhost_access_log."suffix=".txt"pattern="%a %{X-Real-IP}i %h %l %u %t "%r" %s %b" />