【Docker项目】之–Nginx Proxy Manager可视化Nginx反向代理工具
#教程 #代理 #工具 #Docker #Docker-compose #Nginx #域名 #Linux #Ubuntu
Nginx作为一个功能十分强大的反向代理工具,安装和配置较为复杂,尤其是对多个网站的反代、分流使用更加不友好。Nginx Proxy Manager
一个可视化的Nginx服务工具。通过网页端完成反向代理的设置和SSL证书的部署,能够简化大部分的代理操作。
官网:https://nginxproxymanager.com
1. 安装准备
系统:ubuntu 20.4
工具:docker和docker-compose
2. 搭建
2.1. 创建数据存放位置
mkdir -p /data/docker_data/npm ## 创建文件夹
cd /data/docker_data/npm ## 进入文件夹
vim docker-compose.yml ## 创建docker-compose
2.2. 编辑docker-compose.yml
version: "3"
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: npm_app
restart: unless-stopped
ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '8888:81' # 管理端口,修改为自己的
# 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/docker_data/npm/data:/data
- /data/docker_data/npm/letsencrypt:/etc/letsencrypt
networks:
- mynet
depends_on:
- db
logging:
driver: "json-file" # 限制log文件
options:
max-size: "100M" # 限制log文件大小
db:
image: 'jc21/mariadb-aria:latest'
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'npm' # 数据库ROOT密码
MYSQL_DATABASE: 'npm' # 数据库名称
MYSQL_USER: 'npm' # 数据库用户名
MYSQL_PASSWORD: 'npm' # 数据库密码
volumes:
- /data/docker_data/npm/data/mysql:/var/lib/mysql
networks:
- mynet
networks: # 连接外部网络,方便内部代理
mynet:
external: true
2.3. 新建docker网络
已经创建的略过。
# 创建一个公用的docker网络
docker network create mynet
# 查看docker网络情况
docker network ls
# 显示如下信息
NETWORK ID NAME DRIVER SCOPE
0134ad30defd bridge bridge local
29474e75ede0 host host local
33bc01a2e0d0 mynet bridge local # 刚刚新建的网络
2.4. 拉去镜像开始安装
docker-compose up -d
3. 使用及展示
在浏览器中输入 http://IP:8888
,第一次使用默认用户和密码,然后创建管理用户和密码。
Email: admin@example.com
Password: changeme
添加代理
添加代理前需要先把域名解析到服务器,测试成功后再继续(DNS服务商变更比较慢)。防止后面DNS解析不成功,申请证书失败。
Details:
- Domain Names:反向代理的域名,输入域名后按回车确认。
- Forward Hostname / IP:填写代理的ip。
- Forward Port:反向代理的端口,这里就是81。
- Cache Assets:启用缓存。
- Block Common Exploits:阻止一些常见漏洞。
- Websockets Spport:支持Websockets。
- Access List:配合多账户使用,选择权限范围。
按照下图填写内容
SSL:
- SSL Certificate:选择证书,
Request a new SSL Certificate
使用当前域名申请新证书。 - Force SSL:强制使用SSL。
- HTTP/2 Support:支持HTTP/2协议标准。
- HSTS Enabled:使用HSTS策略机制,有助于保护网站免受中间人攻击。
- HSTS Subdomains:子域名适用
- Use a DNS Challenge:使用域名解析商方案。
- Email Address for Let’s Encrypt:申请
Let's Encrypt
证书使用的电子邮箱。 - I Agree to the Let’s Encrypt Terms of Service:同意
Let's Encrypt
服务。
使用下面的方案为当前域名申请一个Let's Encrypt
的免费证书。
点击Save保存设置,等一下就可以看到代理成功。点击域名访问试试。
已经启用了SSL加密。
注意:有时Force SSL
设置可能会显示未开启,需要重新开启一下。还有如果使用百度的seo抓取网站时失败需要关闭该选项🤷♂️。
4. 其他
4.1. 通过容器名称代理服务
使用Nginx反向代理的目的就是为了安全考虑,尽量暴漏最少的端口。同一台服务器上的docker服务,定义container_name
,container_name
就可以视作该服务的Hostname
,那么可以container_name
+内部端口
的方式代理服务,不用再进行端口映射。一定要注意,前提条件是,该容器与Nginx Proxy Manager
,处于同一个docker网络。设置方法如下:
设置完毕后,就可以通过服务器提供商的防火墙规则关闭8888
端口了。
4.2. 通用域名、泛域名证书的申请
在每次使用域名时,都会申请一次证书比较麻烦。NPM也支持通用域名/泛域名证书的申请,这样同一个顶级域名下的所有域名都可以使用同一个证书,下面以Cloudflare
为例。
注意:一些域名是无法成功申请到Cloudflare
令牌的。
现在Cloudflare的API已经针对.cf,.ga,.gq,.ml和.tk这几个顶级域名收取费用,更新证书的时候会提示“You cannot use this API for domains with a .cf, .ga, .gq, .ml, or .tk TLD (top-level domain). To configure the DNS settings for this domain, use the Cloudflare Dashboard.”,暂时可通过申请其他付费域名来避免该问题。
4.2.1. 获取API令牌
登录:Cloudflare | Web Performance & Security
进入域名管理,右侧找到获取你的API令牌
->创建令牌
->编辑区域DNS
->使用模板
令牌名称
->特定区域 或 所有区域
->域名
->继续以显示摘要
->创建令牌
->令牌API
(只显示一次,一定要记录好)。
4.2.2. 申请证书
获取API令牌后,打开Nginx Proxy Manager
依次进入,SSL Certificates
->Add SSL Certificate
->Let's Encrypt
->填写Domain Names
->填写Email Address for Let's Encrypt邮箱
->Use a DNS Challenge
->DNS Provider选择Cloudflare
->填写api_token
->I Agree to the Let's Encrypt Terms of Service
->save
# Domain Names格式
*.yourDomain.com yourDomain.com
申请成功。
以后再使用时,选择该通用证书就可了。
4.3.中文版
DockerHub:https://registry.hub.docker.com/r/chishin/nginx-proxy-manager-zh
将镜像替换为image: 'chishin/nginx-proxy-manager-zh:latest'
评论区