
现在有一个新的 HTML 静态小工具,需要通过子目录路径(例如 https://zym588.space/my-tool 来发布和访问,同时避免在 NAS 上配置复杂的内网穿透。
80 (HTTP) 和 443 (HTTPS) 端口,宝塔面板自带的 Nginx 服务保持在“已关闭”状态。目标 (The Goal):
现在有一个新的 HTML 静态小工具,需要通过子目录路径(例如 www.your-domain.com/my-tool)来发布和访问,同时避免在 NAS 上配置复杂的内网穿透。
既然宝塔的 Nginx 无法启动(端口冲突),而 NAS 上的服务链路又太长(配置麻烦),最佳方案是:
在云服务器上,启动一个全新的、专用的、独立的 Nginx 容器,专门用于托管这个 HTML 小工具。
这个新容器将:
80 或 443 端口,而是监听一个“内部端口”(例如 5001),因此不会与 NPM 容器冲突。.../my-tool 路径的流量转发到本地的 127.0.0.1:5001。此方案可将新工具与现有复杂环境完美隔离开,实现简单、干净、可复制的部署,且不干扰任何现有服务。
/www/wwwroot/ 目录。my-tool。(完整路径:/www/wwwroot/my-tool)/www/wwwroot/my-tool 文件夹。index.html 作为首页文件。为实现自动加载,必须确保主 HTML 文件被重命名为 index.html。
此步骤将启动一个 Nginx 服务,并使其读取第一步中准备的文件。
在宝塔面板,点击左侧菜单的 “终端” (如果找不到,请去“软件商店”安装“宝塔SSH终端”)。
登录终端后,复制 下面这行命令,粘贴 到终端中,然后按回车键:
bashdocker run -d --name my-tool-server -p 5001:80 -v /www/wwwroot/my-tool:/usr/share/nginx/html:ro nginx:alpine
命令拆解:
docker run -d:在后台(-d 即 detached)运行一个新容器。--name my-tool-server:为容器指定一个名称,方便后续管理(如 docker stop my-tool-server)。-p 5001:80:端口映射。将云服务器的 5001 端口连接到容器内部的 80 端口。Nginx 默认在容器里监听 80 端口。-v /www/wwwroot/my-tool:/usr/share/nginx/html:ro:卷挂载。这是操作的精髓。它将服务器上的文件夹(/www/wwwroot/my-tool)“链接”到 Nginx 容器内部的默认网站根目录(/usr/share/nginx/html)。:ro:(read-only) 这是一个安全设置,表示容器只能“只读”文件,不能修改。nginx:alpine:指定使用的 Docker 镜像。nginx:alpine 是一个官方的、超轻量级的 Nginx 镜像,专为静态文件托管而生,体积小、启动快。执行完毕后,小工具已经在云服务器的 127.0.0.1:5001 端口上成功运行了。
最后一步,是配置 NPM,将特定路径的公开访问流量转发到新启动的内部服务上。
登录云服务器上的 Nginx Proxy Manager (NPM) 面板。
点击 Hosts > Proxy Hosts。

www.zym588.space),点击右侧的“三点”菜单,选择 Edit。
在弹出的窗口中,选择 "Custom locations" 标签页。
点击 "Add location" 按钮。
填写 Location 路由信息:
^~ /my-tool
^~ 是一个 Nginx 匹配修饰符,意为“高优先级匹配”。它指示 Nginx,一旦 URL 以 /my-tool 开头,就立即使用此规则,不再尝试匹配其他更通用的规则(例如已有的、指向 NAS 的 / 规则),确保新规则被优先处理。)http
127.0.0.1
127.0.0.1 即“本机地址”。)5001
-p 映射的那个服务器端口。)
【关键】配置路径剥离 (Path Stripping):
访客访问的是 .../my-tool/index.html。如果直接转发,5001 端口的 Nginx 会试图在 /usr/share/nginx/html/my-tool/index.html 里找文件,这会失败(因为挂载的根目录里没有 my-tool 这一层)。
必须在转发前“剥掉” URL 里的 /my-tool 部分。
点击 ^~ /my-tool 输入框右侧的 齿轮 (⚙️) 图标。
在弹出的 "Custom Nginx Configuration" 文本框中,粘贴 以下两行代码:
nginxrewrite ^/my-tool/(.*)$ /$1 break; rewrite ^/my-tool$ / break;
代码详解:
rewrite ^/my-tool/(.*)$ /$1 break;:处理所有带子路径的请求(如 .../my-tool/style.css)。 (.*) 会“捕获” /my-tool/ 后面的所有内容(即 style.css),并存为变量 $1。Nginx 将 URL 重写为 /$1(即 /style.css),break 停止后续重写,并将这个新 URL 转发出去。rewrite ^/my-tool$ / break;:处理只输入 .../my-tool(没有末尾斜杠)的情况,将其重写为 /,Nginx 收到 / 后会自动寻找 index.html。点击 Save 保存此自定义配置。
8. 点击右下角绿色的 **Save** 按钮,保存整个主机的配置。
回到 NPM 的 Proxy Hosts 列表,www.zym588.space 的状态应该立即变为了 "Online" (绿色)。NPM 会定期进行健康检查,此时它能成功连接到 127.0.0.1:5001。
如果状态未变绿,可尝试刷新 NPM 页面。如果仍有问题,请返回宝塔终端,运行 docker ps 命令,确保名为 my-tool-server 的容器正处于 RUNNING 状态。
最后,打开浏览器,在隐身模式下访问 http://www.zym588.space/my-tool,即可看到 HTML 小工具的页面。
此方法的可复制性很强。如果以后需要添加 tool-B、tool-C...
/www/wwwroot/tool-B,上传 tool-B 的 index.html。docker run 命令,使用一个新端口(如 5002)、新名字和新目录:
bashdocker run -d --name tool-B-server -p 5002:80 -v /www/wwwroot/tool-B:/usr/share/nginx/html:ro nginx:alpine
www.zym588.space 里再加一个 Location,指向 ^~ /tool-B,转发到 127.0.0.1:5002,并配置对应的 rewrite 规则 (只需将 my-tool 替换为 tool-B)。建议:当此类服务超过两三个时,管理多条 docker run 命令会变得繁琐。届时,最佳实践是学习使用 docker-compose.yml 文件。它允许使用一个“清单”文件来统一定义和管理所有服务,实现一键启动、停止和更新。
本文作者:小转圈
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!