Nginx 反向代理配置实战:从基础到高级应用

Nginx 作为高性能的 Web 服务器和反向代理服务器,在现代 Web 架构中扮演着举足轻重的角色。无论是负载均衡、SSL 终端、缓存加速,还是微服务网关,Nginx 的反向代理功能都是核心基石。本文将从基础配置讲起,逐步深入到高级应用场景,帮助你全面掌握 Nginx 反向代理的实战技巧。

一、什么是反向代理?

反向代理(Reverse Proxy)是指代理服务器接收客户端请求后,将请求转发给内部网络上的后端服务器,并将后端服务器的响应返回给客户端。对于客户端而言,它感知不到后端服务器的存在,只知道反向代理服务器。

与正向代理不同,反向代理位于服务器端,通常用于:

  • 隐藏后端服务器真实 IP,提升安全性
  • 实现负载均衡
  • 统一 SSL 证书管理
  • 缓存静态资源,减轻后端压力
  • 实现灰度发布、A/B 测试

二、基础反向代理配置

最简单的反向代理配置只需要 proxy_pass 指令。假设我们有一个后端服务运行在 http://127.0.0.1:8080,希望通过 Nginx 的 80 端口对外提供服务:

server {
    listen 80;
    server_name example.com;

    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 $scheme;
    }
}

这里有几个关键点:

  • proxy_pass:指定后端服务器地址。注意末尾是否带 / 会影响路径拼接。
  • proxy_set_header Host:将原始请求的 Host 传递给后端,避免后端生成错误的链接。
  • X-Real-IP / X-Forwarded-For:传递客户端真实 IP,便于后端日志和限流。
  • X-Forwarded-Proto:告知后端原始协议是 HTTP 还是 HTTPS。

路径拼接的陷阱

proxy_pass 末尾是否带 / 是初学者最容易踩坑的地方:

# 请求 /api/user -> 后端收到 /api/user
location /api {
    proxy_pass http://127.0.0.1:8080;
}

# 请求 /api/user -> 后端收到 /user
location /api/ {
    proxy_pass http://127.0.0.1:8080/;
}

规则是:如果 proxy_pass 带了 URI(哪怕只是一个 /),Nginx 会用该 URI 替换 location 匹配到的部分。

三、负载均衡配置

当后端有多个实例时,可以使用 upstream 模块实现负载均衡:

upstream backend {
    least_conn;
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=1;
    server 192.168.1.12:8080 backup;
    keepalive 32;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

常用的负载均衡策略包括:

  • round-robin(默认):轮询
  • least_conn:最少连接数优先
  • ip_hash:按客户端 IP 哈希,实现会话保持
  • hash $request_uri consistent:一致性哈希,适合缓存场景

keepalive 指令用于维护与后端的长连接池,配合 proxy_http_version 1.1 和清空 Connection 头使用,可以显著降低延迟。

四、高级应用场景

1. SSL 终端与 HTTPS 反代

在 Nginx 层统一处理 HTTPS,后端只需提供 HTTP 服务:

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://backend;
        proxy_set_header X-Forwarded-Proto https;
    }
}

2. WebSocket 代理

WebSocket 需要协议升级,配置略有不同:

location /ws/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;
}

3. 缓存静态资源

利用 proxy_cache 缓存后端响应,大幅降低后端压力:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m
                 max_size=1g inactive=60m use_temp_path=off;

server {
    location /images/ {
        proxy_cache my_cache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
        proxy_cache_use_stale error timeout updating;
        add_header X-Cache-Status $upstream_cache_status;
        proxy_pass http://backend;
    }
}

4. 限流与熔断

使用 limit_reqlimit_conn 保护后端:

limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

location /api/ {
    limit_req zone=api_limit burst=20 nodelay;
    limit_conn conn_limit 10;
    proxy_pass http://backend;
}

当后端出现故障时,可以通过 proxy_next_upstream 自动切换到健康节点:

proxy_next_upstream error timeout http_502 http_503 http_504;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;

5. 动态上游与灰度发布

结合 map 指令和变量,可以实现基于 Cookie 或 Header 的灰度发布:

map $http_x_gray $backend_pool {
    default    "backend_prod";
    "true"     "backend_gray";
}

location / {
    proxy_pass http://$backend_pool;
}

五、性能调优建议

  • 开启缓冲proxy_buffering on; 让 Nginx 先缓冲后端响应,释放后端连接。
  • 调整超时:根据业务设置 proxy_connect_timeoutproxy_read_timeoutproxy_send_timeout
  • 启用 gzip:在 Nginx 层压缩响应,减少带宽。
  • 合理使用 keepalive:与后端保持长连接,降低 TCP 握手开销。
  • 日志优化:高并发场景下关闭 access_log 或使用缓冲写入。

六、常见问题排查

  1. 502 Bad Gateway:后端不可达或超时,检查后端服务状态和网络连通性。
  2. 504 Gateway Timeout:后端处理超时,调整 proxy_read_timeout 或优化后端性能。
  3. 获取不到真实 IP:确认是否正确传递了 X-Real-IPX-Forwarded-For,后端需配合解析。
  4. 路径 404:检查 proxy_pass 末尾斜杠和 location 匹配规则。

总结

Nginx 反向代理功能强大且灵活,从最基础的 proxy_pass 到负载均衡、缓存、限流、灰度发布,几乎覆盖了现代 Web 架构的所有关键需求。掌握这些配置技巧,不仅能提升系统的性能和可用性,还能为后续的微服务网关和服务网格打下坚实基础。建议在实际项目中逐步实践,结合监控和日志不断调优,才能发挥 Nginx 的最大价值。

未经允许不得转载:任鹏个人博客 » Nginx 反向代理配置实战:从基础到高级应用

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏