反向代理与负载均衡
反向代理
基础反向代理
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:3000; # 后端应用
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_send_timeout 30s;
proxy_read_timeout 30s;
}
}
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; # WebSocket 长连接
}
负载均衡
upstream 配置
upstream backend {
# 加权轮询(默认)
server 10.0.1.10:8080 weight=3;
server 10.0.1.11:8080 weight=2;
server 10.0.1.12:8080 weight=1;
# 备份服务器(仅在所有主服务器不可用时启用)
server 10.0.1.20:8080 backup;
# 健康检查参数
# max_fails=3 fail_timeout=30s 表示 30s 内失败 3 次则标记为不可用
server 10.0.1.10:8080 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout http_502 http_503;
}
}
负载均衡策略
| 策略 | 配置 | 说明 |
|---|---|---|
| 轮询 | 默认 | 依次分配请求 |
| 加权轮询 | weight=N | 按权重分配 |
| IP Hash | ip_hash; | 同一 IP 固定到同一后端(会话保持) |
| 最少连接 | least_conn; | 分配到连接数最少的后端 |
| 随机 | random; | 随机选择 |
ip_hash 示例
upstream backend {
ip_hash;
server 10.0.1.10:8080;
server 10.0.1.11:8080;
server 10.0.1.12:8080;
}
常见面试问题
Q1: Nginx 如何实现会话保持?
答案:
- ip_hash:根据客户端 IP 哈希分配到固定后端,简单但遇到 CDN/NAT 时多个用户映射同一 IP
- sticky cookie(Nginx Plus):设置 Cookie 标识后端服务器
- 最佳方案:应用层无状态 + Redis 集中式 Session,无需 Nginx 会话保持
Q2: proxy_pass 末尾有无 / 的区别?
答案:
# 请求 /api/users → 转发到 http://backend/api/users
location /api/ {
proxy_pass http://backend;
}
# 请求 /api/users → 转发到 http://backend/users(去掉 /api 前缀)
location /api/ {
proxy_pass http://backend/;
}
末尾有 / 会替换 location 匹配的路径部分,无 / 则原样转发。