原文链接

一、什么是反向代理?

众所周知,浏览器访问网页需要域名:端口号 或者ip:端口号 这种形式,而当你访问页面时不输入端口号时,浏览器会根据http协议或者https协议,自动在后面加上默认端口号80或者443

但是我这种小白使用服务器搭建服务时,一个服务器上往往有多种 web 服务。端口又不能复用,所以其他服务都是需要域名:端口号 或者ip:端口号 这种形式来访问。于是,我就有一个疑问了,能不能用不同的域名来对应不同的服务呢。

那这就是反向代理的作用了。

反向代理类似于一个菜鸟驿站。邮局(互联网)对于地址(域名)是每个咱们小区(服务器)的包裹(数据报文)都直接发给咱们小区的菜鸟驿站(反向代理服务器),然后菜鸟驿站根据每个包裹地址(域名)然后交付给咱们小区的具体家庭(服务器中的每一个服务)。

反向代理作用

而 Nginx 则作为非常有名的反向代理 web 服务器,被广大站长采用。Nginx 功能十分强大,但是配置对于小白来说,还是有一些门槛。那么有没有一款基于 Nginx 的 web 管理界面,来设置 Nginx 的反向代理呢?

这就是此篇博客要写的神器:Nginx Proxy Manager。

二、Nginx Proxy Manager 有什么功能?

以下是 Nginx Proxy Manager 的官网介绍

This project comes as a pre-built docker image that enables you to easily forward to your websites running at home or otherwise, including free SSL, without having to know too much about Nginx or Letsencrypt.
该项目作为一个预构建的 docker 镜像提供,使您能够轻松地转发到在家里或其他地方运行的网站,包括免费的 SSL,而无需对 Nginx 或 Letsencrypt 有太多了解。

它的功能总结起来就是以下几点:

  • 轻松的反向代理设置
  • 轻松配置 HTTPS
  • 提供简单的访问权限设置

好了,talk is cheap。接下来进入 Nginx Proxy Manager 一系列实战操作,让我们玩转 Nginx Proxy Manager!

三、Nginx Proxy Manager 的安装

1. 前提

2. 安装

ssh 连接上服务器后,新建一个名为 ngingx_proxy_manager 的文件夹用来存放文件和数据(最好建一个统一存放各种 docker 容器应用的目录,例如本人命名为 docker 文件夹)

1
2
cd ~/docker/
mkdir ngingx_proxy_manager && cd ngingx_proxy_manager

新建 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
39
40
# 编辑文件
vim docker-compose.yml

# 复制以下内容
version: "3"
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
# Add any other Stream port you want to expose
# - '21:21' # FTP
environment:
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'
volumes:
- ./data/mysql:/var/lib/mysql

启动服务

在确保云服务器防火墙已经放行 80、81 和 443 端口后即可访问服务器ip:81 进入 ngingx_proxy_manager 的 web 管理界面。默认密码为:

1
2
Email:    [email protected]
Password: changeme

输入密码,进入后台后会强制要求更改用户名和密码。

实战一、设置后台管理界面的反向代理

在前文中,已介绍了反向代理的作用,即常见的需求是输入ip:port 形式访问界面太不优雅,并且无法设置 https,因此需要用一个域名与此绑定。用户浏览器输入域名,服务器会根据此域名自动转发请求报文到对应绑定的ip:port 服务,然后将响应报文回复给用户。

这里,我们就用http://a.test.com来绑定我们的端口号为 81 的后台管理界面,实现浏览器输入http://a.test.com即可访问后台管理界面,并且设置 HTTPS。

1. 前提

  • 安装好 Nginx Proxy Manager
  • 拥有一个域名
  • http://a.test.com解析到安装 Nginx Proxy Manager 的服务器 ip 地址上

2. 反向代理操作

先用ip:81 访问后台管理界面,然后输入账号密码进入后台。

点击绿色图标的选项

设置反向代理

点击右边Add Proxy Host ,在弹出的界面Details选项中填写相应的字段。

Domain Names: 填写要反向代理的域名,这里就是http://a.test.com
Forward Hostname / IP: 填写的 ip 值见下文解释
Forward Port: 反向代理的端口,这里就是 81
Block Common Exploits: 开启后阻止一些常见漏洞
其余两个暂不知作用

Forward Hostname / IP 填写说明

如果搭建的服务和 nginx proxy manager 服务所在不是一个服务器,则填写能访问对应服务的 IP。
如果都在同一台服务器上,则填写在服务器中输入`ip addr show docker0` 命令获取得到的 ip。

查看宿主机 ip

这里不填127.0.0.1的原因是使用的是 docker 容器搭建 web 应用,docker 容器和宿主机即服务器不在同一个网络下,所以127.0.0.1并不能访问到宿主机,而ip addr show docker0获得的 ip 地址就是宿主机地址。

反代设置细节

接下来即可用a.test.com 访问后台管理界面,此时还只是 http 协议,没有 https。不过此时就可以把之前的 81 端口关闭了,输入a.test.com 访问的是服务器80端口,然后在转发给内部的 81 端口。

3. 申请泛域名 ssl 证书

就是申请一个*.test.com 证书,这样二级域名无论是什么都可以用这个证书,不需要一个二级域名申请一个。

在 Nginx Proxy Manager 管理后台,选择Access Lists->Add SSL Certificate->Let's Encrypt选项。

SSL 管理

Domain Names 中填写*.test.com test.com ,打开Use a DNS Challenge 选项,并选择个人域名的 DNS 解析服务商(本人就是腾讯的 DNSPod),最后填入服务商提供的 api key 或者 token。

DNSPod 的 id,key 获取教程

1. 进入DNSPod 控制台

2. 步骤直接看图

DNSPod 密钥管理

3. 随便取一个名字后,复制 ID 和 Token 到对应位置。

获取密钥

SSL 全部设置

4. 设置 HTTPS

进入反向代理设置界面,编辑上文创建的反代服务,选择 SSL 选项,下拉菜单中选择我们申请的证书,然后可以勾选Force SSL即强制 HTTPS。

选择相应的证书

同理以后新创建的反向代理可以直接在 SSL 选项中选择我们刚刚申请的泛域名证书。

实战二、搭建服务器监控并用 NPM 设置密码访问

下面再通过用 docker 搭建的小而美的服务器监控,来介绍 Nginx Proxy Manager 添加权限访问的操作。

ward 服务器状态监控界面

1. 小而美的服务器状态监控:ward

Ward is a simple and and minimalistic server monitoring tool. Ward supports adaptive design system. Also it supports dark theme. It shows only principal information and can be used, if you want to see nice looking dashboard instead looking on bunch of numbers and graphs. Ward works nice on all popular operating systems, because it uses OSHI.
Ward 是一个简单且最低限度的服务器监控工具。Ward 支持自适应设计系统。它还支持黑暗主题。如果您想看到漂亮的仪表板,而不是查看一堆数字和图形,那么它只显示主要信息,并且可以使用。Ward 在所有流行的操作系统上都运行良好,因为它使用OSHI

2. 前提

  • 安装好 Nginx Proxy Manager
  • 拥有一个域名
  • http://b.test.com解析到安装 Nginx Proxy Manager 的服务器 ip 地址上

3. 安装

ssh 连接上服务器后,新建一个名为 ward 的文件夹用来存放文件和数据(最好建一个统一存放各种 docker 容器应用的目录,例如本人命名为 docker 文件夹)

1
2
cd ~/docker/
mkdir ward && cd ward

新建 docker-compose.yml 文件并复制以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 编辑文件
vim docker-compose.yml

# 复制以下内容
version: '3.3'
services:
run:
restart: unless-stopped
container_name: ward
ports:
- '4000:4000' # 第一个4000表示外部可访问的端口,可修改
environment:
- WARD_PORT=4000 # 和上面后一个端口号相同
- WARD_THEME=dark # 可选light或者dark
- WARD_NAME=leons-server # 网站名称,可修改
privileged: true
image: antonyleons/ward

启动服务

4. 设置反向代理和 ssl

打开 Nginx Proxy Manager 的管理页面。 新建反向代理,Detail填写如上文。

detail 设置

SSL选项选择自己申请的泛域名证书。

ssl 设置

5. 权限设置

在 Nginx Proxy Manager 管理首页,选Access Lists页面->点击Add Access List

Detail页面

Name: 这个权限设置的名称
Satisfy Any: Access选项条件满足任意即可访问
Pass Auth to Host: 暂不知作用

detail 设置

**Authorization**

可设置多个账户密码

Access

可设置 ip 白、黑名单。

最后保存即可,然后在设置反向代理界面Details->Access List选择刚刚设置的权限选项。

权限设置

以后想设置权限的都可以选择该权限选项。

最后效果如下

权限登陆

参考链接

[1] Nginx Proxy Manager 官网

[2] Ward github

欢迎访问个人博客查看原文