Nginx 反向代理实战:负载均衡、HTTPS 与 WebSocket 配置一次讲清


Nginx 除了能当 Web 服务器,更常见的角色是反向代理:把用户请求转发到后端应用,统一做 HTTPS、缓存、限流和负载均衡。无论是 WordPress、Node.js、Java 应用,还是多台服务器做高可用,反向代理都是绕不开的一环。这篇按配置顺序把常用场景一次讲清。

一、什么情况下需要反向代理

  • 后端程序跑在 127.0.0.1:8080,不想直接暴露给公网;
  • 多台后端服务器需要统一入口和负载均衡;
  • 希望在 Nginx 层统一做 SSL 终止、缓存、限流;
  • 迁移服务器时,用代理做平滑切换和灰度。

二、最小可用配置

一个能直接跑的反向代理配置如下,核心是 proxy_pass 和四个透传头:

upstream backend {
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        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;
        proxy_connect_timeout 10s;
        proxy_read_timeout 60s;
    }
}

少了 X-Forwarded-For,后端拿到的客户端 IP 全是代理服务器;少了 Host,部分程序会生成错误的回调地址。

三、负载均衡策略怎么选

默认是轮询,适合后端性能一致的场景。其他几种按需求选择:

  • weight:给配置高的机器更大权重,例如 server 10.0.0.1 weight=3;
  • ip_hash:同一 IP 固定落到同一台机器,适合有本地 session 的老应用。
  • least_conn:优先转发给当前连接数最少的机器,适合请求耗时差异大的场景。

开源版 Nginx 的健康检查依赖 max_fails 和 fail_timeout,属于被动检查;需要主动探测可以上商业版或改用 OpenResty + lua-resty-healthcheck。

四、缓存与压缩

对更新不频繁的接口或页面,可以在 Nginx 层加一层缓存,显著降低后端压力:

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=webcache:100m inactive=60m;

location / {
    proxy_cache webcache;
    proxy_cache_key "$scheme$host$request_uri";
    proxy_cache_valid 200 10m;
    proxy_cache_use_stale error timeout updating;
    add_header X-Cache-Status $upstream_cache_status;
}

响应头里的 X-Cache-Status 能直接看到 HIT/MISS,方便验证缓存是否生效。压缩统一在 Nginx 打开 gzip,避免后端重复压缩。

五、HTTPS 统一在代理层处理

推荐把证书装在 Nginx 上,后端只跑 HTTP,内网通信更简单。配置要点:启用 TLS 1.2/1.3、开启 HTTP/2、加 HSTS,并把 80 端口 301 到 443。代理到后端的请求头里保留 X-Forwarded-Proto,程序才能正确识别用户走的是 HTTPS。

六、WebSocket 代理

普通代理配置会断开长连接,WebSocket 需要单独加三行:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;

如果应用同时有普通 HTTP 和 WebSocket,可以把 Connection 写成 map 映射,避免影响普通请求。

七、限流与真实 IP

防刷接口用 limit_req,限制并发连接用 limit_conn:

limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=perip:10m;

location /api/ {
    limit_req zone=api burst=20 nodelay;
    limit_conn perip 10;
}

如果 Nginx 前面还有 CDN 或四层代理,必须配置 set_real_ip_from 和 real_ip_header,否则限流会按代理 IP 统计,误伤所有用户。

八、502 与 504 排查清单

  1. 后端服务是否在监听:ss -lntp | grep 8080;
  2. 代理地址和端口是否写错,upstream 名称是否对应;
  3. 502 多为后端拒绝连接或进程崩溃,504 多为后端处理超时;
  4. 检查 SELinux、防火墙和内网安全组是否放行;
  5. 看 Nginx error.log 和后端应用日志,而不是只看 access.log。

总结

反向代理的配置并不复杂,难点在于细节:透传头、超时时间、缓存键、真实 IP、WebSocket 升级。先把最小配置跑通,再逐项加缓存、限流和负载均衡,出问题时按“Nginx 日志 → 后端服务 → 网络策略”的顺序排查,基本都能定位。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

WordPress 打开慢怎么优化?对象缓存、数据库与图片压缩一次讲清

宝塔面板建站实战:安装、Nginx 优化与 HTTPS 配置一次讲清

评 论