跳到主要内容

反向代理与负载均衡

反向代理

基础反向代理
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 Haship_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 如何实现会话保持?

答案

  1. ip_hash:根据客户端 IP 哈希分配到固定后端,简单但遇到 CDN/NAT 时多个用户映射同一 IP
  2. sticky cookie(Nginx Plus):设置 Cookie 标识后端服务器
  3. 最佳方案:应用层无状态 + 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 匹配的路径部分,无 / 则原样转发。

相关链接