WEB 服务

Nginx 反向代理与 HTTPS 配置指南

从真实 IP、超时控制到 TLS 与安全响应头的生产配置清单。

为什么反向代理配置容易出问题#

常见故障不是 Nginx “不能转发”,而是真实 IP、WebSocket、上传大小、超时和 HTTPS 跳转只配置了一半。下面的配置以单个 Next.js 服务为例,并保留明确的验证路径。

上游与代理头#

nginx
upstream blog_app {
    server blog-app:3000;
    keepalive 32;
}

server {
    listen 80;
    server_name blog.example.com;

    location / {
        proxy_pass http://blog_app;
        proxy_http_version 1.1;
        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_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_connect_timeout 5s;
        proxy_read_timeout 60s;
    }
}

如果 Nginx 前面还有 CDN 或 Caddy,只有在明确知道代理出口网段时才使用 set_real_ip_from,否则客户端可以伪造 X-Forwarded-For。

TLS 与安全响应头#

项目建议原因
TLS仅 TLS 1.2 / 1.3淘汰旧协议
HSTS确认全站 HTTPS 后再开启配错会长期阻断 HTTP
X-Content-Type-Optionsnosniff避免 MIME 猜测
Referrer-Policystrict-origin-when-cross-origin减少敏感路径外泄
nginx
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
client_max_body_size 20m;

上线前验证#

bash
nginx -t
curl -I http://blog.example.com
curl -I https://blog.example.com
curl -fsS https://blog.example.com/api/health
openssl s_client -connect blog.example.com:443 -servername blog.example.com </dev/null

检查 HTTP 是否只跳转一次、证书域名是否匹配、应用收到的协议是否为 HTTPS。若出现 502,先从 Nginx 容器内部访问上游,区分网络问题和应用问题。

GK / OPS NOTES
把每一次变更写成可以复现的步骤

示例命令请先在测试环境验证,再根据自己的系统版本、网络和备份策略调整。

讨论区 27

分享你的经验、补充或不同观点。支持 Markdown 基础语法。

讨论区暂时为空,欢迎分享你的经验。