易君召
易君召
发布于 2026-07-23 / 2 阅读
0
0

反向代理工作原理 + Nginx 完整配置实战

一、反向代理基础概念与工作原理

1. 正向代理 vs 反向代理(核心区分)

类型

服务对象

客户端感知

典型场景

正向代理

客户端

客户端知道代理存在

VPN、翻墙、内网客户端上网

反向代理

后端服务器

客户端无感知,以为代理就是目标网站

Nginx 负载均衡、动静分离、隐藏后端服务

2. 反向代理完整工作流程

  1. 用户请求:浏览器访问域名 api.xxx.com,DNS 解析到 Nginx 服务器公网 IP;

  2. Nginx 接收请求:监听 80/443 端口,根据域名、路径匹配对应后端服务;

  3. 请求转发:Nginx 作为中间人,重新封装 HTTP 请求,转发给内网后端服务(Tomcat/SpringBoot/Node 等);

  4. 后端处理响应:后端程序执行业务逻辑,返回数据给 Nginx;

  5. Nginx 回包给客户端:Nginx 接收后端返回结果,再转发给浏览器;

  6. 全程隐藏后端:客户端始终只和 Nginx 交互,无法直接访问内网后端服务

3. 反向代理核心作用

  1. 隐藏后端真实服务:内网业务服务器不暴露公网,提升安全;

  2. 负载均衡:多台后端服务器分发流量,提高并发与容灾;

  3. 动静分离:静态资源(图片 /js/css)Nginx 直接返回,动态接口转发后端;

  4. SSL 统一证书:Nginx 统一处理 HTTPS 证书,后端不用配置 SSL;

  5. 限流、缓存、跨域、请求过滤:统一在代理层做网关管控。

二、Nginx 反向代理核心指令说明

核心模块:ngx_http_proxy_module

  1. proxy_pass http://127.0.0.1:8080;

    核心指令,指定后端服务地址,末尾 / 有无路径差异

    • proxy_pass http://127.0.0.1:8080:保留原请求路径转发;

      例:访问 /user → 转发 http://127.0.0.1:8080/user

    • proxy_pass http://127.0.0.1:8080/:拼接根路径;

      例:访问 /user → 转发 http://127.0.0.1:8080//user

  2. proxy_set_header:透传客户端真实信息给后端(必备)

    • Host $host:透传访问域名

    • X-Real-IP $remote_addr:客户端真实 IP

    • X-Forwarded-For $proxy_add_x_forwarded_for:链路所有代理 IP

  3. 超时控制(防止卡死)

    proxy_connect_timeout 60s;  # 连接后端超时
    proxy_read_timeout 120s;    # 读取后端响应超时
    proxy_send_timeout 120s;     # 向后端发送数据超时
    
  4. 缓冲区(优化大响应)

    proxy_buffer_size 4k;
    proxy_buffers 8 4k;
    

三、Nginx 反向代理实战配置(3 种常用场景)

前置环境

Nginx 安装完成,后端服务:SpringBoot 127.0.0.1:8080

场景 1:基础单后端反向代理(最简单)

文件路径:nginx/conf/conf.d/api.conf

server {
    listen 80;
    server_name api.test.com;  # 对外访问域名

    # 反向代理核心配置
    location / {
        proxy_pass http://127.0.0.1:8080;

        # 透传客户端真实信息(后端获取IP必备)
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme; # 透传http/https

        # 超时配置
        proxy_connect_timeout 60s;
        proxy_read_timeout 120s;
    }
}

场景 2:路径匹配反向代理(多服务共存)

需求:

  • api.test.com/user/* 转发用户服务 127.0.0.1:8081

  • api.test.com/order/* 转发订单服务 127.0.0.1:8082

nginx

server {
    listen 80;
    server_name api.test.com;

    # 用户服务
    location /user/ {
        proxy_pass http://127.0.0.1:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # 订单服务
    location /order/ {
        proxy_pass http://127.0.0.1:8082;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

场景 3:反向代理 + 负载均衡(多台后端集群)

使用 upstream 模块实现多后端轮询分发流量

nginx

# 定义后端服务集群,名称自定义 backend_server
upstream backend_server {
    # 轮询策略(默认),请求依次分发
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    # 权重策略:weight越大分配流量越多
    # server 127.0.0.1:8082 weight=2;
    # 备用服务,其他机器挂了才启用
    # server 127.0.0.1:8083 backup;
}

server {
    listen 80;
    server_name api.test.com;

    location / {
        # 代理到上游集群
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

场景 4:HTTPS 反向代理(统一 SSL 证书)

server {
    listen 80;
    server_name api.test.com;
    # http强制跳转https
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name api.test.com;

    # SSL证书路径
    ssl_certificate cert/api.test.com.pem;
    ssl_certificate_key cert/api.test.com.key;

    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}

四、Nginx 配置生效命令

  1. 校验配置语法(修改配置后必执行,避免启动失败)

nginx -t
  1. 平滑重载配置(不中断现有业务请求)

nginx -s reload
  1. 停止 / 启动 Nginx

nginx -s stop
nginx

五、后端服务获取客户端真实 IP(补充)

Nginx 通过X-Real-IP透传客户端 IP,SpringBoot 后端获取方式:

// 获取真实客户端IP
public String getRealIp(HttpServletRequest request) {
    String ip = request.getHeader("X-Real-IP");
    if(ip == null || ip.isEmpty()){
        ip = request.getRemoteAddr();
    }
    return ip;
}

六、常见踩坑点

  1. proxy_pass 末尾斜杠:路径转发错乱,严格区分有无/

  2. 后端拿不到客户端 IP:缺少X-Real-IPX-Forwarded-For配置;

  3. 接口超时 504proxy_read_timeout时间过短,调大时长;

  4. HTTPS 后端识别成 HTTP:缺少X-Forwarded-Proto $scheme,后端跳转异常;

  5. 负载均衡单点故障:upstream 添加max_failsfail_timeout自动剔除故障节点。


评论