Nginx 深度解析:反向代理与负载均衡、后端Tomcat

六、反向代理(原理 + 文件配置实例)

6.1 反向代理原理

核心定义

反向代理(Reverse Proxy)是指 Nginx 作为客户端请求的 "统一入口",接收客户端所有请求后,根据配置将请求转发到后端的业务服务器(如 Tomcat、Node.js),后端服务器处理完成后将响应结果返回给 Nginx,再由 Nginx 转发给客户端 的模式。

核心作用

  1. 隐藏后端服务:客户端仅能看到 Nginx 的 IP / 域名,无法直接访问后端服务器,提升安全性;
  2. 统一入口管理:所有请求通过 Nginx 转发,便于实现 SSL 终结、请求过滤、日志统计等统一配置;
  3. 缓解后端压力:Nginx 可缓存静态资源,无需后端服务器重复处理,同时实现负载均衡(后续章节详解);
  4. 解决跨域问题:通过 Nginx 转发请求,规避浏览器的跨域限制;
  5. 端口映射:客户端访问 80/443 端口(标准 HTTP/HTTPS 端口),Nginx 转发到后端非标准端口(如 8080、3000)。

工作流程

  1. 客户端发起请求(如 http://www.test.com/api),目标地址为 Nginx 的 IP / 域名;
  2. Nginx 接收请求后,根据 location 块的 proxy_pass 配置,识别后端目标服务器(如 127.0.0.1:8080);
  3. Nginx 将请求转发给后端服务器,同时传递客户端真实 IP、Host 等信息(通过 proxy_set_header 配置);
  4. 后端服务器处理请求,返回响应结果给 Nginx;
  5. 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 配置生效。

常见踩坑点

  1. 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(效果一致,推荐加 / 更清晰);
  2. 后端服务未启动 / 端口不通:Nginx 会返回 502 Bad Gateway,需通过 telnet 127.0.0.1:8080 验证后端连通性;
  3. 权限问题:Nginx 需有权限访问后端服务,防火墙需开放后端端口(如 8080)。

七、负载均衡

7.1 基本原理

核心定义

负载均衡(Load Balancing)是指 Nginx 作为 "请求分发器",将海量客户端请求均匀分发到多台后端服务器(如多台 Tomcat),避免单台服务器负载过高,提升系统并发能力和可用性 的模式。

核心作用

  1. 提高并发能力:多台后端服务器同时处理请求,总并发能力 = 单台服务器并发 × 服务器数量;
  2. 提升系统可用性:某台后端服务器故障时,Nginx 自动将请求转发到其他正常服务器,避免服务中断;
  3. 负载均衡:根据服务器性能(如 CPU、内存)分配不同比例的请求(通过权重配置);
  4. 扩展灵活:新增后端服务器时,仅需修改 Nginx 配置,无需修改客户端代码。

工作流程

  1. 客户端发起请求到 Nginx(负载均衡入口);
  2. Nginx 解析请求,根据 upstream 模块定义的 "负载均衡集群" 和 "分发策略",选择一台后端服务器;
  3. Nginx 将请求转发到选中的后端服务器;
  4. 后端服务器处理请求后,将响应结果返回给 Nginx;
  5. Nginx 将响应结果转发给客户端;
  6. 若某台后端服务器故障,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 接收 2/3 请求,服务器 2 接收 1/3 请求)。

步骤 1:准备后端 Tomcat 集群

确保 2 台 Tomcat 均正常运行,且已部署相同的 Web 应用(如 test.war),可通过 curl 192.168.1.101:8080/testcurl 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 后端服务器之一。

核心功能

  1. Servlet 容器:运行 Servlet 程序(Java 编写的服务器端程序,处理客户端动态请求);
  2. JSP 引擎:解析和执行 JSP 页面(嵌入 Java 代码的 HTML 页面,动态生成网页内容);
  3. HTTP 服务器:内置简单的 HTTP 服务器,可直接接收 HTTP 请求(默认端口 8080);
  4. 支持集群:可与 Nginx 配合实现负载均衡,支持会话共享(需配置)。

Tomcat 架构(核心组件)

Tomcat 采用分层架构,核心组件从外到内依次为:

plaintext

复制代码
Server(服务器)→ Service(服务)→ Connector(连接器)+ Engine(引擎)→ Host(虚拟主机)→ Context(Web应用)
  1. Server:Tomcat 最顶层组件,代表整个 Tomcat 服务器,可包含多个 Service;
  2. Service:绑定一个 Engine 和多个 Connector,负责将 Connector 接收的请求转发给 Engine;
  3. Connector:监听指定端口(如 8080 HTTP 端口、8443 HTTPS 端口),接收客户端请求,转换为 Engine 可处理的格式;
  4. Engine:Tomcat 的核心引擎,负责处理 Service 转发的请求,将请求分发到对应的 Host;
  5. Host :虚拟主机,对应一个域名(如 www.test.com),可部署多个 Web 应用;
  6. Context :Web 应用上下文,对应一个具体的 Java Web 应用(如 test.war),是最小部署单元。

工作流程(客户端访问 Tomcat 动态应用)

  1. 客户端发起 HTTP 请求(如 http://192.168.1.101:8080/test/hello);
  2. Tomcat 的 Connector(监听 8080 端口)接收请求,解析 HTTP 协议;
  3. Connector 将请求转发给对应的 Service 的 Engine;
  4. Engine 根据请求的 Host 头,转发给对应的 Host;
  5. Host 根据请求路径(/test),转发给对应的 Context(Web 应用 test);
  6. Context 中的 Servlet 程序处理请求,生成动态响应结果;
  7. 响应结果按原路径返回给客户端。

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 端口,统一访问入口。

配置步骤

  1. 确保 Tomcat 8080 实例正常运行(http://192.168.1.101:8080/test 可访问);
  2. 编辑 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;
        }
    }
}
  1. 重载 Nginx:nginx -t && nginx -s reload
  2. 验证:访问 http://192.168.1.100/test,显示 Tomcat-8080 实例,URL 无端口号。

实例 2:负载均衡(轮询)多个 Tomcat 实例(基础级)

场景需求

  • Nginx 作为负载均衡入口:http://192.168.1.100
  • 后端 2 个 Tomcat 实例:192.168.1.101:8080192.168.1.101:8081
  • 负载策略:轮询(请求依次分发到 2 个实例)。

配置步骤

  1. 确保 2 个 Tomcat 实例均正常运行,/test 应用可访问;
  2. 编辑 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;
        }
    }
}
  1. 重载 Nginx:nginx -t && nginx -s reload
  2. 验证:
    • 浏览器多次访问 http://192.168.1.100/test,页面交替显示 Tomcat-8080Tomcat-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);
  • 负载策略:IP 哈希(会话保持)+ 权重(性能适配);
  • 健康检查:30s 内失败 3 次标记为故障,30s 后重试。

配置步骤

  1. 准备 3 个 Tomcat 实例(实例 3 部署在 192.168.1.102:8080);
  2. 编辑 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;
    }
}
  1. 重载 Nginx:nginx -t && nginx -s reload
  2. 验证:
    • 同一客户端多次访问,始终显示同一个 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:验证
  1. 重载 Nginx:nginx -t && nginx -s reload
  2. 访问 http://192.168.1.100
    • 静态 CSS 和图片由 Nginx 直接返回(查看 Nginx 日志,无转发记录);
    • 动态 API /test/api/user 由 Tomcat 处理,多次刷新页面,动态内容交替显示 2 个 Tomcat 实例的响应(负载均衡生效);
    • 查看 Tomcat 日志,仅接收动态请求,无静态资源请求(减轻 Tomcat 压力)。

核心价值

  • 静态资源访问速度提升(Nginx 处理静态资源效率是 Tomcat 的 10 倍以上);
  • 动态请求负载均衡,提升并发能力;
  • 资源隔离,静态资源故障不影响动态服务,反之亦然。
相关推荐
CheungChunChiu40 分钟前
Android 系统中的 NTP 服务器配置与选择逻辑详解
android·运维·服务器
赖small强1 小时前
【Linux 网络基础】网络通信中的组播与广播:基础概念、原理、抓包与应用
linux·网络·broadcast·组播·广播·multicast
陌路201 小时前
Linux是如何收发网络包的?
linux·网络
0wioiw02 小时前
跨网络互联技术(Nginx反向代理)
服务器·网络·nginx
带鱼吃猫2 小时前
Linux系统:策略模式实现自定义日志功能
linux·c++
程序员潇潇2 小时前
Jenkins 插件下载速度慢安装失败?这篇文章可能解决你头等难题!
运维·自动化测试·软件测试·功能测试·程序人生·职场和发展·jenkins
minji...2 小时前
Linux 进程概念 (三) (进程状态,僵尸进程,孤儿进程,进程优先级)
linux·运维·服务器
敲上瘾3 小时前
Docker镜像构建优化指南:CMD/ENTRYPOINT、多阶段构建与缓存优化
运维·缓存·docker·容器·架构
先生沉默先3 小时前
Nginx 反向代理学习:单端口统一访问多服务
学习·nginx·arcgis