banner
约 600 字
2 分钟

手把手配置 Nginx 反向代理

摘要

从最小 Nginx 反向代理配置讲起,逐步覆盖多后端负载均衡、WebSocket 透传、超时缓冲、缓存、SSL 终止、限流安全头与日志排障。

手把手配置 Nginx 反向代理

引言

Nginx 是生产环境里最常见的反向代理。它轻量、稳定,既能做入口网关,又能做负载均衡与缓存。本文从最小可用配置讲起,逐步加上 WebSocket、超时、缓存、SSL、限流与常见排障,给你一份能直接落地的参考。

一、最小可用配置

nginx
server {
    listen 80;
    server_name app.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_pass 指向后端地址。几个 proxy_set_header 把真实客户端信息带给后端——否则后端日志里看到的连接来源全是 Nginx 自己,出问题时无法定位用户。

二、多后端 + 负载均衡

nginx
upstream app_pool {
    least_conn;            # 最少连接优先
    server 10.0.0.11:3000 max_fails=3 fail_timeout=30s;
    server 10.0.0.12:3000 max_fails=3 fail_timeout=30s;
    keepalive 32;          # 复用后端连接,降延迟
}

server {
    location / { proxy_pass http://app_pool; ... }
}

max_fails/fail_timeout 实现简单的被动健康检查:某后端连续失败达到阈值就临时摘掉。keepalive 复用连接能显著降低长尾延迟。

三、支持 WebSocket

长连接必须透传 Upgrade 头:

nginx
location /ws/ {
    proxy_pass http://app_pool;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

四、超时与缓冲

nginx
proxy_connect_timeout 5s;   # 连后端超时
proxy_read_timeout 60s;     # 读后端超时(长任务要调大)
proxy_send_timeout 60s;
proxy_buffering on;         # 开启缓冲,后端快、客户端慢时不阻塞
proxy_buffer_size 16k;
proxy_buffers 8 32k;

读超时过短会导致长请求被掐断;过大又会拖住 worker。按业务 P99 响应时间权衡。

五、缓存静态与加速

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

server {
    location ~* \.(js|css|png|jpg)$ {
        proxy_cache webcache;
        proxy_cache_valid 200 10m;
        add_header X-Cache-Status $upstream_cache_status;
    }
}

X-Cache-Status 头可以快速判断命中与否,方便排障。

六、SSL 终止

在 Nginx 统一做 HTTPS,后端只跑 HTTP:

nginx
server {
    listen 443 ssl;
    ssl_certificate     /etc/nginx/certs/fullchain.pem;
    ssl_certificate_key /etc/nginx/certs/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    location / { proxy_pass http://app_pool; ... }
}

七、限流与安全头

nginx
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

server {
    location /api/ {
        limit_req zone=api burst=20 nodelay;
        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;
        add_header Strict-Transport-Security "max-age=31536000";
        proxy_pass http://app_pool;
    }
}

八、日志与排障

nginx
log_format proxy '$remote_addr - $upstream_addr - $request - $upstream_response_time';
access_log /var/log/nginx/proxy.log proxy;

常见 502 成因:

  1. 后端没起来:先 curl http://127.0.0.1:3000 直连验证。

  2. Host 头不对:后端按域名路由时 proxy_set_header Host 必须正确。

  3. UNIX socket 权限:用 proxy_pass http://unix:/run/app.sock; 时注意权限。

  4. 后端响应超时:调大 proxy_read_timeout

小结

反向代理的坑大多集中在“头信息、超时、缓存”三处。把上面这套配齐,90% 的场景都能稳。下一篇我们换 HAProxy,看专业负载均衡器怎么做健康检查与高可用。

延伸

  • Nginx《Admin Guide: HTTP Load Balancing》

  • 下一篇:《用 HAProxy 做负载均衡与高可用》

END