使用docker搭建nginx proxy manager实现反向代理和SSL证书申请
nginx proxy manager介绍
nginx proxy manager能让我们轻松地转发到在家里或其他地方运行的网站,包括免费的SSL,而不需要对Nginx或Letsencrypt了解太多。便捷直观的web页面管理和操作无疑大大简化了一般nginx反代服务的步骤。
docker安装nginx proxy manager
推荐使用docker-compose安装
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页面,初次登录使用邮箱:[email protected],密码: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填写反代对象的端口号。

如果有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可以申请[支持通配符的域名证书](https://letsencrypt.org/zh-cn/docs/challenge-types/),也算弥补了其操作繁琐的缺点。这里以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中的DNSPOD-API-REQUIRES-A-VALID-EMAIL替换为DNSPod的邮箱,dns_dnspod_api_token中的DNSPOD-API-TOKEN替换为【id,token】的形式(即在上一步申请得到的id和token),注意不要删掉英文双引号,且id与token用英文逗号连接。
勾选I Agree to the Let’s Encrypt Terms of Service同意Let’s Encrypt相关条款,点击保存。

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

参考资料
Nginx Proxy Manager
验证方式 – Let’s Encrypt
【Docker系列】一个反向代理神器——Nginx Proxy Manager
【Docker系列】一个反向代理神器——Nginx Proxy Manager
certbot dns插件