VPS指南 · 自托管
Nginx Proxy Manager 完整安装与配置指南 2026
如果您在VPS上运行多个服务——博客、Nextcloud、Git服务器或个人仪表板——您可能面临如何将多个子域名路由到不同内部端口的挑战。Nginx Proxy Manager(NPM)优雅地解决了这个问题:一个基于Docker的反向代理,拥有精美的Web界面和来自Let's Encrypt的免费自动SSL。
本指南涵盖从新VPS安装到高级功能(访问列表、HTTP身份验证和Docker网络配置)的完整内容。所有信息均来自NPM官方文档(nginxproxymanager.com,版本2.16.0,2026年10月)。
目录
什么是Nginx Proxy Manager?
Nginx Proxy Manager(NPM)是由Jamie Curnow(GitHub用户名:jc21)创建的开源Docker镜像。它提供了一个简洁的Web界面来管理Nginx反向代理,无需手动编写和维护Nginx配置文件。
反向代理位于后端服务前面,根据主机名将传入的HTTP/HTTPS请求路由到适当的服务。NPM通过管理仪表板的几次点击处理所有复杂工作——SSL终止、证书续期、请求头转发和WebSocket代理。
主要功能与优势
- 精美的管理界面 — 基于Tabler构建,直观易用,即使不了解Nginx也能上手
- Let's Encrypt免费SSL — 一键申请证书并自动续期
- 代理主机(Proxy Hosts) — 将域名转发到任意内部IP:端口
- 重定向主机(Redirection Hosts) — 域名之间的301/302重定向
- 流(Streams) — TCP/UDP端口转发,支持非HTTP协议
- 404主机(Dead Hosts) — 对不想提供服务的域名返回404
- 访问列表(Access Lists) — IP白名单和HTTP基本身份验证
- 多用户管理 — 带审计日志的细粒度权限管理
- 自定义SSL — 支持上传自己的证书
- 高级Nginx配置 — 高级用户可以注入原始Nginx指令
| 功能 | NPM | Traefik | Caddy |
|---|---|---|---|
| Web界面 | 完整功能 | 基础 | 无(仅配置文件) |
| 自动SSL | 是 | 是 | 是 |
| Docker原生 | 是 | 是 | 支持 |
| 最适合 | 自托管用户 | K8s/微服务 | 代码即配置 |
| 学习难度 | 低 | 中高 | 中 |
数据截至2026年10月 — 请在各项目官网核实最新功能
系统要求
安装NPM前,请确保您的VPS满足以下要求:
- 操作系统: Ubuntu 20.04+、Debian 11+、Rocky Linux 8+或类似系统
- 内存: 最低512 MB(运行多个服务时建议1 GB以上)
- 磁盘: 最低10 GB
- 开放端口: 80、81和443必须可从外部访问
- 域名: 已将DNS A记录指向VPS IP
- Docker + Docker Compose: 已安装(见下一步)
步骤1 — 在Ubuntu上安装Docker
通过SSH连接到您的VPS,运行以下命令(已在Ubuntu 22.04和24.04上测试):
# 更新软件包列表
sudo apt update && sudo apt upgrade -y
# 安装依赖
sudo apt install -y ca-certificates curl gnupg
# 添加Docker的GPG密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 添加Docker软件源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker Engine和Compose插件
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 将当前用户添加到docker组
sudo usermod -aG docker $USER
newgrp docker
验证安装:
docker --version
docker compose version
步骤2 — 使用Docker Compose安装Nginx Proxy Manager
创建NPM目录并编写docker-compose.yml文件:
mkdir ~/nginx-proxy-manager && cd ~/nginx-proxy-manager
nano docker-compose.yml
粘贴以下配置:
services:
app:
image: 'docker.io/jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # HTTP流量
- '81:81' # 管理界面
- '443:443' # HTTPS流量
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
保存文件后启动NPM:
docker compose up -d
验证容器正在运行:
docker compose ps
应该看到容器状态为Up,并且端口80、81和443已绑定。
sudo ufw allow 80,81,443/tcp && sudo ufw reload
步骤3 — 首次登录与初始设置
打开浏览器,访问http://<您的VPS-IP>:81(例如http://123.45.67.89:81)
使用默认凭据登录:
- 邮箱:
[email protected] - 密码:
changeme
NPM将立即提示您更改邮箱地址和密码。请立即执行——切勿在生产环境中保留默认凭据。
仪表板概览
登录后,主仪表板显示以下计数器:
- 代理主机(Proxy Hosts) — 已配置的反向代理
- 重定向主机(Redirection Hosts) — 域名重定向
- 流(Streams) — TCP/UDP转发规则
- 死主机(Dead Hosts) — 返回404的域名
步骤4 — 创建第一个代理主机
假设您有一个运行在localhost:3000的服务(例如Gitea、Vaultwarden或Node.js应用),想通过app.example.com访问它。
- 进入Hosts → Proxy Hosts
- 点击"Add Proxy Host"
- 填写Details选项卡:
- Domain Names:
app.example.com - Scheme:
http - Forward Hostname/IP:
localhost(若使用Docker网络则填容器名) - Forward Port:
3000 - 启用"Block Common Exploits"
- 若应用使用WebSocket,启用"Websockets Support"
- Domain Names:
- 点击"Save"
步骤5 — 配置Let's Encrypt免费SSL证书
为代理主机添加HTTPS:
- 编辑代理主机 → 点击"SSL"选项卡
- 在SSL Certificate下,选择"Request a new SSL Certificate"
- 启用"Force SSL" — 自动将HTTP流量重定向到HTTPS
- 启用"HTTP/2 Support"
- 输入邮箱地址用于Let's Encrypt通知
- 同意Let's Encrypt服务条款
- 点击"Save"
NPM将通过HTTP-01验证联系Let's Encrypt,获取有效期90天的证书,并在到期前自动续期。
设置重定向主机
使用重定向主机将一个域名转发到另一个——例如www.example.com → example.com:
- 进入Hosts → Redirection Hosts
- 点击"Add Redirection Host"
- Domain Names:
www.example.com - Forward Domain Name:
example.com - HTTP Code:301(永久)或302(临时)
- 按需启用SSL,然后"Save"
访问列表与HTTP基本认证
访问列表通过IP地址或用户名/密码限制对代理主机的访问。
创建访问列表
- 进入Access Lists → Add Access List
- 输入描述性名称(如"仅管理员")
- 在Authorization选项卡中:添加HTTP基本认证的用户名/密码对
- 在Access选项卡中:添加允许或拒绝的IP地址
- 保存,然后通过代理主机的Details选项卡分配此访问列表
NPM适合谁?
NPM是自托管爱好者和家庭实验室用户的理想选择,无需编写任何Nginx配置文件,即可在单台VPS上运行多个服务,实现干净的域名路由和自动SSL。
Docker网络最佳实践
当多个服务在Docker容器中运行时,使用共享网络可以让NPM通过容器名而非localhost与它们通信。
创建共享网络:
docker network create proxy_net
更新NPM的docker-compose.yml:
services:
app:
image: 'docker.io/jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- proxy_net
networks:
proxy_net:
external: true
对于每个后端服务,在其docker-compose.yml中加入相同网络,然后在NPM代理主机配置中使用容器的服务名作为Forward Hostname。
常见问题排查
SSL证书申请失败
- 验证域名解析到您的VPS IP:
dig +short app.example.com - 确认端口80可从互联网访问(Let's Encrypt的HTTP-01验证需要)
- 查看NPM日志:
docker compose logs app | grep -i error
502 Bad Gateway错误
- 确认后端服务正在运行:
curl http://localhost:3000 - 若使用Docker网络,验证两个容器在同一网络中:
docker network inspect proxy_net - 检查转发端口号是否正确
更新NPM至最新版本
docker compose pull
docker compose up -d
常见问题解答
Nginx Proxy Manager是免费的吗?
是的。NPM是MIT许可证下的开源软件,个人和商业使用完全免费。Docker镜像可从Docker Hub下载,镜像名为jc21/nginx-proxy-manager。
NPM能申请通配符SSL证书吗?
可以,但需要使用DNS Challenge而非默认的HTTP-01验证。您需要在SSL选项卡中选择DNS提供商(Cloudflare、Route53等)并提供API凭据。
NPM使用什么数据库?
默认情况下,NPM使用存储在./data卷中的内置SQLite数据库。对于较大规模的部署,也支持MySQL/MariaDB。对于大多数自托管用例,SQLite已经足够。
NPM支持armv7(树莓派)吗?
NPM 2.14+版本已放弃armv7支持(因为Node.js放弃了armhf支持)。如果您使用旧版树莓派,请在docker-compose.yml中明确指定镜像标签2.13.7。
应该将81端口(管理界面)暴露到互联网吗?
不应该。最佳实践是关闭外部对81端口的访问(sudo ufw delete allow 81/tcp),通过SSH隧道或VPN访问管理界面,以获得最高安全性。
总结
Nginx Proxy Manager(v2.16.0,2026年10月)是自托管用户的最佳反向代理解决方案,无需手动编写Nginx配置即可实现干净的域名路由和自动SSL。精美的Web界面、零配置的Let's Encrypt集成以及活跃的社区,使其成为从单台VPS暴露多个服务的最简单途径。
其主要局限性在于不适合代码即配置或Kubernetes环境——在这些场景中,Traefik或Nginx Ingress Controller是更好的选择。但对于个人服务器、家庭实验室和小型团队基础设施,NPM很难被超越。