Skip to content
返回云服务

Nginx 反向代理与 TLS

在 Node/Python/Go 应用前用 nginx 作反向代理:TLS 终止、虚拟主机、WebSocket 代理和限流。

VPS 与自托管进阶

为什么

nginx 作反向代理让一台服务器在不同子域托管多应用,一次性终止 TLS(含 HTTP/2 和会话票据),缓冲慢客户端以免应用阻塞,并可限流和缓存。是自托管多应用的标准前端。

5 美元/月 VPS(Hetzner、DigitalOcean)对 CPU 密集型工作负载优于 50 美元/月 PaaS。自托管提供完整内核控制并避免供应商锁定,但需要系统管理技能。

何时使用

在一台 VPS 运行多应用、需要自定义域 TLS 或代理 WebSocket/gRPC 时使用 nginx 反向代理。零配置自动 TLS 用 Caddy;需要精细控制或已有 nginx 设置时用 nginx。

如何做

1. 安装 nginx 和 certbot(Let's Encrypt)。 2. 在 /etc/nginx/sites-available/ 为每个应用创建 server 块。 3. 设置 proxy_pass 指向应用上游(如 127.0.0.1:3000)。 4. 添加 proxy_set_header 设置 Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto。 5. 启用站点(符号链接到 sites-enabled)并 nginx -t。 6. certbot --nginx -d example.com 自动 TLS。 ```bash apt install -y nginx certbot python3-certbot-nginx # 创建站点配置(见示例),然后: ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/app nginx -t && systemctl reload nginx certbot --nginx -d app.example.com ```

示例

将 app.example.com 反向代理到 :3000 的 Node.js 应用,支持 WebSocket 和限流: ```nginx # /etc/nginx/sites-available/app limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; server { listen 80; server_name app.example.com; location / { limit_req zone=api burst=20 nodelay; proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 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; } } ```

常见问题

  • ⚠502 Bad Gateway —— 上游应用未运行或未监听 proxy_pass 端口;检查应用,若 nginx 在容器中需绑定 0.0.0.0 而非 127.0.0.1。
  • ⚠代理后 WebSocket 失败 —— 缺少 proxy_set_header Upgrade/Connection 或 proxy_http_version 1.1;添加示例中三行。
  • ⚠certbot 验证失败 —— 端口 80 须开放且 server_name 须解析到此主机;运行 certbot 前检查 DNS 和防火墙。

最佳实践

  • ✓始终设 proxy_set_header X-Forwarded-Proto $scheme,使应用知道在 HTTPS 后并生成安全 cookie/重定向。
  • ✓在 nginx 用 limit_req_zone 限流(廉价)而非应用内(昂贵)—— nginx 在应用工作前拒绝。
  • ✓每月运行 certbot renew --dry-run 并添加 systemd 定时器或 cron 自动续期;证书 90 天过期。

常见问题解答

什么是Nginx 反向代理与 TLS?它解决什么问题?

在 Node/Python/Go 应用前用 nginx 作反向代理:TLS 终止、虚拟主机、WebSocket 代理和限流。 它可帮助开发者在不自建基础设施的前提下完成部署、存储与扩展,是云服务选型的核心参考。

如何在 5 分钟内上手Nginx 反向代理与 TLS?

两步即可跑通:① 安装 nginx 和 certbot(Let's Encrypt)。;② 在 /etc/nginx/sites-available/ 为每个应用创建 server 块。。建议先用免费套餐验证流程,再接入生产环境。

Nginx 反向代理与 TLS 最容易踩的坑是什么?

最高频的问题是:502 Bad Gateway —— 上游应用未运行或未监听 proxy_pass 端口;检查应用,若 nginx 在容器中需绑定 0.0.0.0 而非 127.0.0.1。。建议在上线前用 checklist 逐项核对,并在 CI 中加入策略与配置扫描。

Nginx 反向代理与 TLS 的最佳实践有哪些?

Nginx 反向代理与 TLS 的最佳实践包括:始终设 proxy_set_header X-Forwarded-Proto $scheme,使应用知道在 HTTPS 后并生成安全 cookie/重定向。;在 nginx 用 limit_req_zone 限流(廉价)而非应用内(昂贵)—— nginx 在应用工作前拒绝。;每月运行 certbot renew --dry-run 并添加 systemd 定时器或 cron 自动续期;证书 90 天过期。。其中首条「始终设 proxy_set_header X-Forwarded-Proto $scheme,使应用知道在 HTTPS 后并生成安全 cookie/重定向。」应作为团队默认规范写入 IaC 模板。

Nginx 反向代理与 TLS 如何控制成本与避免账单意外?

三招防超支:① 为所有资源打 env/team 标签并启用账单告警;② 用预算阈值触发 Slack/邮件通知;③ 定期用 Cost Explorer 审查闲置资源并清理。Nginx 反向代理与 TLS 多数提供免费套餐,先在免费额度内验证再放量。