我们怎么样才能把 IP + 端口变成域名来访问?

答案是用反向代理

Nginx proxy manager 是一个很简单的反向代理工具

其使用门槛极低,操作简单,不需要你掌握很复杂的 Nginx 配置知识,只需要几步就能很轻松完成反向代理的设置和 SSL 证书的部署

准备工作

购买一台服务器,购买一个域名

本次折腾采用的是 vultr 的 Debian12|1G|25G 的服务器

登录服务器,使用以下命令让系统防火墙放行相应端口(如果要链接服务器提供商的防火墙组策略,请登录服务器商的界面进行设置):

1
sudo ufw allow proto tcp from any to any port 80,443,881 && sudo iptables -F

安装 Docker

官方一键安装脚本:

1
2
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

安装 Docker Compose

从 Github 上下载它的二进制包来使用

运行以下命令以下载 Docker Compose 的当前稳定版本:

非大陆服务器使用:

1
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

大陆服务器使用:

1
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

要安装其他版本的 Compose,请替换 v2.2.2(版本号)

将可执行权限应用于二进制文件:

1
sudo chmod +x /usr/local/bin/docker-compose

创建软链(非必须):

1
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

测试是否安装成功:

1
2
docker -v
docker-compose -v

防止 Docker 日志塞满硬盘并增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
cat > /etc/docker/daemon.json <<EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "3"
},
"ipv6": true,
"fixed-cidr-v6": "fd00:dead:beef:c0::/80",
"experimental":true,
"ip6tables":true
}
EOF

重启 Docker:

1
systemctl restart docker

查看 Docker 运行状态:

1
systemctl status docker

在 Docker 内创建配置文件并运行 Nginx Proxy Manager

命令如下:

1
2
3
mkdir -p /root/data/docker_data/npm    #在/root/data/docker_data/下创建文件夹npm
cd /root/data/docker_data/npm #进入到npm文件夹下
nano docker-compose.yml #在当前文件创建并添加或修改docker-compose.yml文件

我的 docker-compose.yml 的配置内容如下:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
version: '3.8'
services:
app:
image: 'chishin/nginx-proxy-manager-zh:latest' #我这里选择的是中文版
restart: unless-stopped
ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port #将容器内部的 80 端口映射到宿主机的 80 端口,通常用于 HTTP 服务
- '443:443' # Public HTTPS Port #将容器内部的 443 端口映射到宿主机的 443 端口,通常用于 HTTPS 服务。
- '811:81' # Admin Web Port #将容器内部的 81 端口映射到宿主机的 881 端口,可能用于其他服务或管理界面。
# Add any other Stream port you want to expose
# - '21:21' # FTP
environment:
# Mysql/Maria connection parameters:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm" #密码配置项,可修改
DB_MYSQL_NAME: "npm"
# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- db

db:
image: 'jc21/mariadb-aria:latest'
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'npm' #密码配置项,可修改
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'npm' #密码配置项,可修改
MARIADB_AUTO_UPGRADE: '1'
volumes:
- ./mysql:/var/lib/mysql

运行 Nginx Proxy Manager

在 npm 文件下(文件夹内要有 docker-compose.yml 文件)运行命令:

1
docker-compose up -d

等待一会儿后

使用 “服务器 IP: 端口号”(端口号是之前配置的 Nginx Proxy Manager 的文件的管理界面的访问端口)

如我配置的是 811 端口,便可以通过 “服务器 IP:883” 地址访问管理界面

使用 Nginx Proxy Manager 进行反向代理

打开浏览器,地址栏输入 “服务器 IP: 端口号” 来访问 Nginx Proxy Manager 的管理界面

在管理界面的添加代理服务,填写相关信息,进行 Nginx Proxy Manager 的反向代理

界面内具体的配置过程我就不演示了,可自行查找相关教程

值得注意的一点是,在代理同一个服务器本地服务时可填写 docker0 的 IP

可使用以下命令找到 docker0 的 IP 地址:

1
ip addr show docker0 

然后再填写不同服务所使用的端口号创建多个代理

这样就实现了在同一个服务器上不同服务的反向代理

最后,可以使用 Nginx Proxy Manager 来帮助 “IP:PORT” 申请 SSL 证书并部署到服务器上

注意当 Docker 重启后,你需要重新运行 docker-compose up 命令来启动之前定义在 docker-compose.yml 文件中的服务:

1
2
cd /root/data/docker_data/npm
docker-compose up -d

Docker 其实很容易上手,依靠 Docker 可以产生各样 “玩法”,Docker 和 Nginx Proxy Manager 的搭配确实很有意思!