作为一名程序员,我们经常需要与各种 Web 服务和应用打交道。无论是本地开发环境的多个项目,还是服务器上托管的多个网站或服务,如何高效、便捷地管理这些服务的访问入口,尤其是如何处理域名、SSL 证书等问题,一直是一个不大不小却又实实在在的痛点。
传统的做法是直接手写 Nginx 配置文件。虽然灵活强大,但对于多个项目,配置文件的维护就显得异常繁琐和易错。每次新增一个服务,都需要小心翼翼地修改配置,然后 nginx -t 测试,最后 reload。如果再加上 SSL 证书的申请和续期,这个过程的枯燥程度相信大家都深有体会。
而今天的主角——Nginx Proxy Manager,正是为了解决这一问题而生。
Nginx Proxy Manager 是什么?
简单来说,Nginx Proxy Manager 是一个带有简洁易用的 Web 界面的 Nginx 服务管理工具。 它让你能够通过图形化界面,轻松地完成反向代理、SSL 证书申请与自动续期(通过 Let's Encrypt)、访问控制等一系列复杂操作,而无需直接编写任何 Nginx 配置文件。
它的核心优势在于:
- 简单直观:提供了一个美观且易于操作的 Web UI,几分钟内就能上手。
- 免费 SSL:集成了 Let's Encrypt,可以一键为你的域名申请和配置免费的 SSL 证书,并实现自动续期。
- 功能强大:支持反向代理、重定向、自定义 Nginx 配置、访问列表控制等多种实用功能。
- Docker 化部署:官方推荐使用 Docker Compose 进行部署,整个过程快速、标准且与宿主环境隔离。
实战部署
废话不多说,我们直接上手部署。官方最推荐的方式是使用 Docker Compose,这也是我们程序员最喜欢的方式。
1. 准备工作
首先,你需要在你的服务器上安装好 Docker 和 Docker Compose。这个过程这里就不再赘述了,相信这对于各位来说都是基本操作。
2. 创建 Docker Compose 文件
在一个你喜欢的目录下,创建一个 docker-compose.yml 文件,然后将以下内容粘贴进去:
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
# 这几个是必须的端口
- '80:80' # HTTP 端口
- '443:443' # HTTPS 端口
- '81:81' # 管理界面端口
# 如果你需要使用 MySQL/MariaDB 数据库,请取消下面的注释
#depends_on:
# - db
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
# 如果你需要使用 MySQL/MariaDB 数据库,请取消下面的注释
#db:
# image: 'jc21/mariadb-aria:latest'
# restart: unless-stopped
# environment:
# MYSQL_ROOT_PASSWORD: 'npm-db-password' # 请务必修改为你的强密码
# MYSQL_DATABASE: 'npm'
# MYSQL_USER: 'npm'
# MYSQL_PASSWORD: 'npm-db-password' # 请务必修改为你的强密码
# volumes:
# - ./data/mysql:/var/lib/mysql
代码解读:
- 我们定义了一个名为 app 的服务,使用了官方镜像 jc21/nginx-proxy-manager:latest。
- 映射了三个关键端口:80 (HTTP), 443 (HTTPS) 和 81 (管理后台)。这意味着你的服务器的 80 和 443 端口需要是空闲的。
- 通过 volumes 将容器内的 /data 和 /etc/letsencrypt 目录挂载到宿主机的当前目录下的 data 和 letsencrypt 文件夹中,以实现数据的持久化。
- 默认情况下,Nginx Proxy Manager 使用 SQLite 数据库。对于大多数个人或小型项目来说已经足够。如果你有更高性能的需求,可以取消 db 服务的注释,并使用 MariaDB。
3. 启动服务
在 docker-compose.yml 文件所在的目录下,执行以下命令:
docker-compose up -d
稍等片刻,Nginx Proxy Manager 就会在后台成功启动。
初始化配置
现在,通过浏览器访问 http://<你的服务器IP>:81,你将看到 Nginx Proxy Manager 的登录界面。
默认的管理员账号和密码是:
- Email: admin@example.com
- Password: changeme
首次登录后,系统会强制要求你修改默认的用户名、邮箱和密码,请务必修改为一个安全的组合。
如何使用?——一个简单的例子
这里我们使用nginx-proxy-maneger本身来举个例子,该应用在服务器81端口运行,我们希望通过 npm.puber.top 这个域名来访问它,而不是通过ip加端口的方式,并且自动配置 HTTPS。首先我们在自己的域名控制台添加一条主机记录(npm.puber.top)。
然后进入到nginx-proxy-manager进行如下配置:
- 添加代理主机 (Proxy Host):
- 在管理界面,点击 "Hosts" -> "Proxy Hosts"。
- 点击 "Add Proxy Host"。
- 在 "Domain Names" 中输入 npm.puber.top。
- "Scheme" 保持 http,"Forward Hostname / IP" 输入你的服务器内网 IP 或者 localhost,"Forward Port" 输入 81。
- 勾选 "Block Common Exploits" 来增加一点安全性。
- 配置 SSL:
- 切换到 "SSL" 标签页。
- 在 "SSL Certificate" 下拉菜单中选择 "Request a new SSL Certificate"。
- 勾选 "Force SSL" 和 "HTTP/2 Support"。
- 最后,勾选 "I Agree to the Let's Encrypt Terms of Service"。
- 保存!
就是这么简单!Nginx Proxy Manager 会自动与 Let's Encrypt 通信,为你的域名申请证书,并配置好所有必要的 Nginx 规则。稍等片刻,你就可以通过域名来访问你的应用了。
结语
对于需要管理多个 Web 服务的开发者来说,Nginx Proxy Manager 无疑是一款能够极大简化工作流程、提升幸福感的利器。它将复杂的 Nginx 配置和 SSL 证书管理抽象成了简单的 Web 界面操作,让我们能更专注于核心的业务开发。如果你还在为手写 Nginx 配置而烦恼,强烈建议你花十分钟时间尝试一下它。
参考资料:
官方GitHub:https://github.com/NginxProxyManager/nginx-proxy-manager
评论区