编辑
2025-11-02
技术漫谈
00
请注意,本文编写于 59 天前,最后修改于 38 天前,其中某些信息可能已经过时。

目录

一、当前环境
二、核心思路:隔离、挂载与转发
三、详细操作步骤
第一步:在宝塔面板准备 HTML 文件
第二步:用Docker挂载静态HTML文件
第三步:配置 NPM 进行流量转发
四、验证成果与未来扩展
验证
如何扩展:添加更多小工具?

Gemini_Generated_Image_55fl9k55fl9k55fl.png

现在有一个新的 HTML 静态小工具,需要通过子目录路径(例如 https://zym588.space/my-tool 来发布和访问,同时避免在 NAS 上配置复杂的内网穿透。

一、当前环境

  1. 云服务器:已安装宝塔面板
  2. 反向代理:在云服务器使用 Docker 容器安装了 Nginx Proxy Manager (NPM),作为所有服务的公网入口,管理域名和 SSL 证书。
  3. 服务:大部分服务(如博客)运行在本地NAS上,通过内网穿透连接到云服务器上的 NPM。
  4. 关键冲突:为确保 NPM 的 Docker 容器能监听并占用 80 (HTTP) 和 443 (HTTPS) 端口,宝塔面板自带的 Nginx 服务保持在“已关闭”状态。

目标 (The Goal): 现在有一个新的 HTML 静态小工具,需要通过子目录路径(例如 www.your-domain.com/my-tool)来发布和访问,同时避免在 NAS 上配置复杂的内网穿透。


二、核心思路:隔离、挂载与转发

既然宝塔的 Nginx 无法启动(端口冲突),而 NAS 上的服务链路又太长(配置麻烦),最佳方案是:

在云服务器上,启动一个全新的、专用的、独立的 Nginx 容器,专门用于托管这个 HTML 小工具。

这个新容器将:

  1. 占用 80443 端口,而是监听一个“内部端口”(例如 5001),因此不会与 NPM 容器冲突。
  2. 通过 Docker 的“卷挂载”功能,直接读取存放在服务器上的 HTML 文件。
  3. 最后,配置 NPM,将 .../my-tool 路径的流量转发到本地的 127.0.0.1:5001

此方案可将新工具与现有复杂环境完美隔离开,实现简单、干净、可复制的部署,且不干扰任何现有服务。


三、详细操作步骤

第一步:在宝塔面板准备 HTML 文件

  1. 登录宝塔面板
  2. 点击左侧菜单的 “文件”
  3. 导航到一个合适的位置,例如 /www/wwwroot/ 目录。
  4. 点击 “新建目录”,创建一个专门存放小工具的文件夹,命名为 my-tool。(完整路径:/www/wwwroot/my-tool
  5. 进入这个新建的 /www/wwwroot/my-tool 文件夹。
  6. 点击 “上传” 按钮,将 HTML 小工具文件(以及相关的 CSS/JS 文件夹)上传到此目录。
  7. 【关键步骤】:Nginx 这类网页服务器,默认会在目录中寻找 index.html 作为首页文件。为实现自动加载,必须确保主 HTML 文件被重命名为 index.html

PixPin_2025-11-02_20-42-48.png

第二步:用Docker挂载静态HTML文件

此步骤将启动一个 Nginx 服务,并使其读取第一步中准备的文件。

  1. 在宝塔面板,点击左侧菜单的 “终端” (如果找不到,请去“软件商店”安装“宝塔SSH终端”)。

  2. 登录终端后,复制 下面这行命令,粘贴 到终端中,然后按回车键:

    bash
    docker run -d --name my-tool-server -p 5001:80 -v /www/wwwroot/my-tool:/usr/share/nginx/html:ro nginx:alpine
  3. 命令拆解:

    • 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 进行流量转发

最后一步,是配置 NPM,将特定路径的公开访问流量转发到新启动的内部服务上。

  1. 登录云服务器上的 Nginx Proxy Manager (NPM) 面板

  2. 点击 Hosts > Proxy Hosts

PixPin_2025-11-02_20-47-55.png

  1. 找到要使用的主域名(例如 www.zym588.space),点击右侧的“三点”菜单,选择 Edit

PixPin_2025-11-02_20-48-31.png

  1. 在弹出的窗口中,选择 "Custom locations" 标签页。

  2. 点击 "Add location" 按钮。

  3. 填写 Location 路由信息

    • Define location: ^~ /my-tool
      • (^~ 是一个 Nginx 匹配修饰符,意为“高优先级匹配”。它指示 Nginx,一旦 URL 以 /my-tool 开头,就立即使用此规则,不再尝试匹配其他更通用的规则(例如已有的、指向 NAS 的 / 规则),确保新规则被优先处理。)
    • Scheme: http
      • (因为新 Nginx 容器在内部监听的是 HTTP 协议。)
    • Forward Hostname / IP: 127.0.0.1
      • (因为新 Nginx 容器和 NPM 运行在同一台云服务器上,127.0.0.1 即“本机地址”。)
    • Forward Port: 5001
      • (指向第二步中 -p 映射的那个服务器端口。)

PixPin_2025-11-02_20-48-56.png

  1. 【关键】配置路径剥离 (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" 文本框中,粘贴 以下两行代码:

      nginx
      rewrite ^/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-Btool-C...

  1. 宝塔:创建新目录 /www/wwwroot/tool-B,上传 tool-Bindex.html
  2. 终端:运行一行docker run 命令,使用一个新端口(如 5002)、新名字新目录
    bash
    docker run -d --name tool-B-server -p 5002:80 -v /www/wwwroot/tool-B:/usr/share/nginx/html:ro nginx:alpine
  3. NPM:在 www.zym588.space再加一个 Location,指向 ^~ /tool-B,转发到 127.0.0.1:5002,并配置对应rewrite 规则 (只需将 my-tool 替换为 tool-B)。

建议:当此类服务超过两三个时,管理多条 docker run 命令会变得繁琐。届时,最佳实践是学习使用 docker-compose.yml 文件。它允许使用一个“清单”文件来统一定义和管理所有服务,实现一键启动、停止和更新。

本文作者:小转圈

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!