Nginx Proxy Manager 使用指南:反向代理与SSL证书配置

Nginx Proxy Manager 使用指南:反向代理与SSL证书配置

Nginx Proxy Manager (NPM) 是一个基于 Nginx 的、具有图形化界面的反向代理服务器管理工具。它极大地简化了 Nginx 的配置过程,让用户无需编写复杂的 Nginx 配置文件,即可轻松实现反向代理、SSL 证书配置、负载均衡等功能。本文将详细介绍 NPM 的安装、配置和使用,帮助您快速上手。

一、Nginx Proxy Manager 的优势

相比于直接配置 Nginx,NPM 具有以下显著优势:

  • 图形化界面: 提供直观的 Web UI,所有操作都可通过点击和填写表单完成,无需记忆复杂的 Nginx 指令。
  • 简化配置: 自动生成 Nginx 配置文件,用户只需关注业务逻辑,无需深入了解 Nginx 细节。
  • 自动化 SSL: 集成 Let's Encrypt,可自动申请、续期和配置 SSL 证书,实现 HTTPS 访问。
  • 易于管理: 集中管理多个反向代理规则和 SSL 证书,方便查看和修改。
  • 访问控制: 支持基于用户名/密码的访问控制,保护您的服务。
  • 高级功能: 支持自定义 Nginx 配置,高级用户可以灵活的扩展功能。

二、安装 Nginx Proxy Manager

NPM 官方推荐使用 Docker 进行安装,这种方式最为简单快捷。

1. 前提条件

  • 已安装 Docker 和 Docker Compose。
  • 服务器具有公网 IP 地址(用于申请 SSL 证书)。
  • 已解析域名到服务器 IP 地址。

2. 创建 docker-compose.yml 文件

在服务器上创建一个目录,例如 nginx-proxy-manager,然后在该目录下创建 docker-compose.yml 文件,内容如下:

yaml
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt

配置说明:

  • image: 使用的 Docker 镜像,jc21/nginx-proxy-manager:latest 表示最新版本。
  • restart: 设置容器重启策略,unless-stopped 表示除非手动停止,否则容器总是自动重启。
  • ports: 端口映射,将容器内的 80(HTTP)、81(管理界面)和 443(HTTPS)端口映射到宿主机。
  • volumes: 数据卷映射,将容器内的 /data/etc/letsencrypt 目录映射到宿主机的 ./data./letsencrypt 目录,用于持久化数据。

3. 启动容器

docker-compose.yml 文件所在目录下执行以下命令:

bash
docker-compose up -d

该命令会下载 NPM 镜像并启动容器。-d 参数表示在后台运行。

4. 访问管理界面

容器启动后,可以通过浏览器访问 http://your_server_ip:81http://your_domain:81 进入 NPM 的管理界面。

首次访问时,需要设置管理员邮箱和密码。默认管理员信息如下:

  • Email: [email protected]
  • Password: changeme
    强烈建议登录后立即修改默认密码!

三、配置反向代理

NPM 的核心功能是反向代理。通过配置反向代理,可以将不同的域名或路径映射到不同的后端服务。

1. 添加 Proxy Host

登录 NPM 管理界面后,点击左侧导航栏的 "Hosts" -> "Proxy Hosts",然后点击 "Add Proxy Host" 按钮。

2. 填写 General 选项卡

  • Domain Names: 填写要代理的域名,可以填写多个,用逗号分隔。例如 example.com, www.example.com
  • Scheme: 选择协议,一般为 httphttps。如果后端服务使用 HTTPS,则选择 https
  • Forward Hostname / IP: 填写后端服务的 IP 地址或域名。
  • Forward Port: 填写后端服务的端口号。
  • Cache Assets: 启用静态资源缓存。
  • Block Exploits: 阻止常见漏洞攻击。
  • Websockets Support: 启用 WebSocket 支持。

3. 配置 SSL 选项卡(可选)

如果需要为域名配置 HTTPS,则需要配置 SSL 选项卡。

  • SSL Certificate: 选择 SSL 证书的获取方式。

    • None: 不使用 SSL。
    • Request a new SSL Certificate with Let's Encrypt: 使用 Let's Encrypt 自动申请和配置 SSL 证书(推荐)。
    • Upload Custom Certificate: 上传自定义 SSL 证书。
    • Use a pre-existing Certificate: 使用已有的证书。
  • Force SSL: 强制 HTTPS 访问,将 HTTP 请求重定向到 HTTPS。

  • HTTP/2 Support: 启用 HTTP/2 支持。

如果选择 "Request a new SSL Certificate with Let's Encrypt",则需要填写以下信息:

  • Email Address for Let's Encrypt:用于接收证书到期通知的邮箱地址。
  • 勾选 "I Agree to the Let's Encrypt Terms of Service"。

4. 配置 Advanced 选项卡(可选)

Advanced 选项卡允许您添加自定义 Nginx 配置。例如,可以添加自定义 header、修改缓存策略等。

示例:添加自定义 header

nginx
add_header X-Custom-Header "My Custom Value";

5. 保存配置

填写完所有配置后,点击 "Save" 按钮保存配置。NPM 会自动生成 Nginx 配置文件并重启 Nginx 服务。

6. 验证配置

配置完成后,可以通过浏览器访问您配置的域名,验证反向代理是否生效。如果一切正常,您应该能够看到后端服务的内容。

四、SSL 证书管理

NPM 集成了 Let's Encrypt,可以自动申请、续期和配置 SSL 证书。

1. 自动申请 SSL 证书

在添加 Proxy Host 时,选择 "Request a new SSL Certificate with Let's Encrypt" 选项,NPM 会自动为您的域名申请 SSL 证书。申请过程需要几分钟时间。

2. 证书续期

Let's Encrypt 证书的有效期为 90 天。NPM 会自动在证书到期前进行续期,无需手动干预。

3. 查看证书信息

在 NPM 管理界面中,点击左侧导航栏的 "SSL Certificates",可以查看已申请的 SSL 证书的详细信息,包括域名、到期时间等。

4. 手动上传证书

如果您已经拥有 SSL 证书,可以在 "SSL Certificates" 页面点击 "Add SSL Certificate" -> "Custom",然后上传您的证书文件和私钥文件。

五、访问控制

NPM 支持基于用户名/密码的访问控制,可以保护您的服务不被未经授权的访问。

1. 添加 Access List

在 NPM 管理界面中,点击左侧导航栏的 "Access Lists",然后点击 "Add Access List" 按钮。

2. 填写 Access List 信息

  • Name: Access List 的名称。
  • Satisfy Any: 设置访问控制策略。
    • Yes: 满足任意一个条件即可访问。
    • No: 必须满足所有条件才能访问。

3. 添加授权用户

在 "Authorization" 选项卡中,点击 "Add User" 按钮,填写用户名和密码。

4. 配置 IP 白名单/黑名单(可选)

在 "Access" 选项卡中,可以配置 IP 白名单或黑名单。

  • Allowed IPs: 允许访问的 IP 地址,用逗号分隔。
  • Denied IPs: 禁止访问的 IP 地址,用逗号分隔。

5. 将 Access List 应用到 Proxy Host

在 Proxy Host 的 "Access List" 选项卡中,选择您创建的 Access List。

六、高级用法

1. 自定义 Nginx 配置

NPM 允许用户在 "Advanced" 选项卡中添加自定义 Nginx 配置,这为高级用户提供了更大的灵活性。您可以在此处添加任何有效的 Nginx 指令,以满足特定的需求。

2. 负载均衡

NPM 支持简单的负载均衡。要实现负载均衡,只需在 "Forward Hostname / IP" 字段中填写多个后端服务器的 IP 地址或域名,用逗号分隔。NPM 会自动将请求分发到不同的后端服务器。

3. 使用 Docker 网络

如果您使用 Docker 部署后端服务,可以将后端服务和 NPM 放在同一个 Docker 网络中,然后使用容器名称作为 "Forward Hostname / IP"。这样可以避免暴露后端服务的端口到宿主机。

4. 监控和日志

NPM 本身不提供详细的监控和日志功能。您可以使用第三方工具来监控 Nginx 的性能和访问日志。

  • Nginx Amplify: Nginx 官方提供的监控工具。
  • Prometheus + Grafana: 开源的监控和可视化解决方案。
  • ELK Stack (Elasticsearch, Logstash, Kibana): 开源的日志分析平台。

5. 备份和恢复

NPM的所有配置和证书都存储在您配置的数据卷 (./data./letsencrypt)中。 定期备份这些目录,以防止数据丢失。
如果需要恢复,只需将备份的数据复制到新实例的相应目录中即可。

七、常见问题及解决

  1. SSL 证书申请失败:

    • 确保域名已正确解析到服务器 IP 地址。
    • 确保服务器的 80 端口和 443 端口未被防火墙阻止。
    • 检查 Let's Encrypt 的日志,查看是否有错误信息。
  2. 反向代理不生效:

    • 检查 "Forward Hostname / IP" 和 "Forward Port" 是否填写正确。
    • 检查后端服务是否正常运行。
    • 检查 Nginx 的错误日志,查看是否有错误信息。
  3. 忘记管理员密码:
    如果忘记密码,可以通过以下步骤重置:

    1. 进入运行NPM的docker容器: docker exec -it <container_id> bash
    2. 进入sqlite数据库: sqlite3 /data/database.sqlite
    3. 更新管理员密码 (将new_password替换成你的新密码):
      sql
      UPDATE user SET password = '$2y$10$XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' WHERE id = 1;

      注意: $2y$10$XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX是bcrypt加密后的密码hash值。你需要先生成你新密码的bcrypt hash值。可以使用在线工具或编程语言(如Python的bcrypt库)生成。
  4. 端口冲突
    如果服务器上已经运行了其他服务占用了80或443端口,NPM将无法启动。你需要停止这些服务或更改NPM的端口映射。

八、总结

Nginx Proxy Manager 是一款强大且易于使用的反向代理管理工具。它极大地简化了 Nginx 的配置和管理,让用户能够轻松实现反向代理、SSL 证书配置、负载均衡等功能。通过本文的详细介绍,相信您已经掌握了 NPM 的基本使用方法。如果您有更高级的需求,可以进一步探索 NPM 的高级功能和自定义配置。

希望这篇文章对您有所帮助!

THE END