【VPS 网络极客与负载均衡 09】VPS 搭建反向代理:Nginx / Caddy 实战,反向代理是什么与多站点 SSL
2026-08-15 · DevCraft Studio
用大白话讲清反向代理是什么、为什么 VPS 需要一个;给出 Nginx 与 Caddy 两套可直接抄的实战配置,覆盖 WebSocket、多站点子域名分流、Let’s Encrypt 自动 SSL 与新手最常踩的坑。
专题连载:VPS 网络极客与负载均衡
本文是该系列第 9 篇。阅读该系列其他文章:
- 【VPS 网络极客与负载均衡 01】从域名到 IP:DNS 解析全过程,以及在 VPS 上的实战配置
- 【VPS 网络极客与负载均衡 02】从 ASN 到 BGP:你的 VPS 流量到底走了哪条线?
- 【VPS 网络极客与负载均衡 03】多台 VPS 做负载均衡:HAProxy / Nginx 实战与架构思路
- 【VPS 网络极客与负载均衡 04】用 Nginx 反向代理把一个 VPS 变成多服务网关(实战教程)
- 【VPS 网络极客与负载均衡 05】什么是 PTR 反向解析?为什么 VPS 发邮件和建站都离不开它
- 【VPS 网络极客与负载均衡 06】买了 VPS 还要配域名?DNS 解析上线全流程 2026
- 【VPS 网络极客与负载均衡 07】MPTCP 多路径加速:用 VPS 把多条宽带聚合成一条 2026
- 【VPS 网络极客与负载均衡 08】买完域名和 VPS 之后:DNS 解析、NS 与 A/AAAA 记录配置全流程
- 【VPS 网络极客与负载均衡 09】VPS 搭建反向代理:Nginx / Caddy 实战,反向代理是什么与多站点 SSL
延伸阅读
更多相关攻略推荐:泛域名 SSL 证书自动化避坑:Acme.sh + DNS API 、BGP 是互联网的"高德地图":打开网页时,数据是这样找路的、【优化线路 02】BGP / AS4837 常规线路年付 10 美元、高级玩家玩出花:如何在 VPS 上广播自己的 IP 地址?BYOIP、计算机科学两大难题之一:缓存失效与 CDN 瞬时刷新奥秘。
一、反向代理到底是什么
反向代理这个词听起来很技术,但道理很生活化。你可以把它想象成公司前台:访客(也就是你的浏览器)只认识前台的位置(Nginx 或 Caddy 占着的 80 和 443 端口),并不认识公司里每个科室的真实房间号。前台根据「你找谁」——也就是域名或者路径——把请求转交给后台不同的内部服务,而访客从头到尾都看不到那些后台服务的真实地址。
对应到服务器上,反代就是:客户端只访问那一个代理(比如 Nginx 监听在 443 端口),代理再把请求转发给真正的后端程序,例如跑在 127.0.0.1:3000 的一个 Node 应用。对外的世界里,没有人知道你的 Node 进程到底监听在哪个端口、跑在哪台内网机器上。
这里要分清「正向」和「反向」。我们常说的海外网络访问那种代理是正向代理,帮客户端去访问外面的资源;而反向代理是站在服务端这边的,帮服务器把外部请求分派给内部应用。两者方向相反,但核心技术都是「转发」。理解这一层,后面所有配置都是在回答一个问题:请求进来以后,该转给谁。
二、为什么你的 VPS 需要一个反向代理
最直接的好处是省端口。一台 VPS 对外通常只能舒服地用 80 和 443 两个端口(其他端口要么被防火墙挡,要么用户记不住、也不方便配 HTTPS)。有了反代,你就用这两个端口服务无数个内部应用:n8n 跑在 5678、Grafana 跑在 3000、个人博客跑在容器里,全部靠反代用子域名 n8n.your-domain.com、grafana.your-domain.com 分流,每个都自动 HTTPS。这就是「一个小区只开一个大门,保安帮你送到各户」的感觉。
第二个好处是统一做 TLS 终止,也就是 HTTPS。你不必让每个后端程序各自去申请证书、各自处理加密,只需要在反代这一层集中配置证书,后端之间用内网明文通信即可,既简单又少出错。第三个好处是隐藏后端:真实服务不暴露公网,暴露面变小,被直接攻击的概率下降。
再往后,反代还能顺手做负载均衡、缓存和访问控制。比如把一个域名背后的流量平均分给两台后端,或者把静态资源缓存在代理层减轻后端压力,或者按 IP 做限流封禁。一句话,反代是「一台 VPS 当多台用、还管得整齐」的关键枢纽。下面给两套配置,一套 Nginx、一套 Caddy,按需抄。
三、Nginx 基础反向代理配置
Nginx 做反代的核心指令是 proxy_pass,后面跟上后端地址。最基础能跑通的样子(先用 80 端口,跑通再加证书)把 server_name 设成你的子域名,location 里写 proxy_pass http://127.0.0.1:3000,再补几个 proxy_set_header。下面四行头几乎每次都要带:
proxy_set_header Host $host; 这行把原始域名带给后端,很多后端靠 Host 头来决定返回哪个站点。
proxy_set_header X-Real-IP $remote_addr; 这行把访客真实 IP 告诉后端,否则后端日志里全是代理的 IP。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 这行把经过的代理链都记下来,方便追访客来源。
proxy_set_header X-Forwarded-Proto $scheme; 这行告诉后端原始请求是 http 还是 https,避免后端误判成明文而生成错误的跳转。
把这四行和 proxy_pass 放一起,就是一个五脏俱全的最小反代。改完配置记得先 nginx -t 测语法,再 systemctl reload nginx 平滑生效,不要直接 restart 把正在跑的连接打断。
四、用 Nginx 撑起 WebSocket
如果你的后端是聊天室、在线终端、协作白板这类用到 WebSocket 的应用,基础配置会不够用,连接握手成功后会莫名其妙断开。原因是 WebSocket 的升级依赖两个「逐跳头」Upgrade 和 Connection,普通反代默认不会转发它们。Nginx 从 1.3.13 起支持 WebSocket,但必须你手动写清楚。
关键三行是:proxy_http_version 1.1; 因为 Upgrade 机制建立在 HTTP/1.1 之上;proxy_set_header Upgrade $http_upgrade; 把浏览器的升级请求转给后端;proxy_set_header Connection "upgrade"; 明确告诉后端保持这条升级连接。把这几行加进 location,WebSocket 才能稳。
还有一个坑是超时。Nginx 默认的 proxy_read_timeout 是 60 秒,长连接的 WebSocket 会被这个默认值在默默无闻中切断,表现就是聊天室每分钟掉线、终端频繁重连。解决办法是把超时调大,比如 proxy_read_timeout 86400s。曾经有人排查半天才发现,根因就是少了这三行头和这个超时,可见它们有多关键。换句话说,凡是有「实时」二字的后端,配置里一定带上这一段。
五、Nginx 多站点与子域名分流
一台 VPS 服务多个站点,靠的是多个 server 块,每个块用 server_name 区分不同子域名,location 里再用各自的 proxy_pass 指向不同后端端口。比如一个块 server_name 写 n8n.your-domain.com、proxy_pass 指向 127.0.0.1:5678,另一个块 server_name 写 grafana.your-domain.com、proxy_pass 指向 127.0.0.1:3000,两个块并列放在同一份配置里即可。
证书方面,Nginx 官方推荐用 Certbot:先装 certbot 和 python3-certbot-nginx,再执行 sudo certbot --nginx -d n8n.your-domain.com -d grafana.your-domain.com,它会自动申请 Let's Encrypt 证书、改写配置、并设好自动续期;用 sudo certbot renew --dry-run 可以验证续期流程是否通。如果你的后端有多份实例想做负载均衡,可以在 http 块里定义 upstream,把多个后端地址列进去,再在 location 里 proxy_pass 指向这个 upstream 名字,Nginx 默认就带简单的轮询分发。
这里有个顺序建议:先用 80 端口把转发跑通、确认后端能正常响应,再上 Certbot 加 HTTPS。很多人一上来就配 443 又没证书,结果满屏报错,其实是本末倒置。先通后加密,排查起来最省心。
六、Caddy:三行搞定,还包 SSL
如果你嫌 Nginx 那一堆 proxy_set_header 太啰嗦,Caddy 会是让人舒服的替代。它用一个极简的 Caddyfile 描述配置,而且只要文件第一行写的是域名,Caddy 就默认自动向 Let's Encrypt(或 ZeroSSL)申请证书、自动续期、自动把 HTTP 跳转到 HTTPS,全程不需要 Certbot。
最省事的反代只有三行:第一行写你的域名 example.com,大括号里一行 reverse_proxy localhost:8080,就完了。保存后用 sudo caddy reload 或 sudo systemctl reload caddy 零停机生效;改之前可以先用 caddy validate 校验语法,避免写错把服务搞挂。安装上,Debian/Ubuntu 走官方 cloudsmith 仓库后 apt install caddy,以 systemd 服务运行。
Caddy 的自动 HTTPS 有个前提:你的域名 A 记录要指向这台服务器,并且 80 和 443 端口要对外开放(Let's Encrypt 通过 80 端口做校验),裸 IP 是没法自动签发证书的。只要满足这两点,你几乎什么都不用管,证书到期前它会自己悄悄续上。对「想少操心」的个人站长,这套体验确实省心。
七、Caddy 多子域名与负载均衡
Caddy 做多子域名同样很轻:每个子域名写一个块,各自自动拿证书。比如 app.your-domain.com 块里 reverse_proxy localhost:8080,cloud.your-domain.com 块里 reverse_proxy localhost:8081,两个块并列,证书各管各的,完全不用你操心。
WebSocket 在 Caddy 里更是零配置——它会自动处理 Upgrade,你不需要像 Nginx 那样手写头。这点是 Caddy 相对友好的地方,实时类应用直接反代就行。
要做负载均衡也不复杂。在 reverse_proxy 后面并列写多个后端节点,再用大括号加两条:lb_policy round_robin 指定轮询策略,health_uri /health 配合 health_interval 10s 做健康检查,Caddy 会自动把流量避开不健康的节点。对于中小规模的「一个域名背后多实例」场景,这段配置已经够用,不必上重型方案。
八、Let's Encrypt 证书与新手最常踩的坑
先把证书这条线理清:Nginx 这边靠 Certbot 申请和续期(有 cron 或 systemd timer 自动跑);Caddy 这边内置 ACME 客户端,自动申请、到期前自动续期,几乎零人工。如果你要的是通配符证书(*.your-domain.com),那需要做 DNS 挑战,比如接 Cloudflare 插件,默认镜像不带这个功能,单独留意。
接下来是新手最容易踩的几个坑。第一,WebSocket 断了:多半是 Nginx 没写 Upgrade/Connection 头,或没有调大 proxy_read_timeout。第二,Host 头没带:后端拿到错误域名,返回 404 或跳错站,记得加 proxy_set_header Host $host。第三,后端用的是内网或 localhost 却写成了公网 IP:能通但绕路甚至被防火墙拦,统一用 127.0.0.1 或 localhost 更稳。第四,502 Bad Gateway:通常是后端进程根本没启动,先确认后端在监听再查反代。第五,证书续期失败:多因为 80 端口被占或域名没解析到本机,Certbot 校验过不去。第六,忘记开 80/443:云厂商安全组或本机防火墙没放行,外面根本连不进来。把这六点记牢,能省下大把排查时间。
#反向代理 #Nginx #Caddy #WebSocket #SSL
💡 延伸阅读:关于架构与基础设施的更多深潜指南,请前往 VPS 主题导读中心 (Hub) 获取全盘策略。