宝塔反向代理:用域名访问本地应用

应用已经在服务器的 127.0.0.1:3000运行,希望用户通过域名访问,可以让宝塔管理的 Nginx 接收请求,再转交本地应用。本文以同一台服务器、整站代理、单个应用为例;3000 是示例端口,需要换成实际值。

先按对应应用教程完成程序部署与持续运行。反向代理只负责转发请求,不负责替应用安装依赖或实现开机启动。程序只能在当前 SSH 窗口中运行时,应先处理进程管理,避免关闭终端后网站就报错。

先证明应用自己可以响应

在应用所在服务器执行下面的检查;如果应用没有 /health路径,就换成它实际提供的一个无副作用的检查地址:

sudo ss -lntp 'sport = :3000'
curl -i --max-time 5 http://127.0.0.1:3000/health

先确认监听进程和响应内容都正确。本机就出现连接拒绝、超时或应用报错时,先修应用,添加代理不会自动解决这些问题。应用与 Nginx 在同机且没有其他访问需求时,后端端口可以只绑定回环地址,不必再向公网开放 3000。

Docker 部署要特别注意:宝塔运行在宿主机时,目标应指向已发布到宿主机的端口;容器里监听的 3000 不一定就是宿主机的 3000。如果 Nginx 本身也在容器里,127.0.0.1指向那个容器,不能直接照抄本文的目标地址。

进入对应网站,添加一条代理规则

域名先解析到正确入口,并在宝塔“网站”中建立对应站点。这里使用站点设置内的“反向代理”入口;已有 PHP 网站或已有根路径规则时,先保存配置并确认不会覆盖原业务,不要直接把整站 /接管。

宝塔网站设置中的反向代理列表

宝塔官方文档中的站点设置示例:左侧选择“反向代理”,右侧点击“添加反向代理”。图中为空白列表,实际操作前先确认自己的站点与已有规则。

点击“添加反向代理”,核对以下项目。不同版本可能把代理目录放在高级选项里,整站代理对应根路径 /。

字段 本例填写与含义
代理名称 用便于识别的名称,例如 local-web。
代理目录 整站使用 /。只代理一个子路径时,需要另行核对应用路径前缀与转发规则。
目标URL http://127.0.0.1:3000。协议要与后端实际服务一致,不因为外部使用 HTTPS 就把这里随便改成 HTTPS。
发送域名 这是发给后端的 Host,不是另一个转发目标。本例若应用按 app.example.com识别站点,就填写自己的实际业务域名,不带协议和路径。
缓存 首次接入先关闭代理缓存。登录、账户、订单等个性化接口不能因为复制示例而被公共缓存。

目标URL不要填成最终访问域名,否则该域名又指回同一个 Nginx 时,可能形成转发循环。后端要求特定 Host 的项目,发送域名按应用实际配置填写;表中的 app.example.com只是占位示例,需要替换。

保存后,从公网入口检查一遍

保存规则后查看面板是否报告配置错误,确保 Nginx 成功重载。随后从自己的电脑访问域名,核对页面和接口。app.example.com在下面只是示例,必须替换:

curl -i --max-time 10 http://app.example.com/health

对照这次返回与前面的本机响应,确认访问的是同一个应用,而不是默认页或另一站点。只看到首页不能结束检查,还要测试实际使用的登录、资源和接口路径。准备公开使用前,再为域名配置 HTTPS;相关方法见网站 HTTPS 配置指南。

HTTPS和WebSocket还要多看两处

外部 HTTPS 在 Nginx 结束后,Nginx 到本机应用可以继续使用 HTTP。应用若需要生成正确的 HTTPS 地址和安全 Cookie,应正确处理代理传递的协议与 Host 信息,并只信任明确的代理来源。反复跳转到 HTTP 或陷入重定向循环时,检查这一层,不要只反复打开“强制 HTTPS”。

应用使用 WebSocket 时,普通 HTTP 页面正常不代表长连接也正常。面板版本提供 WebSocket 选项的,按应用需要启用;没有该选项时,结合所用 Nginx 版本检查升级请求的转发配置,不要直接覆盖整份站点文件。最后使用应用实际的实时通信功能验证连接能保持。

需要限制管理路径的应用,还应复核代理生效后的访问规则。原站点里针对本地目录的访问限制,不一定仍覆盖代理转发后的同一路径;应在实际代理位置或应用自身验证限制结果。

出现错误时,按这一组现象定位

  • 502:先重跑本机 curl,检查进程、端口、HTTP/HTTPS 协议是否一致,再看本次站点的错误日志。
  • 504:检查后端是否长期无响应、数据库是否堵塞。先找慢的环节,不把无限加长超时当成修复。
  • 网页能开,静态资源404:核对应用生成的路径、部署前缀和代理目录;不要用内容替换盲改所有响应。
  • 关闭SSH后网站就打不开:回到应用的 systemd 或进程管理配置,反向代理不会维持一个已经退出的程序。

排查时记录同一个请求在应用日志和 Nginx 日志中的时间。面板保存失败时恢复修改前的规则;已影响原业务时,先撤销本次新增规则并核对旧站点,不清空所有代理配置。