【玩转docker】反向代理神器:Nginx Proxy Manager
一、什么是反向代理?
众所周知,浏览器访问网页需要
域名:端口号
或者
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文件夹)
cd ~/docker/
mkdir ngingx_proxy_manager && cd ngingx_proxy_manager
新建docker-compose.yml文件并复制以下内容
# 编辑文件
vim docker-compose.yml
# 复制以下内容
version: "3"
services:
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:
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
启动服务
docker-compose up -d
在确保云服务器防火墙已经放行80、81和443端口后即可访问服务器
ip:81
进入ngingx_proxy_manager的web管理界面。默认密码为:
Email: admin@example.com
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。
这里不填
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
选项。
Domain Names中填写
*.test.com
test.com
,打开
Use a DNS Challenge
选项,并选择个人域名的DNS解析服务商(本人就是腾讯的DNSPod),最后填入服务商提供的api key或者token。
DNSPod的id,key获取教程
1. 进入 DNSPod控制台
2. 步骤直接看图
3. 随便取一个名字后,复制ID和Token到对应位置。
4. 设置HTTPS
进入反向代理设置界面,编辑上文创建的反代服务,选择SSL选项,下拉菜单中选择我们申请的证书,然后可以勾选
Force SSL
即强制HTTPS。
同理以后新创建的反向代理可以直接在SSL选项中选择我们刚刚申请的泛域名证书。
实战二、搭建服务器监控并用NPM设置密码访问
下面再通过用docker搭建的小而美的服务器监控,来介绍Nginx Proxy Manager添加权限访问的操作。
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文件夹)
cd ~/docker/
mkdir ward && cd ward
新建docker-compose.yml文件并复制以下内容
# 编辑文件
vim docker-compose.yml
# 复制以下内容
version: '3.3'
services:
restart: unless-stopped
container_name: ward
ports:
- '4000:4000' # 第一个4000表示外部可访问的端口,可修改