使用docker搭建nginx proxy manager实现反向代理和SSL证书申请

前言

自从入坑NAS以来,(黑)群晖一直都是我文件存储管理的得力助手。但随着我的圈内吹水日益熟练学习和理解不断加深,黑裙已不能满足我的需求。如今,是时候告别(黑)群晖,往更专业的自建服务器方向发展了。其中关键的一步,便是找到能方便替换群晖反向代理服务的开源项目,而nginx proxy manager给了我一个很好的选择。

nginx proxy manager介绍

nginx proxy manager能让我们轻松地转发到在家里或其他地方运行的网站,包括免费的SSL,而不需要对Nginx或Letsencrypt了解太多。便捷直观的web页面管理和操作无疑大大简化了一般nginx反代服务的步骤。

docker安装nginx proxy manager

推荐使用docker-compose安装

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
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

# Uncomment the next line if you uncomment anything in the section
# environment:
# Uncomment this if you want to change the location of
# the SQLite DB file within the container
# DB_SQLITE_FILE: "/data/database.sqlite"

# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'

volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt

浏览器输入【docker主机ip:81】,成功进入web页面,初次登录使用邮箱:admin@example.com,密码:changeme。

登录进去后会让你设置管理员的用户名(Full Name),昵称(Nickname)和邮箱。

接下来设置密码,旧密码即预设密码changeme。

至此,nginx proxy manager初始化完成。

使用nginx proxy manager实现反向代理

登录进入主面版,点击Proxy Hosts转到反向代理设置界面。

点击Add Proxy Host,添加一个反向代理。

在Details页面,Domain Names填写你的域名,Scheme填写反代对象的协议(http/https),Forward Hostname/IP填写反代对象的地址,Forward Port填写反代对象的端口号。

Domain Names - 填写需要反代的域名
Scheme - 选择来源的协议
Forward Hostname / IP - 填写来源的主机名或IP
Forward Port - 填写来源的端口
Cache Assets - 是否启用缓存
Block Common Expoits - 阻止常见的漏洞
Websockets Support - 是支援 Websockets
Access List - 权限列表选择,可以给反代的网页设置账户密码,验证通过后才能正常打开

如果有https加密需求,转到SSL页面,将SSL Certificate选择为你申请的证书,建议勾选SSL Force(强制SSL)。

点击保存,在反向代理页面可以看到刚刚设置的反向代理。

测试相应网站,反代成功。

SSL证书申请

HTTP-01 验证方式

最简单常规的SSL证书申请方式,如果你的主机可以放行80端口(如在各大公有云处购买的主机),推荐使用这种方式。我这边没有虚拟主机,家用80端口也被封锁了,所以也没用过这种方式,姑且放在这里给大家参考_(:3」∠)_

转到反代编辑页面,在SSL页面选择Request a new SSL Certificate,建议勾选SSL Force(强制SSL),打开勾选I Agree to the Let’s Encrypt Terms of Service同意Let’s Encrypt相关条款,点击保存。

可以看到反代已自动申请SSL证书,可以通过https访问了。证书有效期3个月,到期会自动续期。

DNS-01 验证方式

因为国内ISP一般都封锁了80端口,所以HTTP-01验证方式大概率在家庭自建服务器的情况下不会成功。作为替代,我们可以选择使用DNS-01的验证方式来申请SSL证书。相较于HTTP-01,DNS-01可以申请支持通配符的域名证书,也算弥补了其操作繁琐的缺点。这里以DNSPOD和CloudFlare为例:

· DNSPOD

1. 申请api key

首先登录DNSPOD控制台,在右上角找到 API密钥 项。

转到 DNSPod Token 页面,点击创建密钥。

设置密钥名称

查看并保存ID和Token项,这里的内容只会显示一次,一定要保存好。

已经能在总览看到相关API已申请成功。

2. 配置nginx proxy manager并申请SSL证书

点击SSL Certificates,转到SSL Certificates页面;再点击右上角Add SSL Certificate,选择Let’s Encrypt。

如下图,Domain names填写自己的域名,Email Address for Let’s Encrypt填写自己的邮箱。

打开Use a DNS Challenge,DNS Provider选择DNSPod,将dns_dnspod_email中的email@example.com替换为DNSPod的邮箱,dns_dnspod_api_token中的id,key对应填入(即在上一步申请得到的id和token),注意不要删掉英文双引号,且id与token用英文逗号连接。

1
2
dns_dnspod_email = "email@example.com"
dns_dnspod_api_token = "id,key"

勾选I Agree to the Let’s Encrypt Terms of Service同意Let’s Encrypt相关条款,点击保存。

可以看到SSL证书已经申请完成,有效期3个月,到期会自动续期。

· CloudFlare

1. 获取api key

打开个人资料-API令牌,找到API 密钥,查看并复制Global API Key

2. 配置nginx proxy manager并申请SSL证书

同上,不过要将申请信息进行替换(初始的只有api token的形式申请会有问题)。something@hotmail.com替换为cloudflare的邮箱,0123456789abcdef0123456789abcdef01234567替换为上面得到的Global API Key。

1
2
3
# Cloudflare API token
dns_cloudflare_email = something@hotmail.com
dns_cloudflare_api_key = 0123456789abcdef0123456789abcdef01234567

附录

需要开启Websockets Support的应用/网站

Proxmox VE:不开启会导致novnc连接错误
jlesage/jdownloader-2:不开启会无法进入webui管理页面
truenas:不开启会导致webui无法登录
portainer/portainer-ce:不开启无法对容器使用console

参考资料

Nginx Proxy Manager
验证方式 - Let’s Encrypt
【Docker系列】一个反向代理神器——Nginx Proxy Manager
【Docker系列】一个反向代理神器——Nginx Proxy Manager
certbot dns插件
Cannot get Let’s Encrypt cert via cloudflare dns challange
使用Docker安裝Nginx-ProxyManager進行SSL反向代理


使用docker搭建nginx proxy manager实现反向代理和SSL证书申请
https://sunjx97.github.io/posts/233f7ebd/
作者
sunjx97
发布于
2022年1月1日
许可协议