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_req 和 limit_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_timeout、proxy_read_timeout、proxy_send_timeout。 - 启用 gzip:在 Nginx 层压缩响应,减少带宽。
- 合理使用 keepalive:与后端保持长连接,降低 TCP 握手开销。
- 日志优化:高并发场景下关闭
access_log或使用缓冲写入。
六、常见问题排查
- 502 Bad Gateway:后端不可达或超时,检查后端服务状态和网络连通性。
- 504 Gateway Timeout:后端处理超时,调整
proxy_read_timeout或优化后端性能。 - 获取不到真实 IP:确认是否正确传递了
X-Real-IP和X-Forwarded-For,后端需配合解析。 - 路径 404:检查
proxy_pass末尾斜杠和location匹配规则。
总结
Nginx 反向代理功能强大且灵活,从最基础的 proxy_pass 到负载均衡、缓存、限流、灰度发布,几乎覆盖了现代 Web 架构的所有关键需求。掌握这些配置技巧,不仅能提升系统的性能和可用性,还能为后续的微服务网关和服务网格打下坚实基础。建议在实际项目中逐步实践,结合监控和日志不断调优,才能发挥 Nginx 的最大价值。
未经允许不得转载:任鹏个人博客 » Nginx 反向代理配置实战:从基础到高级应用


朋友圈点赞图在线生成源码