使用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 |
|
浏览器输入【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
- 填写来源的主机名或IPForward Port
- 填写来源的端口Cache Assets
- 是否启用缓存Block Common Expoits
- 阻止常见的漏洞Websockets Support
- 是支援 WebsocketsAccess 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 |
|
勾选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 |
|
附录
需要开启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反向代理