前言

对于现在网站来说, HTTPS 证书已经必不可少,虽然我们已经可以使用 Let’s Encrypt 获取免费证书,并且可以使用 acme.sh 快速申请、自动续期,但是每次添加新域名时仍然需要编辑 Nginx 配置文件,略有麻烦。

本文将介绍使用 Nginx Proxy Manager 设置 Nginx 反向代理,同时支持自动申请、续期 HTTPS 证书,即便在局域网内也可以使用 API 申请证书!

Nginx Proxy Manager 完全是图形界面,不懂代码也没有关系,非常适合个人使用!

主要特点:

  • 漂亮的用户界面
  • 轻松的反向代理设置
  • 轻松配置HTTPS,内置对 Let’s Encrypt 的支持
  • 提供 Docker 镜像 ,轻松部署
  • 支持多用户,提供简单的访问权限设置

与 Nginx 对比

特性 Nginx Proxy Manager Nginx(手动配置)
配置方式 Web 界面管理,操作简单 手动编辑配置文件,灵活度高
功能性 基础反向代理与 SSL 管理 支持高级功能与复杂场景
安全性 更新频率较低,依赖第三方维护 官方定期更新,更安全可靠
错误容忍 错误配置可能影响整体服务 站点配置独立,互不影响
性能 对高并发请求性能有限,适合轻量应用 原生性能,支持高并发场景
适用场景 适合小型项目、无技术背景的用户 适合大型项目与高级用户

前期准备

Nginx Proxy Manager 使用 Docker 部署,因此你的服务器上需要安装 Docker 与 Docker Compose 。

如果你还未安装,可以查看:在 Debian 中安装 Docker 以及 Docker Compose

使用 Docker 安装

创建一个工作目录,然后在其中创建 docker-compose.yml 文件,填入下面的内容

1
2
3
4
5
6
7
8
9
10
11
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
  • 80 是网站的 80 端口
  • 81 是 Nginx Proxy Manager 的管理端口
  • 443 是网站的 443 端口

Nginx Proxy Manager 的数据保存在 docker-compose.yml 同目录下 .data 文件夹,证书保存在 ./letsencrypt 文件夹。
也可以自己修改路径。

由于都需要使用 80 / 443 端口,所以如果宿主机有安装 Nginx ,请先禁用

使用 docker compose 运行 Nginx Proxy Manager

1
2
docker compose pull 
docker compose up -d

访问面板

启动后,访问 http://<server_ip>:81 即可打开管理面板。

nginx-proxy-manager-login-screen

默认管理员用户如下,登陆后会要求重新设置邮箱与密码

1
2
Email:    [email protected]
Password: changeme

启动后,请立即登陆面板,设置账户与密码

功能介绍

安装完成后,我们可以在顶部查看 Nginx Proxy Manager 的功能区

  • Hosts: 反代站点管理
  • Access Lists: 管理访问限制策略
  • SSL Certificates : SSL 证书管理
  • Users : 用户管理,Nginx Proxy Manager 提供简单的用户管理
  • Audit Log : 日志
  • Settings : 设置当请求的域名不在站点列表时的回应
image

申请证书

首先我们需要为域名申请证书,点击顶部的 SSL Certificates ,再点击 Add SSL Certificate
Nginx Proxy Manager get SSL

Nginx Proxy Manager 生成的证书会自动续期。

单域名证书

如果我们申请单域名证书,只需要

  • 将域名解析到服务器
  • Domain Names 填写需要申请证书的域名
  • 填写 Let’s Encrypt 需要使用的邮箱
  • 同意 Let’s Encrypt Terms of Service
  • 然后点击 Save 就可以了

Nginx Proxy Manager Add Single Cert

当然保存前可以先点击 Test Server Reachability 测试一下
Nginx Proxy Manager Test Reachability

申请泛域名证书

申请 ***.example.com** 泛域名证书需要修改 DNS 记录,需要通过 API 的方式申请,Nginx Proxy Manager 的支持列表非常的长,这里以 Cloudflare 为例。

首先我们需要获取 API 令牌,访问 https://dash.cloudflare.com/profile/api-tokens 点击 创建令牌,下一步中选择使用 编辑区域 DNS 对应的 使用模版

下一步种设置具体的令牌信息:

  • 令牌名称:改个用于区分的名字
  • 权限:保持默认 编辑
  • 区域资源: 特定区域,然后选择对应的域名
  • 客户端 IP 筛选:设置可以使用令牌的 IP,可以选择 在 ,然后填写您的服务器 IP
  • TTL: 令牌有效期,默认是永久有效Clodflare API Token Config

点击 继续以显示摘要 ,确认令牌的信息,如果没有错误,点击 创建令牌

创建后将显示 Token ,点击 Copy 复制。

只有这一次机会查看 Token 明文,无法再次查看。

然后在 Nginx Proxy Manager 中申请证书

  • Domain Names 填写 *.example.comexpample.com
  • 填写 Let’s Encrypt 需要使用的邮箱
  • 打开 Use a DNS Challenge
  • DNS Provide 选择 Cloudflare
  • 替换 Credential File Content 中的 token
  • 同意 Let’s Encrypt Terms of Service
  • 点击 Save 申请
image

成功后即会在列表中显示

添加反代站点

示例:反代管理页面

Nginx Proxy Manager 默认端口是报漏在公网中的,这很不安全,如果设置完成后取消这个端口映射,以后需要修改配置时又比较麻烦,我们可以设置一个二级域名来访问,首先解析一个二级域名例如 nginx.example.com 指向服务器。

Hosts > Proxy Hosts 中点击 Add Proxy Host 添加站点,管理页面的目标地址是 http://127.0.0.1:81

  • Domain Names: 填写你的二级域名
  • Scheme: 目标网站的协议,http
  • Forward Hostname/IP: 目标网站的域名或是 IP,这里填 127.0.0.1
  • Forward Port: 目标网站的端口 81
  • Cache Assets: 是否启用缓存
  • Block Common Exploits: 阻止常见漏洞
  • Websockets Support: 是否开启 Websockets 支持
  • Accessible: 设置访问限制
image

然后点击顶部 SSL 选择证书

  • Force SSL : 是否强制使用 https:// 访问
  • HTTP/2 Support : 是否开启 HTTP/2 支持
  • HSTS Enabled : 是否开启 HSTS ,开启后用户访问过一次之后将只会使用 https 访问
  • HSTS Subdomains : 子域名是否开启 HSTS
image
Advanced

我们可以在 Advanced 中添加自定义设置,比如

1
2
3
4
5
gzip on;
gzip_min_length 1k;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png font/ttf font/otf image/svg+xml;
gzip_vary on;

最中将被插入在站点配置中。

如果添加 Location 段则必须包含转发转发内容。

然后使用浏览器访问 https://nginx.example.com ,如果可以成功访问,我们就可以注释掉 docker 配置文件中的管理端口了!

1
2
3
ports:
- '80:80'
# - '81:81'

然后重新创建并运行 Nginx Proxy Manager 容器:

1
2
docker compose down
docker compose up -d

因为管理页面位于容器内部,所以可以使用 127.0.0.1

无法使用 127.0.0.1 反代宿主机以及宿主机上的其他 Docker 容器的服务,需要使用 ip addr show docker0 查看 docker 网络的 ip 地址,一般为 172.17.0.1, 并且其他 docker 容器的也需要设置监听到 172.17.0.1 而非 127.0.0.1 来关闭公网访问

查看配置

Nginx Proxy Manager 添加的站点的配置位于宿主机 data/nginx/proxy_host ,以数字递增的 conf 文件。

反代宿主机的静态站点

由于 Nginx Proxy Manager 需要使用 80 与 443 端口,Nginx 无法同时使用这两个端口在宿主机上设置静态站点,可以设置 Nginx 监听 172.17.0.1:8080 ,然后使用 Nginx Proxy Manager 添加指向 Nginx 的反向代理。

总结

如果你是个人用户,且主要使用 Nginx 的反向代理功能,Nginx Proxy Manager 是一个简化设置流程的理想选择,尤其在 SSL 证书配置方面更为便捷,更适合初学者,也可以在局域网内使用。

如果你需要直接使用 Nginx 提供网站服务,尤其是在生产环境中,推荐选择手动配置 Nginx,以充分发挥其性能和灵活性,可以使用 acme.sh 获取 SSL 证书,实现自动续期。