部署Nginx Proxy Manager进行反向代理
我们怎么样才能把 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
2curl -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
2docker -v
docker-compose -v
防止 Docker 日志塞满硬盘并增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能:1
2
3
4
5
6
7
8
9
10
11
12
13cat > /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
3mkdir -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
38version: '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 | cd /root/data/docker_data/npm |
Docker 其实很容易上手,依靠 Docker 可以产生各样 “玩法”,Docker 和 Nginx Proxy Manager 的搭配确实很有意思!