Astarry技术日记 - Nginx
type: channel
link: https://blog.astarry.cn/tag/Nginx/
items: Nginx 反向代理实战：从入门配置到 HTTPS 与负载均衡

Nginx 反向代理实战：从入门配置到 HTTPS 与负载均衡
type: item
date: 2026-08-02T01:38:39+08:00
description: 一台服务器上跑着好几个服务：博客、API、监控面板……每个都监听一个端口（3000、8080、9090），用户记不住端口号，浏览器地址栏还老是弹「不安全」。反代（反向代理）就是来解决这件事的：**所有流量先到 Nginx，Nginx 按域名/路径转发给背后的服务**，端口、证书、负载均衡全部在这一层集中处理。本文用一套「从零到生产」的实战路径讲清 Nginx 反向代理：最小配置 → HTTPS → 负载均衡 → WebSocket → 多应用部署 → 常见坑。## 反向代理原理：一句话用户访问 `https://example.com` → Nginx 收到请求 → 根据 `server_name` 和 `location` 规则 → 转发给内网/本机的后端服务 → 拿回响应再返回给用户。**对用户来说只看到 Nginx 这一个入口，后端服务的真实地址被藏了起来。**## 最小可用配置假设你有个应用跑在 `127.0.0.1:3000`，想让用户通过 `app.example.com` 访问：```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; } } ```配置放好后验证并重载（**每次改配置必做**）：```bash sudo nginx -t # 语法检查 sudo systemctl reload nginx # 平滑重载, 不中断连接 ```### 四个请求头，一个都不能少这四行是生产环境标配，缺了会出各种诡异问题：| 请求头 | 作用 | 缺失后果 | | --- | --- | --- | | `Host $host` | 把原始域名传给后端 | 后端按域名路由时会 404 | | `X-Real-IP $remote_addr` | 传递真实客户端 IP | 后端日志里全是 127.0.0.1 | | `X-Forwarded-For` | 完整代理链 IP 列表 | 多级代理时拿不到真实 IP | | `X-Forwarded-Proto $scheme` | 告知后端是 http 还是 https | 应用生成错误的跳转（http→http 死循环） |## HTTPS：交给 Certbot，别手写证书配置申请 Let's Encrypt 证书用 Certbot 的 Nginx 插件一键完成，**不要手动生成证书和写 SSL 配置块**（容易踩加密套件配置的坑）：```bash # Ubuntu/Debian sudo apt install certbot python3-certbot-nginx -y# 一条命令: 验证域名 → 签发证书 → 自动改 nginx 配置 → 自动配 80→443 跳转 sudo certbot --nginx -d app.example.com ```Certbot 会自动：把 `listen 80` 改成 `listen 443 ssl http2`、插入证书路径、加 301 跳转、配置安全套件。你只需要管一件事——**自动续期**：```bash sudo systemctl status certbot.timer # 证书 90 天有效, 定时器会提前 30 天自动续期 sudo certbot renew --dry-run # 手动演练一次续期, 确认没毛病 ```证书文件在 `/etc/letsencrypt/live/域名/` 下：`fullchain.pem`（证书链）和 `privkey.pem`（私钥），注意别泄露私钥。## 负载均衡：一个入口，多个后端后端服务部署了多份（多实例/多机器），用 `upstream` 定义服务器池，`proxy_pass` 指向池子：```nginx upstream app_cluster { least_conn; # 算法: 见下方说明 server 192.168.1.101:9090 weight=3; # 权重 3, 分到更多流量 server 192.168.1.102:9090 weight=2; server 192.168.1.103:9090 max_fails=3 fail_timeout=30s…