如何快速将非标端口绑定至域名上

写在开头

近期有一些朋友咨询我关于如何将Python的Gradio,Flask或Docker项目绑定到域名上并制作缓存规则,本篇文章旨在介绍一种简单易懂的方案快速绑定域名。

准备道具

Miska, Muska, Mickey Mouse

这些是待会要用到的神秘妙妙工具

  • 一台可以访问互联网的电脑

本文张将以Unix类系统举例,本人使用macOS,从理论上与Linux通用,Windows用户请自行摸索

  • 一个域名
  • 一颗钻研的心
  • 一些英语水平

让我们开始吧

Step 0: 环境检查

这里的检查非常的重要,甚至建议这一步完成在购买服务器之前。以下一张来自阿里云帮助文档的图片很好的展示了这一点:

Aliyun ICP

如果你没有备案

备案则表示如果你想使用域名访问国内的服务器,不管什么端口都需要备案。如果你很遗憾的提前购买了国内服务器但是又没有备案,我建议你不用想备案的事情了,直接尝试联系客服退款。个人备案当今是难上加难,再加上各个地区管局的政策不太一样,个人备案可能性几乎为0,而且过于麻烦。

直接尝试购买海外云服务器如AWS,Azure,GCP,Digital Ocean在尝试下一步。

如果你有备案

那你是真nb,直接无脑冲国内低价云服务器,包靠谱的。但是你仍然需要解决一些镜像源的问题(如Docker,Apt等包管理器,Python)。

Step 1:安装Docker

对于macOS的用户来说,直接前往Docker官网下载安装Docker Dekstop即可或者使用brew安装Docker,我建议你拥有良好的国际互联网环境。

对于Linux的用户来说,我们可以使用以下几行命令完成:

1
2
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

在安装完成之后,无论什么系统,我们都应该可以使用docker --verion来查看当前版本,如果出现类似如下的提示,表示安装成功:

1
Docker version 26.1.4, build 5650f9b102

接着我们需要将Docker设置为开机自启动,对于Debian的服务器,使用如下命令即可完成,其他系统请自行搜索:

1
systemctl enable docker

Step 2: 安装Nginx Proxy Manager

这时候肯定就有懂哥跳出来说为什么不使用原版编译直接安装。我想说的是,这种操作过于的复杂,对新手不是很友好,如果你都知道怎么编译安装了,你也不回来看这篇文章对吧~

Nginx Proxy Manager以下简称为NPM

我们言归正传,首先我们需要创建一个供NPM保存数据的地方,使用:

1
mkdir -p ~/docker_data/npm

这会在你的用户根目录下递归创建一个名为docker_data的文件夹并且内有npm这个文件夹。

接着我们使用以下命令切换目录(change directory)进刚刚创建的文件夹。

1
cd ~/docker_data/npm

进入文件夹后,我们便可以使用一种类似于模板的配置文件来启动我们的NPM,这种文件被称之为Docker Compose,有兴趣的可以自行上网翻阅,以后可能单独出文章讲解Dockerfiledocker-compose.yml

1
vi docker-compose.yml

输入此命令之后我们按一下键盘上的i键,接着将如下内容复制进去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
# 自动重启政策,有always | unless-stopped | on-failure:<:max-retries> | no 可选
restart: unless-stopped
ports:
# 端口映射,使用如下格式 <host-port>:<container-port>
- '80:80' # Public HTTP Port,不可修改
- '443:443' # Public HTTPS Port,不可修改
- '8141:81' # Admin Web Port,建议修改为一个比较随机的端口
# 其他你想暴露的端口
# - '21:21' # FTP

# 如果在该部分中未注释任何内容,则取消注释下一行
# environment:
# 如果主机未启用 IPv6,请取消此处的注释
# DISABLE_IPV6: 'true'

volumes:
# 文件夹挂载路径,冒号前的路径需要与之前设置的路径相同,如/Users/jessiezhu/docker_data/npm/data
# 建议填写完整路径,避免以后手抖开错位置
# 可以使用pwd命令查看当前文件夹的绝对路径
- ./data:/data
- ./letsencrypt:/etc/letsencrypt

接着按一下键盘上的⎋ esc按钮,接着输入:wq来保存文件,别问为什么,问就是vim大法好(可自行上网学习,以后打死也不会出这个文章)。

这时候就有有经验的老司机尝试直接up容器了,但是我们还需要先检查端口是否被占用,使用如下命令判断端口是否占用,每个命令都不应该有输出,如果有,请查看是什么进程占用这他并按需kill掉。

如果没有lsof命令,请自行上网搜索安装方法。

1
2
3
lsof -i :<刚刚设置的所有端口>

#如: lsof -i :443

在确认端口未被占用之后,使用如下命令启动容器:

1
docker compose up -d

如果防火墙开放正确的话,我们可以使用http://:访问管理后台了

至于如何开放防火墙,请自行搜索,或咨询服务器厂商。建议将此管理口限制ip访问,以免出现因NPM自生漏洞导致的安全问题。

Step 3: 进行反向代理

什么是反向代理

此处引用来自Cloudflare博客的文章来给大家讲解,

反向代理流:流量从用户的设备 (D) 到互联网到反向代理 (E) 到源服务器 (F)

反向代理是位于一个或多个 Web 服务器前面的服务器,拦截来自客户端的请求。这与转发代理不同 - 在转发代理中,代理位于客户端的前面。使用反向代理,当客户端将请求发送到网站的源服务器时,反向代理服务器会在网络边缘拦截这些请求。然后,反向代理服务器将向源服务器发送请求并从源服务器接收响应。

转发代理和反向代理之间的区别非常细微,但非常重要。简单概括而言,转发代理位于客户端的前面,确保没有源站直接与该特定客户端通信;而反向代理服务器位于源站前面,确保没有客户端直接与该源站通信。
这一次,所涉及的计算机包括:

  • D:任意数量的用户家用计算机
  • E:这是反向代理服务器
  • F:一台或多台源站

通常,来自 D 的所有请求都将直接发送到 F,而 F 会直接将响应发送到 D。使用反向代理,来自 D 的所有请求都将直接发送给 E,而 E 会将其请求发送到 F 并从 F 接收响应,然后将适当响应传递给 D。

配置NPM

修改管理员密码

在登录管理后台之后,你将会看到一个登录界面,初始密码如下:

1
2
Email address: admin@example.com
Password: changeme

接着按照提示修改名称,邮件,密码。

此处会根据邮件读取来自Gravatar的头像作为用户头像。

绑定域名

进入Hosts界面,选择Add Proxy Host

Domain Names处填写用户访问的域名,不需要https://,如blog.createchstudio.com

接着一般情况下保持scheme不变,在Forward Hostname/IP处填写非标服务的主机名,如172.18.0.1

Forward Port处填写非标端口,如8080

接着可以勾选Block Common Exploits来防御常见漏洞

配置SSL证书(HTTPS)

如果你使用的是Cloudflare,并且SSL/TLS选项选择为灵活,则可跳过这一步骤,完成解析后并开启小橙云可直接使用HTTPS访问。

如果使用的是完全或想要使用自己的SSL证书,则需要以下步骤:

  1. 拉取Cloudflare证书或第三方可信证书
  2. 进入NPM的SSL Certificates选项卡
  3. Add SSL Certificate - Custom
  4. 自定义名称,建议为域名
  5. 上传私钥与公钥文件,中间证书留空
  6. 点击保存
  7. 回到刚刚添加的Hosts,在SSL选项卡内选择自定义的SSL证书

如果想要自己申请SSL证书,使用以下步骤:

SSL选项卡内选择Request a new SSL Certiicate

接着按需勾选Force SSL/HSTS,建议全部勾上,除了HSTS Subdomains

勾选Use a DNS Challenge选择你域名的DNS Provider并填入对应的Token

同意条款,并开始申请。

附加步骤:更新NPM

  1. cd进之前创建的npm目录,如~/docker_data/npm
  2. 停用容器(此操作会让绑定的所有网站下线,请择吉日更新)
1
docker compose down
  1. 备份配置
1
cp -r ~/docker_data/npm ~/docker_data/npm-bak
  1. 拉取新镜像
1
docker compose pull
  1. 重启容器
1
docker compose up -d
  1. 删除之前不再使用的镜像
1
docker image prune

游戏结束

恭喜你,你已经成功的将来自非标端口的服务绑定到域名并成功设置了SSL证书,祝你网站运营之旅顺利!

如果有进一步问题可以在地下评论哦~