反向代理与网络接入
字数
1269 字
阅读时间
5 分钟
TIP
本节介绍反向代理的关键配置、几种接入方式的取舍,以及代理之后实例自身的访问控制。
直接把实例端口映射到公网缺少路由控制,也会把内部服务直接暴露出去。更稳妥的做法是用反向代理统一接管外部流量。
代理必须做到的四件事
无论用 Nginx、Caddy 还是 Traefik:
- 保留真实来源:通过请求头把访客的真实地址传给实例。否则所有请求都来自
127.0.0.1,访问日志记不到真实 IP,基于来源的安全策略和限频也会失效。 - 支持协议升级:控制台通过 WebSocket 等长连接推送状态。代理不透传升级请求头,握手就会失败。
- 关闭响应缓冲:代理默认会攒批发送,导致流式输出、轨迹和日志卡几秒后一次性弹出。
- 足够长的超时:代理默认的读写超时一般只有 30 或 60 秒,空闲的长连接会被断开,前端反复报错重连。
WARNING
最常见的问题不是页面打不开,而是「能登录、页面正常,但数据不刷新」。静态资源和登录走普通 HTTP,只有长连接推送的数据会受影响,优先检查协议升级和响应缓冲。
HTTPS
证书交给反向代理管理,实例只在本地回环地址上明文监听。证书申请、续期、加密套件和 HTTP/2 都在代理层处理。Caddy 的自动 HTTPS 或 Traefik 配合 Let's Encrypt 可以全自动签发和续期。
子路径部署
部署在子路径下时,代理和实例两端的路径约定必须一致:代理要么剥离前缀再转发、要么原样传递,实例也要配置对应的基础路径,让页面中的脚本、样式和接口请求带上正确的前缀。
配置后打开浏览器开发者工具的「网络」面板,看是否有 404:
- 路径少了一段:入口脚本加载失败,页面白屏。
- 路径多了一段:页面骨架能加载,但样式和图标错乱。
三种接入方式
| 方式 | 适用场景 | 代价 |
|---|---|---|
| 反向代理 + 域名 | 长期对外提供服务 | 需要证书,需要维护代理配置 |
| SSH 隧道 | 临时远程排错 | 只在连接期间可用 |
| 内网 / VPN | 家用 NAS、公司内网 | 外网访问需要先连 VPN |
SSH 隧道通过加密通道把远程实例的端口映射到本地,浏览器访问本地端口即可。不需要域名和证书,不用改实例的监听配置,也不用在防火墙上开端口;断开 SSH 后通道即关闭。
内网直连适用于服务器和访问设备在同一局域网的情况,直接用局域网地址访问。需要在外网访问时,不要把端口映射到公网,而是用 WireGuard 或 Tailscale 搭建 VPN,先连入再访问内网地址。
代理之后的实例配置
配好代理后,还要调整实例自己的访问控制,否则请求仍会被拒绝:
| 项目 | 位置 | 说明 |
|---|---|---|
| 监听地址与端口 | 服务插件配置 | 默认只监听本机 |
| 允许远程访问 | 服务插件配置或环境变量 | 不开启时,即使代理正确也会被拒绝 |
| 访问令牌 | 配置 / 环境变量 / 数据目录 | 公网环境必须使用固定的强令牌 |
| 受保护前缀 | 服务插件配置 | 接口与控制台路径必须包含在内 |
最常见的遗漏是没有开启「允许远程访问」。
上线前自检
- 外网访问:用移动网络等外网设备打开控制台,确认能看到登录页。
- 流式回复:发起一次对话,确认回复是逐字出现的,没有被代理攒批。
- 轨迹刷新:对话进行中切到轨迹页,确认步骤实时滚动,而不是整轮结束后一次性出现。
- 断线重连:临时停掉反向代理,长连接应及时断开;恢复后页面能自动重连。
- 诊断:运行诊断命令,确认没有配置错误或监听警告。