前言:家庭开发者的“甜蜜烦恼”
你是否也想在家里搭建自己的服务?无论是 NAS、个人网站、代码仓库,还是影音中心,将这些服务安全地发布到公网,随时随地访问,是许多技术爱好者的乐趣所在。
通常,我们会遇到两大“拦路虎”:
- 动态公网IP:这个问题比较好解决,通过 DDNS(动态DNS)就能搞定。
- 运营商端口封锁:这是一个更棘手的问题。国内的家庭宽带(如电信、联通)普遍封锁了网站服务的标准端口
80
(HTTP) 和443
(HTTPS)。
这导致我们无法通过 https://你的域名.com
这样标准的方式来访问服务。退而求其次,我们只能使用非标准端口,例如 https://你的域名.com:8008
。
那么,如果我有多个服务需要发布呢?比如一个 8008
端口的A服务,和一个 8009
端口的B服务,我希望通过 https://你的域名.com:8008
和 https://你的域名.com:8009
分别访问它们。本文将以广受好评的服务器管理面板 1Panel 为例,手把手教你如何实现这个目标。
核心思路:端口映射的“移花接木”
在开始之前,我们需要理解其中的核心逻辑。关键在于,我们的 Web 服务器(在1Panel中是 OpenResty)需要一种方法来区分发往 8008
和 8009
的请求。
由于路由器的一个外部端口只能转发到一个内部端口,我们不能把 8008
和 8009
都转发到服务器的同一个 443
端口上。
正确的做法是:让服务器内部也监听多个端口,然后建立一一对应的转发关系。
- 外部请求
...:8008
→ 路由器转发到 → 服务器:443
→ 指向服务A - 外部请求
...:8009
→ 路由器转发到 → 服务器:444
→ 指向服务B
理解了这一点,接下来的操作就会非常清晰。
准备工作
在开始之前,请确保您已准备好:
- 一台安装好 1Panel 并正常运行的服务器。
- 一个已经设置好 DDNS 并指向您家公网IP的域名(例如
sh.jue.sh
)。 - 至少两个在您服务器上运行的内部服务(例如,一个在
127.0.0.1:8008
,另一个在127.0.0.1:8009
)。 - 您家路由器的管理员权限。
第一步:配置第一个服务 (基础)
首先,我们来配置 https://sh.jue.sh:8008
,为后续操作打下基础。
- 在1Panel中创建反向代理
- 进入 「网站」 → 「创建网站」 → 选择 「反向代理」。
- 主域名:
sh.jue.sh
- 代理地址:
http://127.0.0.1:8008
(您的第一个服务地址)
- 申请SSL证书 (关键步骤)
- 网站创建后,进入该网站的 「配置」 → 「SSL」。
- 证书来源选择
Let's Encrypt
。 - 申请方式必须选择
DNS-01
!因为80端口被封,无法使用文件验证。你需要选择你的DNS服务商并填入API密钥。 - 点击“申请并启用”,并开启“强制HTTPS”。
- 设置路由器端口转发
- 登录路由器管理后台。
- 添加一条转发规则:外部端口
8008
转发到 1Panel服务器内网IP的443
端口。
- 验证
- 现在,访问
https://sh.jue.sh:8008
,您应该能正常看到您的第一个服务,并且浏览器会显示安全锁标志。
- 现在,访问
第二步:让1Panel的Web服务器监听新端口
默认情况下,1Panel的Web服务器只监听 80
和 443
端口。我们需要让它多监听一个端口,比如 444
。
- 在1Panel中,进入 「应用」 → 找到
OpenResty
→ 点击 「配置」。 - 编辑
docker-compose.yml
文件。 - 在
ports
部分,新增一行- "444:444"
。ports: - "80:80" - "443:443" - "444:444" # <-- 新增此行
- 点击 「保存并更新」。容器会自动重启,并开始监听
444
端口。
第三步:手动为第二个服务创建配置文件
这是本次操作最核心的步骤。我们需要手动创建一个配置文件来处理到 444
端口的请求。
- 在1Panel中,进入 「文件」。
- 导航到目录:
/opt/1panel/apps/openresty/openresty/www/sites/sh.jue.sh/
- 您会看到一个
sh.jue.sh.conf
文件。复制并粘贴该文件,将其重命名为sh.jue.sh_8009.conf
。 - 双击打开这个新的
..._8009.conf
文件,修改以下两处:- 将
listen 443 ssl http2;
修改为listen 444 ssl http2;
- 将
proxy_pass http://127.0.0.1:8008;
修改为proxy_pass http://127.0.0.1:8009;
# 在 sh.jue.sh_8009.conf 文件中 server { listen 444 ssl http2; # <-- 修改监听端口 # ... 中间配置保持不变 ... server_name sh.jue.sh; ssl_certificate /www/sites/sh.jue.sh/fullchain.pem; ssl_certificate_key /www/sites/sh.jue.sh/privkey.pem; # ... SSL证书配置保持不变,共用同一张证书 ... location / { proxy_pass http://127.0.0.1:8009; # <-- 修改为第二个服务的地址 # ... 其他 proxy 配置保持不变 ... } }
- 将
- 保存文件。
第四步:加载配置并完成最后设置
- 重载配置
- 回到 「应用」 →
OpenResty
→ 点击 「重载」,让新配置文件生效。
- 回到 「应用」 →
- 新增路由器转发规则
- 再次进入路由器管理后台。
- 新增一条转发规则:外部端口
8009
转发到 1Panel服务器内网IP的444
端口。
大功告成!
现在,一切都已准备就绪。打开浏览器:
- 访问
https://sh.jue.sh:8008
,您看到的是服务A。 - 访问
https://sh.jue.sh:8009
,您看到的是服务B。
两个服务都使用了HTTPS加密,并且通过同一个域名、不同端口进行访问,完美解决了端口封锁环境下的多服务发布需求。
最后的话
通过一些手动的“高级”操作,我们成功地扩展了1Panel的默认功能,使其适应了特殊的网络环境。这种方法的核心在于理解端口转发和Web服务器监听的原理。
需要注意的是,由于我们手动创建了配置文件,当1Panel未来有重大更新时,您可能需要检查手动配置是否依然兼容。不过,这种底层逻辑非常稳定,一般不会受到影响。
希望这篇教程能帮助到有同样困扰的朋友们,祝大家折腾愉快!