六、反向代理(原理 + 文件配置实例)
6.1 反向代理原理
核心定义
反向代理(Reverse Proxy)是指 Nginx 作为客户端请求的 "统一入口",接收客户端所有请求后,根据配置将请求转发到后端的业务服务器(如 Tomcat、Node.js),后端服务器处理完成后将响应结果返回给 Nginx,再由 Nginx 转发给客户端 的模式。
核心作用
- 隐藏后端服务:客户端仅能看到 Nginx 的 IP / 域名,无法直接访问后端服务器,提升安全性;
- 统一入口管理:所有请求通过 Nginx 转发,便于实现 SSL 终结、请求过滤、日志统计等统一配置;
- 缓解后端压力:Nginx 可缓存静态资源,无需后端服务器重复处理,同时实现负载均衡(后续章节详解);
- 解决跨域问题:通过 Nginx 转发请求,规避浏览器的跨域限制;
- 端口映射:客户端访问 80/443 端口(标准 HTTP/HTTPS 端口),Nginx 转发到后端非标准端口(如 8080、3000)。
工作流程
- 客户端发起请求(如
http://www.test.com/api),目标地址为 Nginx 的 IP / 域名; - Nginx 接收请求后,根据
location块的proxy_pass配置,识别后端目标服务器(如127.0.0.1:8080); - Nginx 将请求转发给后端服务器,同时传递客户端真实 IP、Host 等信息(通过
proxy_set_header配置); - 后端服务器处理请求,返回响应结果给 Nginx;
- Nginx 将响应结果转发给客户端,完成一次请求。
6.2 反向代理配置实例(转发到单个后端服务)
场景需求
- Nginx 服务器 IP:
192.168.1.100(监听 80 端口); - 后端 Tomcat 服务:
127.0.0.1:8080(本地部署,或远程192.168.1.101:8080); - 需求:访问
http://192.168.1.100/时,Nginx 反向代理到http://127.0.0.1:8080。
步骤 1:准备后端服务(Tomcat 已启动)
确保 Tomcat 正常运行,可通过 curl 127.0.0.1:8080 验证(返回 Tomcat 默认首页)。
步骤 2:Nginx 反向代理配置
编辑 Nginx 主配置文件或子配置文件(如 /usr/local/nginx/conf/nginx.conf),添加 server 块:
nginx
server {
listen 80;
server_name 192.168.1.100; # Nginx 服务器 IP 或域名
# 反向代理核心配置:匹配所有请求路径
location / {
proxy_pass http://127.0.0.1:8080; # 后端服务地址(必须加 http://,端口对应后端服务)
# 关键:传递客户端真实信息到后端(否则后端获取的 IP 是 Nginx 服务器 IP)
proxy_set_header Host $host; # 传递客户端请求的 Host 头(如 192.168.1.100)
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链 IP(多代理场景)
proxy_set_header X-Forwarded-Proto $scheme; # 传递请求协议(http/https)
# 代理连接超时配置
proxy_connect_timeout 60s; # Nginx 与后端连接超时时间
proxy_read_timeout 60s; # Nginx 读取后端响应超时时间
proxy_send_timeout 60s; # Nginx 发送请求到后端超时时间
}
# 访问日志配置(单独记录反向代理日志)
access_log /usr/local/nginx/logs/proxy.access.log main;
error_log /usr/local/nginx/logs/proxy.error.log warn;
}
步骤 3:验证配置并重载 Nginx
bash
运行
# 检查配置语法正确性
nginx -t
# 重载配置(不中断服务)
nginx -s reload
步骤 4:访问测试
- 浏览器访问
http://192.168.1.100,即可看到 Tomcat 默认首页(请求已由 Nginx 转发); - 查看 Tomcat 访问日志(
tomcat/logs/localhost_access_log.2025-xx-xx.txt),可看到客户端真实 IP(而非 Nginx 服务器 IP),说明proxy_set_header配置生效。
常见踩坑点
proxy_pass末尾是否加/:- 加
/:proxy_pass http://127.0.0.1:8080/;→ 访问/api时,转发到http://127.0.0.1:8080/api(路径拼接正确); - 不加
/:proxy_pass http://127.0.0.1:8080;→ 访问/api时,转发到http://127.0.0.1:8080/api(效果一致,推荐加/更清晰);
- 加
- 后端服务未启动 / 端口不通:Nginx 会返回 502 Bad Gateway,需通过
telnet 127.0.0.1:8080验证后端连通性; - 权限问题:Nginx 需有权限访问后端服务,防火墙需开放后端端口(如 8080)。
七、负载均衡
7.1 基本原理
核心定义
负载均衡(Load Balancing)是指 Nginx 作为 "请求分发器",将海量客户端请求均匀分发到多台后端服务器(如多台 Tomcat),避免单台服务器负载过高,提升系统并发能力和可用性 的模式。
核心作用
- 提高并发能力:多台后端服务器同时处理请求,总并发能力 = 单台服务器并发 × 服务器数量;
- 提升系统可用性:某台后端服务器故障时,Nginx 自动将请求转发到其他正常服务器,避免服务中断;
- 负载均衡:根据服务器性能(如 CPU、内存)分配不同比例的请求(通过权重配置);
- 扩展灵活:新增后端服务器时,仅需修改 Nginx 配置,无需修改客户端代码。
工作流程
- 客户端发起请求到 Nginx(负载均衡入口);
- Nginx 解析请求,根据
upstream模块定义的 "负载均衡集群" 和 "分发策略",选择一台后端服务器; - Nginx 将请求转发到选中的后端服务器;
- 后端服务器处理请求后,将响应结果返回给 Nginx;
- Nginx 将响应结果转发给客户端;
- 若某台后端服务器故障,Nginx 检测到后不再向其分发请求,故障恢复后自动恢复分发。
7.2 常见的负载均衡策略
Nginx 支持多种负载均衡策略,默认使用「轮询」,可根据业务需求选择:
| 策略类型 | 核心逻辑 | 适用场景 | 配置示例 |
|---|---|---|---|
| 1. 轮询(默认) | 请求按顺序依次分发到后端服务器,各服务器负载均匀(前提是服务器性能一致) | 后端服务器性能相同、无会话保持需求 | upstream backend { server 192.168.1.101:8080; server 192.168.1.102:8080; } |
| 2. 权重(weight) | 为后端服务器设置权重(数值越大,分配的请求越多),性能强的服务器权重越高 | 后端服务器性能不一致(如 8 核服务器权重 2,4 核权重 1) | upstream backend { server 192.168.1.101:8080 weight=2; server 192.168.1.102:8080 weight=1; } |
| 3. IP 哈希(ip_hash) | 按客户端 IP 地址哈希计算,同一客户端始终访问同一台后端服务器 | 需会话保持的场景(如登录状态、购物车) | upstream backend { ip_hash; server 192.168.1.101:8080; server 192.168.1.102:8080; } |
| 4. URL 哈希(url_hash) | 按请求 URL 哈希计算,同一 URL 始终访问同一台后端服务器 | 静态资源缓存、API 结果缓存场景(需安装第三方模块) | upstream backend { url_hash; server 192.168.1.101:8080; server 192.168.1.102:8080; } |
| 5. 最少连接数(least_conn) | 优先将请求分发到当前连接数最少的后端服务器 | 后端服务器处理请求时间差异较大的场景(如长连接服务) | upstream backend { least_conn; server 192.168.1.101:8080; server 192.168.1.102:8080; } |
补充说明
- IP 哈希 / URL 哈希可解决 "会话共享" 问题,但需注意:后端服务器故障时,客户端会话会丢失(需配合会话集群如 Redis 优化);
- URL 哈希需安装第三方模块
ngx_http_upstream_hash_module(编译 Nginx 时添加--with-http_upstream_hash_module)。
7.3 负载均衡配置实例(基础版)
场景需求
- Nginx 负载均衡入口:
192.168.1.100:80; - 后端 Tomcat 集群(2 台服务器):
- 服务器 1:
192.168.1.101:8080(权重 2); - 服务器 2:
192.168.1.102:8080(权重 1);
- 服务器 1:
- 负载策略:权重分发(服务器 1 接收 2/3 请求,服务器 2 接收 1/3 请求)。
步骤 1:准备后端 Tomcat 集群
确保 2 台 Tomcat 均正常运行,且已部署相同的 Web 应用(如 test.war),可通过 curl 192.168.1.101:8080/test 和 curl 192.168.1.102:8080/test 验证。
步骤 2:Nginx 负载均衡配置
编辑 /usr/local/nginx/conf/nginx.conf,在 http 块中添加 upstream 集群配置,再配置 server 块:
nginx
http {
# ... 其他原有配置(如 gzip、日志格式等)...
# 1. 定义负载均衡集群(backend 为集群名,自定义)
upstream tomcat_cluster {
server 192.168.1.101:8080 weight=2; # 服务器1,权重2
server 192.168.1.102:8080 weight=1; # 服务器2,权重1
}
# 2. 配置负载均衡入口(客户端访问入口)
server {
listen 80;
server_name 192.168.1.100;
location / {
proxy_pass http://tomcat_cluster; # 转发到负载均衡集群(集群名必须与 upstream 一致)
# 传递客户端信息(同反向代理配置)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log /usr/local/nginx/logs/lb.access.log main;
error_log /usr/local/nginx/logs/lb.error.log warn;
}
}
步骤 3:验证配置并重载 Nginx
bash
运行
nginx -t && nginx -s reload
步骤 4:访问测试
- 浏览器多次访问
http://192.168.1.100/test,观察 2 台 Tomcat 的访问日志:- Tomcat 1(192.168.1.101)的日志条数约为 Tomcat 2 的 2 倍,符合权重配置;
- 关闭其中一台 Tomcat,再次访问,请求会自动转发到另一台正常服务器,服务不中断。
7.4 健康检查(后端服务器状态检测)
Nginx 提供 被动健康检查 (默认支持)和 主动健康检查(需安装第三方模块),用于检测后端服务器是否正常,自动剔除故障节点。
7.4.1 被动健康检查(默认启用)
Nginx 通过观察后端服务器的响应状态,判断其是否健康,无需额外配置,核心参数如下:
| 参数 | 作用 | 默认值 |
|---|---|---|
max_fails |
规定时间内(fail_timeout)请求失败的最大次数,超过则标记为故障节点 |
1 |
fail_timeout |
故障节点的标记时间(期间不再分发请求),超时后自动重试 | 10s |
backup |
备用节点,仅当所有主节点故障时才接收请求 | - |
down |
手动标记节点为不可用(下线维护时使用) | - |
配置示例(优化被动健康检查)
nginx
upstream tomcat_cluster {
server 192.168.1.101:8080 weight=2 max_fails=3 fail_timeout=30s; # 30s内失败3次标记为故障,30s后重试
server 192.168.1.102:8080 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.1.103:8080 backup; # 备用节点
# server 192.168.1.104:8080 down; # 手动下线节点
}
7.4.2 主动健康检查(第三方模块)
被动健康检查依赖客户端请求触发,故障检测存在延迟,主动健康检查可由 Nginx 主动发送检测请求,实时判断后端状态(需安装 ngx_http_upstream_check_module 模块)。
安装模块(编译 Nginx 时添加)
bash
运行
# 下载模块源码(需与 Nginx 版本兼容)
wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/master.zip
unzip master.zip
# 重新编译 Nginx(添加模块)
cd nginx-1.24.0
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--add-module=../nginx_upstream_check_module-master # 模块路径
make && make install
主动健康检查配置示例
nginx
upstream tomcat_cluster {
server 192.168.1.101:8080 weight=2;
server 192.168.1.102:8080 weight=1;
# 主动健康检查配置
check interval=3000 rise=2 fall=3 timeout=1000 type=http; # 每3s检测1次,成功2次标记正常,失败3次标记故障,超时1s
check_http_send "HEAD / HTTP/1.0\r\nHost: localhost\r\n\r\n"; # 检测请求
check_http_expect_alive http_2xx http_3xx; # 认为健康的响应状态码
}
# 配置健康检查状态页面(可通过浏览器查看后端节点状态)
server {
listen 80;
server_name 192.168.1.100;
location /status {
check_status; # 启用状态页面
access_log off;
allow 192.168.1.0/24; # 仅允许内网访问
deny all;
}
}
验证
- 访问
http://192.168.1.100/status,可查看后端节点的健康状态(UP/DOWN)、权重、请求数等信息。
八、后端 Tomcat(概念原理→实例部署)
8.1 Tomcat 概念与原理
核心定义
Tomcat 是 Apache 基金会开发的 开源 Java Servlet 容器,同时支持 JSP(JavaServer Pages)解析,是运行 Java Web 应用(.war 包)的核心服务器,也是企业级开发中最常用的 Java 后端服务器之一。
核心功能
- Servlet 容器:运行 Servlet 程序(Java 编写的服务器端程序,处理客户端动态请求);
- JSP 引擎:解析和执行 JSP 页面(嵌入 Java 代码的 HTML 页面,动态生成网页内容);
- HTTP 服务器:内置简单的 HTTP 服务器,可直接接收 HTTP 请求(默认端口 8080);
- 支持集群:可与 Nginx 配合实现负载均衡,支持会话共享(需配置)。
Tomcat 架构(核心组件)
Tomcat 采用分层架构,核心组件从外到内依次为:
plaintext
Server(服务器)→ Service(服务)→ Connector(连接器)+ Engine(引擎)→ Host(虚拟主机)→ Context(Web应用)
- Server:Tomcat 最顶层组件,代表整个 Tomcat 服务器,可包含多个 Service;
- Service:绑定一个 Engine 和多个 Connector,负责将 Connector 接收的请求转发给 Engine;
- Connector:监听指定端口(如 8080 HTTP 端口、8443 HTTPS 端口),接收客户端请求,转换为 Engine 可处理的格式;
- Engine:Tomcat 的核心引擎,负责处理 Service 转发的请求,将请求分发到对应的 Host;
- Host :虚拟主机,对应一个域名(如
www.test.com),可部署多个 Web 应用; - Context :Web 应用上下文,对应一个具体的 Java Web 应用(如
test.war),是最小部署单元。
工作流程(客户端访问 Tomcat 动态应用)
- 客户端发起 HTTP 请求(如
http://192.168.1.101:8080/test/hello); - Tomcat 的 Connector(监听 8080 端口)接收请求,解析 HTTP 协议;
- Connector 将请求转发给对应的 Service 的 Engine;
- Engine 根据请求的 Host 头,转发给对应的 Host;
- Host 根据请求路径(
/test),转发给对应的 Context(Web 应用test); - Context 中的 Servlet 程序处理请求,生成动态响应结果;
- 响应结果按原路径返回给客户端。
8.2 Tomcat 实例部署(CentOS 7)
前置依赖:安装 JDK
Tomcat 依赖 Java 运行环境(JDK),需先安装 JDK 8+(推荐 JDK 8,兼容性最好)。
步骤 1:安装 JDK
bash
运行
# 1. 下载 JDK 8(官网地址:https://www.oracle.com/java/technologies/downloads/,需注册账号)
# 上传 JDK 安装包到服务器(如 jdk-8u391-linux-x64.tar.gz)
tar -zxvf jdk-8u391-linux-x64.tar.gz -C /usr/local/
mv /usr/local/jdk1.8.0_391 /usr/local/jdk8
# 2. 配置环境变量
cat >> /etc/profile << EOF
export JAVA_HOME=/usr/local/jdk8
export JRE_HOME=\$JAVA_HOME/jre
export PATH=\$PATH:\$JAVA_HOME/bin:\$JRE_HOME/bin
export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar
EOF
# 3. 生效环境变量
source /etc/profile
# 4. 验证 JDK 安装
java -version # 输出:java version "1.8.0_391" 即成功
步骤 2:安装 Tomcat(单实例)
bash
运行
# 1. 下载 Tomcat 9 稳定版(官网地址:https://tomcat.apache.org/download-90.cgi)
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.85/bin/apache-tomcat-9.0.85.tar.gz
# 2. 解压并安装
tar -zxvf apache-tomcat-9.0.85.tar.gz -C /usr/local/
mv /usr/local/apache-tomcat-9.0.85 /usr/local/tomcat9
# 3. 简化 Tomcat 命令(创建软链接)
ln -s /usr/local/tomcat9/bin/startup.sh /usr/bin/tomcat-start
ln -s /usr/local/tomcat9/bin/shutdown.sh /usr/bin/tomcat-stop
ln -s /usr/local/tomcat9/bin/catalina.sh /usr/bin/tomcat-restart
步骤 3:配置 Tomcat
3.1 配置端口(避免冲突)
编辑 Tomcat 核心配置文件 server.xml:
bash
运行
vim /usr/local/tomcat9/conf/server.xml
核心端口配置(默认无需修改,若端口冲突可调整):
xml
<!-- HTTP 端口(默认 8080) -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- 关闭端口(默认 8005) -->
<Server port="8005" shutdown="SHUTDOWN">
<!-- AJP 端口(默认 8009,与 Nginx 通信时可启用) -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
3.2 配置管理员用户(用于访问 Tomcat 管理后台)
编辑 tomcat-users.xml:
bash
运行
vim /usr/local/tomcat9/conf/tomcat-users.xml
在 <tomcat-users> 标签内添加:
xml
<role rolename="manager-gui"/> <!-- 管理应用程序的角色 -->
<role rolename="admin-gui"/> <!-- 管理虚拟主机的角色 -->
<user username="admin" password="123456" roles="manager-gui,admin-gui"/> <!-- 用户名/密码 -->
3.3 允许远程访问管理后台(默认仅允许本地访问)
bash
运行
# 编辑 manager 应用的访问控制文件
vim /usr/local/tomcat9/webapps/manager/META-INF/context.xml
# 注释掉 IP 限制配置(或添加允许的 IP 网段)
<!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->
# 同理,编辑 host-manager 应用的访问控制文件
vim /usr/local/tomcat9/webapps/host-manager/META-INF/context.xml
# 注释掉 IP 限制配置
步骤 4:启动 Tomcat 并验证
bash
运行
# 1. 启动 Tomcat
tomcat-start # 或 /usr/local/tomcat9/bin/startup.sh
# 2. 查看启动日志(验证是否启动成功)
tail -f /usr/local/tomcat9/logs/catalina.out
# 日志输出 "Server startup in xxx ms" 即启动成功
# 3. 防火墙开放 8080 端口(若防火墙开启)
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
# 4. 访问验证
# 浏览器访问:http://192.168.1.101:8080 → 看到 Tomcat 默认首页
# 访问管理后台:http://192.168.1.101:8080/manager/html → 输入用户名 admin/密码 123456 登录
步骤 5:部署 Web 应用(.war 包)
将 Java Web 应用包(如 test.war)上传到 Tomcat 的 webapps 目录,Tomcat 会自动解压部署:
bash
运行
# 上传 test.war 到 webapps 目录
cp test.war /usr/local/tomcat9/webapps/
# 部署成功后,访问:http://192.168.1.101:8080/test → 即可访问应用
8.3 Tomcat 多实例部署(负载均衡必备)
负载均衡需要多个 Tomcat 节点,以下部署 2 个 Tomcat 实例(端口分别为 8080 和 8081):
步骤 1:复制 Tomcat 目录(创建第二个实例)
bash
运行
# 复制第一个实例(8080)为第二个实例(8081)
cp -r /usr/local/tomcat9 /usr/local/tomcat9-8081
步骤 2:修改第二个实例的端口(避免冲突)
编辑 tomcat9-8081/conf/server.xml,修改 3 个核心端口:
xml
<!-- 关闭端口:从 8005 改为 8006 -->
<Server port="8006" shutdown="SHUTDOWN">
<!-- HTTP 端口:从 8080 改为 8081 -->
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- AJP 端口:从 8009 改为 8010 -->
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
步骤 3:启动第二个实例并验证
bash
运行
# 启动第二个实例
/usr/local/tomcat9-8081/bin/startup.sh
# 查看日志
tail -f /usr/local/tomcat9-8081/logs/catalina.out
# 访问验证:http://192.168.1.101:8081 → 正常显示 Tomcat 首页
步骤 4:部署不同标识的 Web 应用(便于测试负载均衡)
为 2 个 Tomcat 实例部署带有不同标识的应用,方便后续验证负载均衡分发效果:
bash
运行
# 为 Tomcat 8080 部署应用(标识:Tomcat-8080)
cat > /usr/local/tomcat9/webapps/test/index.jsp << EOF
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head><title>Tomcat 实例</title></head>
<body><h1>Hello! 这是 Tomcat-8080 实例</h1></body>
</html>
EOF
# 为 Tomcat 8081 部署应用(标识:Tomcat-8081)
cat > /usr/local/tomcat9-8081/webapps/test/index.jsp << EOF
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head><title>Tomcat 实例</title></head>
<body><h1>Hello! 这是 Tomcat-8081 实例</h1></body>
</html>
EOF
九、部署反向代理与负载均衡(多个实例从易到难)
实例 1:反向代理单个 Tomcat 实例(入门级)
场景需求
- 客户端访问
http://192.168.1.100(Nginx 80 端口); - Nginx 反向代理到
http://192.168.1.101:8080(单个 Tomcat 实例); - 实现:隐藏 Tomcat 端口,统一访问入口。
配置步骤
- 确保 Tomcat 8080 实例正常运行(
http://192.168.1.101:8080/test可访问); - 编辑 Nginx 配置文件
/usr/local/nginx/conf/nginx.conf:
nginx
http {
# ... 其他配置 ...
server {
listen 80;
server_name 192.168.1.100;
# 反向代理到单个 Tomcat
location / {
proxy_pass http://192.168.1.101:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 静态资源缓存(Tomcat 中的静态资源由 Nginx 缓存)
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
proxy_pass http://192.168.1.101:8080;
proxy_cache_valid 200 302 1d; # 缓存 1 天
proxy_cache_valid 404 1m;
}
}
}
- 重载 Nginx:
nginx -t && nginx -s reload; - 验证:访问
http://192.168.1.100/test,显示Tomcat-8080 实例,URL 无端口号。
实例 2:负载均衡(轮询)多个 Tomcat 实例(基础级)
场景需求
- Nginx 作为负载均衡入口:
http://192.168.1.100; - 后端 2 个 Tomcat 实例:
192.168.1.101:8080、192.168.1.101:8081; - 负载策略:轮询(请求依次分发到 2 个实例)。
配置步骤
- 确保 2 个 Tomcat 实例均正常运行,
/test应用可访问; - 编辑 Nginx 配置文件:
nginx
http {
# ... 其他配置 ...
# 1. 定义 Tomcat 负载均衡集群(轮询策略)
upstream tomcat_cluster {
server 192.168.1.101:8080;
server 192.168.1.101:8081;
}
# 2. 负载均衡入口配置
server {
listen 80;
server_name 192.168.1.100;
location / {
proxy_pass http://tomcat_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 60s;
}
}
}
- 重载 Nginx:
nginx -t && nginx -s reload; - 验证:
- 浏览器多次访问
http://192.168.1.100/test,页面交替显示Tomcat-8080和Tomcat-8081,符合轮询策略; - 关闭其中一个 Tomcat 实例,再次访问,请求仅分发到正常实例,服务不中断。
- 浏览器多次访问
实例 3:负载均衡(权重 + IP 哈希 + 健康检查)(进阶级)
场景需求
- 后端 3 个 Tomcat 实例:
- 实例 1:
192.168.1.101:8080(高性能服务器,权重 3); - 实例 2:
192.168.1.101:8081(普通服务器,权重 2); - 实例 3:
192.168.1.102:8080(备用服务器,backup);
- 实例 1:
- 负载策略:IP 哈希(会话保持)+ 权重(性能适配);
- 健康检查:30s 内失败 3 次标记为故障,30s 后重试。
配置步骤
- 准备 3 个 Tomcat 实例(实例 3 部署在
192.168.1.102:8080); - 编辑 Nginx 配置文件:
nginx
http {
# ... 其他配置 ...
# 1. 负载均衡集群(IP哈希+权重+健康检查)
upstream tomcat_cluster {
ip_hash; # 会话保持(同一客户端始终访问同一实例)
server 192.168.1.101:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.101:8081 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.1.102:8080 backup; # 备用实例
}
# 2. 负载均衡入口配置
server {
listen 80;
server_name 192.168.1.100;
location / {
proxy_pass http://tomcat_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 60s;
}
# 访问日志(记录客户端IP、转发的后端实例)
log_format lb_log '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$upstream_addr"'; # $upstream_addr 记录后端实例地址
access_log /usr/local/nginx/logs/lb-advance.access.log lb_log;
}
}
- 重载 Nginx:
nginx -t && nginx -s reload; - 验证:
- 同一客户端多次访问,始终显示同一个 Tomcat 实例(IP 哈希生效);
- 多客户端访问,实例 1 接收的请求数约为实例 2 的 1.5 倍(权重生效);
- 停止实例 1 和实例 2,访问请求自动转发到实例 3(备用实例生效);
- 查看日志
lb-advance.access.log,可看到$upstream_addr字段记录了转发的后端实例地址。
实例 4:动静分离 + 负载均衡(企业级)
场景需求
- 静态资源(HTML、CSS、JS、图片):Nginx 直接处理(
/usr/local/nginx/static目录); - 动态请求(JSP、Servlet、API):Nginx 负载均衡转发到 2 个 Tomcat 实例;
- 实现:Nginx 处理静态资源(高效),Tomcat 专注处理动态请求(减轻压力)。
配置步骤
步骤 1:准备静态资源
bash
运行
# 创建 Nginx 静态资源目录
mkdir -p /usr/local/nginx/static/{css,js,images}
# 上传静态资源(或创建测试文件)
echo "body { background: #f0f0f0; }" > /usr/local/nginx/static/css/style.css
cp /path/to/test.jpg /usr/local/nginx/static/images/
步骤 2:Tomcat 动态应用准备
确保 2 个 Tomcat 实例的 /test 应用包含动态接口(如 http://192.168.1.101:8080/test/api/user)。
步骤 3:Nginx 配置(动静分离 + 负载均衡)
nginx
http {
# ... 其他配置(gzip、日志格式等)...
# 1. 负载均衡集群(轮询策略)
upstream tomcat_cluster {
server 192.168.1.101:8080;
server 192.168.1.101:8081;
}
# 2. 动静分离+负载均衡配置
server {
listen 80;
server_name 192.168.1.100;
charset utf-8;
# ① 静态资源:Nginx 直接处理(路径 /static/)
location /static/ {
root /usr/local/nginx/; # 静态资源根目录
expires 7d; # 浏览器缓存 7 天
access_log off; # 关闭静态资源访问日志
}
# ② 动态请求:转发到 Tomcat 负载均衡集群
location ~* \.(jsp|do|action|api)$ { # 匹配动态请求后缀
proxy_pass http://tomcat_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 60s;
}
# ③ 根路径:返回静态首页
location / {
root /usr/local/nginx/static;
index index.html;
}
access_log /usr/local/nginx/logs/static-lb.access.log main;
error_log /usr/local/nginx/logs/static-lb.error.log warn;
}
}
步骤 4:创建静态首页(引用静态资源 + 动态接口)
bash
运行
cat > /usr/local/nginx/static/index.html << EOF
<!DOCTYPE html>
<html>
<head>
<title>动静分离+负载均衡示例</title>
<link rel="stylesheet" href="/static/css/style.css"> <!-- Nginx 处理静态 CSS -->
</head>
<body>
<h1>动静分离示例</h1>
<img src="/static/images/test.jpg" alt="静态图片"> <!-- Nginx 处理静态图片 -->
<div>动态接口响应:<script src="/test/api/user"></script></div> <!-- Tomcat 处理动态 API -->
</body>
</html>
EOF
步骤 5:验证
- 重载 Nginx:
nginx -t && nginx -s reload; - 访问
http://192.168.1.100:- 静态 CSS 和图片由 Nginx 直接返回(查看 Nginx 日志,无转发记录);
- 动态 API
/test/api/user由 Tomcat 处理,多次刷新页面,动态内容交替显示 2 个 Tomcat 实例的响应(负载均衡生效); - 查看 Tomcat 日志,仅接收动态请求,无静态资源请求(减轻 Tomcat 压力)。
核心价值
- 静态资源访问速度提升(Nginx 处理静态资源效率是 Tomcat 的 10 倍以上);
- 动态请求负载均衡,提升并发能力;
- 资源隔离,静态资源故障不影响动态服务,反之亦然。