反向代理与部署验证

NG 反向代理与部署

把域名解析、upstream 检查、server 块编写与平滑重载串成一条可执行的部署线。以下流程可直接用于 Nginx 1.18+ 和 CentOS 7/8/9 环境,适合在接手或调整反向代理时快速完成配置与验收。

支持 Nginx 1.18+ 兼容 CentOS 7/8/9 6 阶段部署步骤
部署顺序

从后端进程到对外入口的六步操作

以下流程以一台 CentOS 服务器、一个后端服务端口为基础示例。实际操作时只需替换 server_name、upstream 名称与端口。

  1. 1

    确认后端进程与监听端口

    事前检查

    在写 Nginx 配置前,先确认后端服务实际监听的地址与端口是否可用,避免把问题带到代理层。

    ss -lntp | grep 8080
    curl -I --max-time 5 http://127.0.0.1:8080/health
    如果本机访问返回 connection refused 或 000,需要先恢复后端服务,再继续反向代理配置。
  2. 2

    定义统一 upstream 后端地址池

    核心文件

    同一条业务如果会被多个 server 块引用,用 upstream 块单独定义后端。CentOS 7 默认仓库自带版本较旧,建议在完成 Nginx 官方源替换后再使用以下参数。

    upstream ng_web {
        server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=10s;
        keepalive 32;
    }
    weight 只作示例;生产环境若保持单后端,建议省略权重。max_fails 与 fail_timeout 需要根据后端实际恢复耗时调整。
  3. 3

    编写 server 块并开启转发

    proxy_pass

    server_name 替换为需要对外提供服务的域名;location / 把全部业务请求转交给 ng_web。

    server {
        listen 80;
        server_name app.internal;
    
        access_log /var/log/nginx/app.access.log main;
        error_log  /var/log/nginx/app.error.log warn;
    
        location / {
            proxy_pass http://ng_web;
            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;
        }
    }
    Host 头与 X-Forwarded-For 通常必须保留,不传递会导致后端日志记录错误来源或生成错误的站点跳转。
  4. 4

    为 WebSocket 与长连接补充转发规则

    Upgrade

    如果业务包含 WebSocket 或 SSE,Nginx 需要把 Upgrade 和 Connection 头保留下来。

    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
    
    location /ws/ {
        proxy_pass http://ng_web;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }
    read/send timeout 需要结合心跳间隔调整。若业务本身有应用层心跳,可以设置成接近心跳周期的两倍。
  5. 5

    校验配置并平滑重载

    nginx -t

    配置修改完成后先执行语法校验,再通过 reload 让新配置生效。reload 会平滑处理,不中断已有连接。

    nginx -t
    
    # 显示 test is successful 后执行
    systemctl reload nginx
    避免直接执行 restart 或 stop 后再 start,那会产生短暂服务中断。若有多份 Nginx 实例,需要确认 reload 的对象是当前 master 进程。
  6. 6

    部署验收与状态码定位

    日志确认

    确认入口状态后,再去 Nginx access/error log 观察真实请求。如果出现 502、504、403、404,大方向可按下表判断。

    tail -n 100 /var/log/nginx/error.log
    tail -n 100 /var/log/nginx/access.log
    502 优先查 backend 是否存活;504 优先看 upstream 超时;403/404 则核对 root、alias 或 proxy_pass 末尾路径是否改写过度。
6
反向代理部署阶段
1.18+
Nginx 版本基线
3
CentOS 主版本覆盖
10+
状态码与故障追查点
部署提醒

写配置前确认这 4 个常见边界

反向代理大多数上线问题来自防火墙、URI 拼接、Header 透传与配置路径不一致。对照检查可以减少返工。

防火墙与安全组

代理入口端口需要在 Linux 防火墙与云安全组中同时放行,只放行其中一个仍会连接超时。

  • 检查 80、443 端口监听状态
  • 确认内网后端口不被外部直接访问
  • reload 后测试从客户端实际访问入口

路径拼接规则

proxy_pass 末尾是否保留 / 会直接改变给后端的 URI。配置前先确认后端路由是否自带 /api 前缀。

  • 带前缀路径建议先写一个小 location 验证
  • 修改 path 后用 curl 观察实际回包
  • rewrite 与 proxy_pass 不要同时处理同一段 URI
FAQ / 排查

反向代理部署中的常见问题

问题按故障出现频率排列。回答中的验证命令都可以在 CentOS 7/8/9 默认 shell 中直接执行。

正向代理代表客户端向互联网发起请求,反向代理则代表后端服务器对外提供服务。Nginx 接收外部请求后按规则转发给内部 upstream,再把响应返回给客户端。因此从用户视角看,反向代理入口就是一个独立的服务端地址。

先执行 ss -lntp 查看 upstream 端口是否在监听,再用 curl 访问 upstream 地址并观察响应。端口正常则查看 Nginx error log,确认 upstream 是否在 fail_timeout 内被标记为不可用。常见原因还包括后端进程停止、文件句柄耗尽、keepalive 配置方向不匹配。

location /api/ 配合 proxy_pass http://ng_web; 会将完整 URI /api/xxx 交给后端。若写成 proxy_pass http://ng_web/;,Nginx 会用 / 替换匹配到的 /api/ 后再转发。需要依据后端实际路由是否携带 /api 前缀决定,改完后用 curl 实际请求一次接口。

先确认 nginx -t 读取的是当前服务实际使用的配置文件。部分环境通过不同 prefix 启动多份 Nginx,systemctl reload 只覆盖 systemd 管理的进程。使用 ps -ef | grep nginx 查看 master 进程数量,再结合 access.log 更新时间判断 reload 是否真正执行。

建议使用官方 Nginx 仓库或在备份现有配置文件后替换为更高版本 Nginx。官方仓库需要按 CentOS 7/8/9 选择对应 repo 路径,写入后执行 yum clean all 再重新安装 nginx。升级后用 nginx -V 核对编译参数与模块是否满足现有配置。

部署资源索引

Get a reverse proxy deployment template ready to modify

占位

拿一份可直接修改的反向代理部署模板

把 upstream 定义、server 块、Header 透传、WebSocket 规则与 reload 验证命令整理在同一份文档中。适合部署完成后留档,也适合下一次新建站点时快速套用。

ng官方网站 反向代理部署结构示意