1. 前言
如果你希望将 IP+ PORT 的访问方式转变为通过域名来访问,可以通过反向代理来实现。
反向代理允许你将外部请求发送到内网或不同端口的服务器,而用户访问时只需要通过域名即可。
很多小伙伴可能对反向代理并不是很了解,我们就趁着今天来简单介绍一下。
2. 操作环境
服务器:腾讯轻量应用服务器
系统:Ubuntu 22.04
需要一个域名
Docker 环境
3. 什么是代理
百度百科解释
代理(Proxy)是指在网络通信中,充当中介角色的服务器或软件,它会代表客户端与目标服务器进行数据交换。简单来说,代理是客户端与服务器之间的“代劳者”,它接收客户端的请求并将其转发到目标服务器,再将响应结果返回给客户端。
简单来说:代理就是第三方。
代理的作用有很多种,以下解析下常见的两种类型:
3.1 正向代理
代理服务器代理客户端,局域网中的电脑用户想要直接访问网络是不可行的,只能通过代理服务器来访问,这种代理服务就被称为正向代理。

场景:
你:住在中国,无法直接使用A国的支付方式购买游戏。
小B:住在A国,拥有A国的银行账户和信用卡,能够在A国的游戏商店进行购买。
游戏商店:只接受A国地区的支付方式和用户。
过程:
你支付给小B足够的款项,并告诉他你想购买的游戏。
小B使用自己的A国信用卡或支付账户,在A国的游戏平台上为你购买游戏。
一旦游戏购买成功,小B将游戏账号和登录信息提供给你,或者直接将游戏下载链接传给你。
正向代理的工作方式:
在这个过程中,小B充当了正向代理。你是最终的消费者,但由于商店只允许A国的用户购买,你通过小B的身份完成了购买。游戏商店知道的是小B在购买游戏,而不是你。
小B的身份对游戏商店透明,而你则通过小B“代理”完成了购买。
3.2 反向代理
代理服务器代理后端服务端,客户端无法感知代理,因为客户端访问网络不需要配置,只要把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据,然后再返回到客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址

场景:
假设你是一个公司,拥有多个不同的服务和应用,每个服务都运行在不同的服务器和端口上。例如:
一个服务器运行着公司网站的内容(如
www.company.com:8080)。另一个服务器负责处理客户数据的API(如
api.company.com:9090)。还有一个服务器负责公司内部的管理后台(如
admin.company.com:7070)。
为了方便用户访问这些服务,你不希望客户直接知道每个服务背后的具体IP地址和端口号,而是希望用户通过统一的域名和端口(比如 www.company.com)来访问不同的服务。
过程:
用户访问:用户在浏览器中输入
www.company.com来访问公司网站。反向代理:反向代理服务器(比如 Nginx)接收到这个请求后,根据请求的路径或域名,将请求转发到相应的服务器和端口:
如果请求的是网站内容(比如
www.company.com),反向代理将请求转发到内部运行网站的服务器www.company.com:8080。如果请求的是 API(比如
api.company.com),反向代理将请求转发到后台处理 API 请求的服务器api.company.com:9090。如果是公司管理后台请求(比如
admin.company.com),反向代理将请求转发到admin.company.com:7070。
返回响应:各个服务处理完请求后,响应通过反向代理返回给用户,用户并不会知道这个请求是如何被转发到不同的服务和端口的,始终只看到一个统一的域名。
反向代理的工作方式:
你可以使用 反向代理 来解决这个问题,通常是通过一个服务器(如 Nginx 或 Apache)来充当代理,处理客户端请求并将请求转发到不同的内部服务。
通常我们在购买服务器后会安装一个宝塔面板来配置一个站点对应的Nginx映射:
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade-Insecure-Requests 1;
proxy_set_header X-Forwarded-Proto https;
proxy_pass http://IP:PORT/;
}那如果没有安装宝塔,也可以用一个更简单的Docker项目来完成反向代理的操作。
4. Nginx Proxy Manager
Nginx proxy manager是一个很简单的反向代理工具。
官网:
门槛极低,操作简单,不需要你掌握很复杂的Nginx配置知识,只需要几步就能很轻松完成反向代理的设置和SSL证书的部署。
it had to be so easy that a monkey could do it.
5. 开始部署
服务器环境:Ubuntu 20.04(Debian 10也可以 )或以上版本
5.1 登陆服务器
选择一款连接SSH的软件。
如果不会可以看这个文档:连接SSH的软件和相关操作
Mac 或者 Linux 用户可以直接用系统自带的 终端(也叫 Terminal)来登陆服务器。
输入:
ssh 你的用户名@你的服务器IP -P 22
如果你没有更改 ssh 的端口,默认就是 22,当然为了服务器安全,建议你可以换一个别的端口,具体请见:保护好你的小鸡!保姆级服务器安全教程!
5.2 添加SWAP虚拟内存
注意:VPS 的内存如果过小,建议设置一下 SWAP,一般为内存的 1-1.5 倍即可,可以让系统运行更流畅!
设置 SWAP 可以用脚本:
wget -O box.sh https://raw.githubusercontent.com/BlueSkyXN/SKY-BOX/main/box.sh && chmod +x box.sh && clear && ./box.sh

选择 18,然后输入你想要扩容的数值即可。

5.3 升级 packages
sudo -i # 切换到 root 用户
apt update -y # 升级 packages
apt install wget curl sudo vim git -y # Debian 系统比较干净,安装常用的软件
5.4 安装 Docker 环境
5.4.1 安装 Docker(非大陆服务器)
wget -qO- get.docker.com | bash
docker -v #查看 docker 版本
systemctl enable docker # 设置开机自动启动
5.4.2 安装 Docker-compose(非大陆服务器)
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version #查看 docker-compose 版本
5.4.3 安装 Docker(国内服务器)
curl -sSL https://get.daocloud.io/docker | sh
docker -v #查看 docker 版本
systemctl enable docker # 设置开机自动启动
5.4.4 安装 Docker-compose(国内服务器)
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.1.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version #查看 docker-compose 版本
5.4.5 修改 Docker 配置(可选)
内容参考:烧饼博客
以下配置会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,以及限制日志文件大小,防止 Docker 日志塞满硬盘(泪的教训):
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 服务:
systemctl restart docker5.5 安装 Nginx Proxy Manager
5.5.1 创建安装目录
创建一下安装的目录:
sudo -i
mkdir -p /root/data/docker_data/npm
cd /root/data/docker_data/npm
这边我们直接用 docker 的方式安装。
vim docker-compose.yml
英文输入法下,按 i
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # 保持默认即可,不建议修改左侧的80
- '81:81' # 冒号左边可以改成自己服务器未被占用的端口
- '443:443' # 保持默认即可,不建议修改左侧的443
volumes:
- ./data:/data # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 data 文件夹中
- ./letsencrypt:/etc/letsencrypt # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 letsencrypt 文件夹中
按一下 esc,然后 :wq 保存退出,之后,
5.5.2 打开服务器防火墙并访问网页(非必需)
打开防火墙的端口 81
举例,腾讯云打开方法如下:


图中示例填的是 5230,备注填的是 memos,这边我们填 81,示例填 nginxproxymanager ,确定即可(如果你在 docker-compose 文件里换了 82,这边就需要填 82,以此类推)

查看端口是否被占用(以 81 为例),输入:
lsof -i:81 #查看 81 端口是否被占用,如果被占用,重新自定义一个端口
如果啥也没出现,表示端口未被占用,我们可以继续下面的操作了~
如果出现:
-bash: lsof: command not found
运行:
apt install lsof #安装 lsof
如果端口没有被占用(被占用了就修改一下端口,比如改成 82,注意 docker 命令行里和防火墙都要改)
5.5.3 运行并访问 Nginx Proxy Manager
最后:
cd /root/data/docker_data/npm # 来到 dockercompose 文件所在的文件夹下
docker-compose up -d
理论上我们就可以输入 http://ip:81 访问了。
默认登陆名和密码:
Email: admin@example.com
Password: changeme
注意:
1、不知道服务器 IP,可以直接在命令行输入:
curl ip.sb,会显示当前服务器的 IP。2、遇到访问不了的情况,请再次检查在宝塔面板的防火墙和服务商的后台防火墙是否打开对应了端口。
5.6 更新 Nginx Proxy Manager
cd /root/data/docker_data/npm
docker-compose down
cp -r /root/data/docker_data/npm /root/data/docker_data/npm.archive # 万事先备份,以防万一
docker-compose pull
docker-compose up -d # 请不要使用 docker-compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker-compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。
docker image prune # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像
提示:
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]
输入 y
利用 Docker 搭建的应用,更新非常容易~
5.7 卸载 Nginx Proxy Manager
cd /root/data/docker_data/npm
docker-compose down
rm -rf /root/data/docker_data/npm # 完全删除映射到本地的数据
可以卸载得很干净。
6. 最后
NPM的功能还有很多,预计还有两期,一期讲泛域名证书的配置,一期讲安全防护,这次只是简单介绍一下,大家可以发挥钻研精神,自己先研究研究。
有了NPM,可以统一管理,的确方便了很多,但总觉得还缺少点什么?有没有类似NPM这种有UI界面的工具,可以让我们直观地看到Docker的容器呢?Docker容器如果也可以统一管理,查看状态就很棒,别急,下期给大家带来!
评论区