一、介绍
Nginx 是一个高性能的 HTTP 和反向代理 Web 服务器,由俄罗斯 Rambler.ru 站点开发,源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。特点是占用内存小,并发能力强,能够支持高达 50000 个并发连接响应数。对于我个人的小站点来说,反向代理是我很需要,也是我选择它的原因。
Nginx Proxy Manager(NPM),顾名思义就是一个 Nginx 的代理管理器,它最大的特点是简单方便。即使是没有 Nginx 基础的小伙伴,也能轻松地用它来完成反向代理的操作,而且因为自带面板,操作极其简单,非常适合配合 docker 搭建的应用使用。Nginx Proxy Manager 后台还可以一键申请 SSL 证书,并且会自动续期,方便省心。
三、Nginx 安装
三、NPM 安装
说明:默认你的服务器已经安装了 Docker 和 Docker Compose,如果你没有安装,可以参考:docker 和 docker compose 搭建来进行安装。
点击下方链接进入 Nginx Proxy Manager(以下简称 NPM) 官网:https://nginxproxymanager.com/
我们可以直接选择 快速安装。
首先,我们创建一个文件夹来存放 NPM 的 docker-compose.yml 文件:
mkdir -p ~/data/docker_data/nginxproxymanager # 创建一个 npm 的文件夹
cd ~/data/docker_data/nginxproxymanager # 进入该文件夹
vi docker-compose.yml在英文状态的输入法下,按下 i,左下角出现 --INSERT-- 后,粘贴填入下面的内容:
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # 不建议修改端口
- '81:81' # 可以把冒号左边的 81 端口修改成你服务器上没有被占用的端口
- '443:443' # 不建议修改端口
volumes:
- ./data:/data # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 data 目录,用于存放数据,如果不存在的话,会自动创建
- ./letsencrypt:/etc/letsencrypt # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 letsencrypt 目录,用于存放证书,如果不存在的话,会自动创建注意:安装了 NPM 之后,就不需要再安装 Nginx 了,否则会端口冲突(不建议修改 NPM 的 80、443 端口)。
之后,同样在英文输入法下,按一下 esc,然后 :wq 保存退出。
启动 NPM:
docker-compose up -d # -d 表示后台运行不出意外,此时你使用 http://127.0.0.1:81 就可以访问 NPM 的网页端了。(注意把 127.0.0.1 替换成你实际服务器的 IP)
默认登陆的用户名:admin@example.com 密码:changeme
至此,我们已经完成了 Nginx Proxy Manager 的搭建。
四、NPM 使用(反代 Halo 博客)
这里用 反代 Halo 博客来演示 NPM 的使用,Halo 博客的端口是 8090。
登陆 NPM 网页端,初次登录会让我们修改用户名、密码等。
点击 Proxy Hosts,接着点击Add Proxy Host,弹出如下对话框:

因为样例的 NPM 和 Halo 博客搭建在同一台 VPS 上,所以 IP 填写的是 Docker 网桥的 IP 地址 172.17.0.1。
ip addr show docker03: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:06:ed:c8:10 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever当然,填写服务器的公网 ip 也是可以的。
五、一键申请 SSL 证书
域名绑定 SSL 证书,我们先来申请一张 SSL 证书,让我们的网站支持 https 访问。NPM 支持使用 Let's Encrypt 申请免费证书并自动续期。


至此,SSL证书申请完毕,并且网站也用上了https,证书会三个月自动续期。
多域名证书申请

可以提前到 SSL Certificates 页面申请证书,创建 Proxy Host 转发的时候直接选择 SSL 证书就可以了。
如图,这个证书对应了多个域名,其中还有一个是泛域名。泛域名和基本域名(根域名)都指向同一个服务器(ip),这是很常见的一种情况,一个证书能支持多个域名,可以减少申请多个的成本和利于我们后期的维护。右上角,Add SSL Certificate,如图:

如示例,申请的域名只要包含泛域名,验证一定要 DNS 验证。而 DNS 验证需要云服务商(这里是阿里云)的 SDK 支持,各大主流的云服务的 DNS 都支持。
原理是通过 SDK 修改域名解析然后转发到 Let's Encrypt 的站点,转发成功表示域名归属的确是我的,验证通过。
需要登录阿里云后台获取 Access_key、Secret,如何获取请看本站点的另一篇文章SSL 免费证书申请和自动续期 。多域名,一个域名要验证一次 DNS,容易超时失败,我也是保存3、4次后才成功的。
六、遇到的问题
1、访问网址报错 “cert_date_error”,怎么处理?
编辑 proxy hosts | Edit | Save,点开域名编辑保存一下就恢复了。原因未知。
参考链接:https://docs.halo.run/getting-started/install/other/nginxproxymanager