📚Nginx学习笔记(六)—— Nginx反向代理
📌 一、反向代理核心概念
本质原理:
✅ 核心价值:
- 🛡️ 安全屏障:隐藏后端服务器真实IP
- ⚖️ 负载分发:均衡后端服务器流量
- 🚀 性能加速:集成缓存/压缩等优化
- 🔧 统一入口:简化客户端访问逻辑
⚙️ 二、基础配置语法
核心指令:
location /api/ {# 必需指令proxy_pass http://backend_server; # 转发到上游服务器组# 请求头控制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_connect_timeout 3s; # 连接后端超时proxy_read_timeout 30s; # 读取响应超时proxy_send_timeout 30s; # 发送请求超时
}
关键参数详解:
指令 | 默认值 | 作用 |
---|---|---|
proxy_buffering | on | 启用响应缓冲区(防后端阻塞) |
proxy_buffer_size | 4k/8k | 响应头缓冲区大小 |
proxy_buffers | 8 4k/8k | 响应内容缓冲区数量及大小 |
proxy_redirect | off | 重定向URL修正开关 |
🧩 三、实战配置案例
🔄 案例1:基础反向代理(upstream + proxy_pass)
upstream backend {server 192.168.1.101:8080 weight=5; server 192.168.1.102:8080 max_fails=3;keepalive 32; # 启用连接池
}server {location /service/ {proxy_pass http://backend; # 关键转发指令# 连接优化proxy_http_version 1.1;proxy_set_header Connection "";}
}
📌 效果:
http://nginx-host/service/request → 转发到 http://192.168.1.101:8080/request
🛡️ 案例2:安全隔离实现
location /internal-api/ {# 物理隔离proxy_pass http://10.0.100.20; # 内网服务器# 安全控制allow 192.168.1.0/24; # 仅允许内网IPdeny all; proxy_hide_header Server; # 隐藏服务器标识# 防渗透proxy_cookie_path / "/; HttpOnly; Secure"; # Cookie安全加固
}
⚡ 安全增强:
- 🔒 IP白名单过滤
- 🚫 隐藏服务指纹
- 🍪 强制Cookie安全策略
📶 案例3:基于IP的流量控制
# 定义限流区域(10MB空间,每秒10请求)
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;location /download/ {proxy_pass http://backend;# 限流配置limit_req zone=ip_limit burst=20; # 允许突发20请求limit_req_status 429; # 超限返回429状态码# 差异化限速if ($remote_addr ~ "192.168.1.100") {set $limit_rate 1m; # 特殊IP限速1MB/s}
}
📊 流量控制逻辑:
🚧 案例4:并发连接数限制
# 连接数计数区(1MB可记录1.6万IP)
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;server {location /api/ {proxy_pass http://backend;# 单IP最大5并发limit_conn conn_zone 5; limit_conn_status 503; # 超限返回503# 慢连接保护proxy_connect_timeout 2s; client_body_timeout 10s;}
}
🛠️ 容错机制:
# 故障转移配置
proxy_next_upstream error timeout http_500 http_502; # 自动切换故障节点
proxy_next_upstream_tries 3; # 最大重试次数
⚠️ 四、高阶技巧与陷阱规避
🔧 技巧1:WebSocket代理
location /wsapp/ {proxy_pass http://backend;# WebSocket必需参数proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_read_timeout 3600s; # 长连接超时
}
🎭 技巧2:多路径重写规则
location ~ ^/service/(user|order)/(.*)$ {# 路径重写:/service/user/info → /api/user-service/inforewrite ^/service/(.*)/(.*)$ /api/$1-service/$2 break;proxy_pass http://backend;
}
❌ 常见陷阱:
-
502 Bad Gateway错误
# 解决方案:增加超时阈值 proxy_connect_timeout 5s; proxy_read_timeout 60s;
-
Cookie/Session丢失
# 添加原始主机头 proxy_set_header Host $host; proxy_cookie_domain backend.example.com $host;
📊 五、调试与监控方案
# 专用调试日志格式
log_format proxy_debug '$remote_addr - $upstream_addr ''$status $upstream_response_time ''"$request" $body_bytes_sent';location /api/ {proxy_pass http://backend;# 注入调试头add_header X-Backend-IP $upstream_addr;add_header X-Response-Time $upstream_response_time;# 记录详细日志access_log /var/log/nginx/proxy.log proxy_debug;
}
监控指标:
nginx.http.proxy.requests
:代理请求计数nginx.http.proxy.response_time
:后端响应时间nginx.http.proxy.failures
:失败请求数
🔍 诊断命令:
tail -f /var/log/nginx/proxy.log | grep ' 502 ' nginx -T | grep -A20 "location /api/"