适合谁:已经掌握了基础反代,但在生产环境中频繁遭遇真实访客 IP 变成 Cloudflare 节点 IP、WebSocket 莫名被 60 秒掐断、Nginx 新版报错 listen ... http2 is deprecated、大文件上传被截断等深水区暗坑的进阶玩家。

支持系统:Debian 11/12/13、Ubuntu 20.04/22.04/24.04 LTS(搭配原生 Nginx、OpenResty 均通用)。

耗时预期:约 20 ~ 25 分钟(跟着一步步推演配置,直接晋级生产架构师视角)。

做完你将得到:一套具备全球 CDN 真实 IP 穿透、动态 WebSocket 长连接握手、现代 HTTP/2 规范、跨域安全控制与高并发连接池的工业级生产网关!

⚠️ 全程唯一保命铁律:
动核心配置前必须先用 nginx -t 语法自检,重载永远使用 systemctl reload nginx! 生产服务器上严禁无脑 systemctl restart,保证在线长连接业务零中断。


🧭 进阶图解:高阶反代在深水区解决什么问题?

基础反代只是简单的“端口转接”,而生产环境面临复杂的外部 CDN、长连接协同与网络合规:

TEXT
【外界访客 (114.x.x.x)】
        │
        ▼ 发起 HTTPS / WSS 请求
┌───────────────────────────────────────────────────────────┐
│  ☁️ Cloudflare 全球 Anycast CDN 节点 (172.64.x.x)           │
└───────────────────────────────────────────────────────────┘
        │
        ▼ 携带 CF-Connecting-IP 请求头穿透
┌───────────────────────────────────────────────────────────┐
│  🏢 你的生产 Nginx 网关                                    │
│                                                           │
│   🔍 真实 IP 还原模块:识别 CF 官方 IP 段,剔除代理伪装,    │
│      将真正的客户端 IP (114.x.x.x) 还原并交由后端应用记录; │
│   ⚡ WebSocket 动态协议升级(map 机制拒绝死连);          │
│   🚀 HTTP/2 现代流式并发多路复用(采用 http2 on; 语法); │
│   🛡️ 跨域 CORS 精准白名单校验。                           │
└───────────────────────────────────────────────────────────┘

📋 开始前的准备清单(缺一项都别往下走)

  • Nginx 已处于运行状态:执行 nginx -v 建议为 1.20+ 或 1.24+ 较新版本;
  • 后端长连接或 API 服务就绪:跑在本地特定端口(如 127.0.0.1:8080);
  • 已理解草稿箱与生效箱机制:改动永远在 /etc/nginx/sites-available/ 进行。

第 1 步:优雅支持 WebSocket 动态升级(彻底消灭断流 Bug)

很多教程教小白直接在 location 里写死:

NGINX
proxy_set_header Connection "upgrade"; # ❌ 严重反模式!
  • 🗣️ 死穴解析:如果客户端发来的是普通 HTTP 请求(并没有要求 Upgrade),你却强行告诉后端“要升成 WebSocket”,很多后端(如 Node.js、Python FastAPI、Go)会当场报协议解析错误!

✅ 官方工业级正解:利用 map 动态握手!

🖥️ 【服务器窗口】 打开 /etc/nginx/nginx.conf,在 http { ... } 内部放入这段全局动态映射(如果系统没有的话):

BASH
# 检查是否已存在 map 规则,没有则自包含幂等写入
if ! grep -q "connection_upgrade" /etc/nginx/nginx.conf 2>/dev/null; then
    sed -i '/http {/a \    map $http_upgrade $connection_upgrade {
        default upgrade;
        ""      close;
    }' /etc/nginx/nginx.conf
    echo "[✓] 全局 WebSocket 动态映射已写入!"
fi
  • 🗣️ 大白话:当访客发来 WebSocket 升级头时,Connection 设为 upgrade;如果是普通网页请求,Connection 设为 close。聪明自适应,永远不报错!

第 2 步:真实访客 IP 穿透还原(告别日志全显 Cloudflare IP)

当你套了 Cloudflare CDN 后,如果没有做还原,你的所有后端访问日志、防刷限流、风控系统里记录的全是 Cloudflare 节点的机房 IP(如 172.64.x.x 或 104.28.x.x),导致 Fail2ban 误封 CDN。

我们需要告诉 Nginx:这些 IP 属于受信代理,真实 IP 放在 CF-Connecting-IP 报头里!

🖥️ 【服务器窗口】 一键写入 Cloudflare 官方 IPv4/IPv6 受信网段配置:

BASH
cat << 'EOF' > /etc/nginx/conf.d/cloudflare-real-ip.conf
# Cloudflare 官方 IPv4 网段
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;

# Cloudflare 官方 IPv6 网段
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;

# 指定通过 CF 官方头还原真实访客 IP
real_ip_header CF-Connecting-IP;
EOF
  • ✅ 成功标志:此配置落地后,你的 $remote_addr 将奇迹般地变回访客手机或家庭宽带的真实 IP,防爆破与访问统计瞬间恢复精准!

第 3 步:现代 HTTP/2 语法避坑(告别 Deprecated 警告)

在老教程里,很多教程写:

NGINX
listen 443 ssl http2; # ❌ Nginx 1.25.1+ 已正式废弃此语法!

如果你在新版系统(Debian 12+ 或 Ubuntu 24.04)上这么写,运行 nginx -t 会疯狂刷黄字:
nginx: [warn] the "http2" directive is deprecated, use the "http2" directive instead。

✅ 现代化标准的 HTTP/2 写法:

NGINX
listen 443 ssl;
listen [::]:443 ssl;
http2 on; # 🟢 官方规范新语法,清爽独立!

第 4 步:全功能生产级黄金模板(自包含一键落地)

现在我们将上面的所有生产特性(真实 IP 还原、动态 WebSocket、HTTP/2、大文件放行、超时保护)融为一体,生成一份真正无可挑剔的站点配置。

🖥️ 【服务器窗口】 先填写你的配置变量:

BASH
MY_DOMAIN="api.0000996.xyz"
UPSTREAM_PORT="8080"

接着,整段执行自包含防呆写入脚本:

BASH
cat << EOF > /etc/nginx/sites-available/${MY_DOMAIN}.conf
server {
    listen 80;
    listen [::]:80;
    server_name ${MY_DOMAIN};

    # 生产安全:放行 100MB 附件与大文件上传
    client_max_body_size 100M;
    client_body_buffer_size 128k;

    location / {
        proxy_pass http://127.0.0.1:${UPSTREAM_PORT};

        # 核心请求头透传
        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;

        # 动态 WebSocket 升级(依赖第 1 步的 map 规则)
        proxy_http_version 1.1;
        proxy_set_header Upgrade \$http_upgrade;
        proxy_set_header Connection \$connection_upgrade;

        # 生产级超时与缓冲调优(防止长连接被提前中断)
        proxy_connect_timeout 60s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;

        # 开启缓冲支持(高并发吞吐优化)
        proxy_buffering on;
        proxy_buffers 16 32k;
        proxy_busy_buffers_size 64k;
    }
}
EOF

# 激活站点软链接
ln -sf /etc/nginx/sites-available/${MY_DOMAIN}.conf /etc/nginx/sites-enabled/

# 黄金自检
nginx -t && systemctl reload nginx
  • ✅ 成功标志:终端打印出 syntax is ok 与 test is successful,服务平滑重载完毕!

🚑 翻车急救站(深水区生产故障速查)

异常现场真实根因对应一秒救命招式
nginx -t 报 unknown "connection_upgrade" variable漏掉了第 1 步在 nginx.conf 里的 map 定义重新执行第 1 步脚本,确保 map 规则位于 http { ... } 内部。
反向代理访问报 504 Gateway Time-out后端处理耗时超过了默认的 60 秒限制将配置里的 proxy_read_timeout 调大至 300s 或 600s,重载生效。
套了 Cloudflare 后日志仍显示国外 IP未安装 http_realip_module 或未配置 real_ip_header执行 `nginx -V 2>&1
浏览器控制台报 CORS header missing 跨域错误前后端域名不同,未配置允许跨域标头在 location 下加入 add_header Access-Control-Allow-Origin *;(生产建议填具体主域)。

🎓 毕业全维度自检清单

核对以下 5 项指标,全部通过即代表你的高阶反向代理已达企业级可用标准:

  • WebSocket 零误伤:普通 HTTP 请求不带无效升级头,WSS 请求连接长久保持不闪断;
  • 真实访客 IP 还原:外部请求经过 Cloudflare 后,后端程序捕获到的依然是真实的客户端 IP;
  • HTTP/2 规范对齐:配置采用现代 http2 on; 指令,无任何 Deprecated 黄字警告;
  • 长耗时请求不断连:大文件上传与长耗时任务平稳传输,无 504 Gateway Timeout 报错;
  • 优雅重载保命守则:任何配置变更均在语法检查通过后执行 systemctl reload,实现无感热切换!