如何在 Docker 容器中运行 Nginx 代理管理器
我们都知道 Nginx 代理主机、重定向和 SSL 的手动管理可能很乏味。 Nginx 代理管理器项目最初是 Jamie Curnow 的个人项目,旨在提供一种更简单的方法来创建反向代理主机并使用 Nginx 终止 SSL。该项目具有用于高级代理使用的可选高级选项。以下是 Nginx 代理管理器的一些优秀功能。
- 支持用户管理、权限授予和审核日志记录
- 它在新窗口中附带了基于 Tableropen 的美观且安全的管理界面
- 支持使用 Let’s Encrypt 的免费 SSL 或提供您自己的自定义 SSL 证书的选项
- 无需掌握 Nginx 概念即可创建转发域、重定向、流和 404 主机
- 对于超级用户,可以使用高级 Nginx 配置
- 支持特定主机的访问列表和基本 HTTP 身份验证
- 易于部署:它构建为 Docker 映像,以便快速安装
在接下来的部分中,我们将执行安装、配置并演示 Docker 容器中 Nginx 代理管理器的基本用法。您不需要深厚的 Linux 技能来阅读本文。
安装 Docker 引擎
Nginx Proxy Manager 被打包为容器镜像,可以在 Docker、Podman 或任何类似的容器引擎上运行。为简单起见,我们在本文中使用 Docker 引擎。请按照以下文章执行Docker容器引擎的安装。
- 如何在 Linux 系统上安装 Docker 引擎
安装完成后,您可以验证Docker的版本。
$ docker version
Client: Docker Engine - Community
Version: 25.0.3
API version: 1.44
Go version: go1.21.6
Git commit: 4debf41
Built: Tue Feb 6 21:13:09 2024
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 25.0.3
API version: 1.44 (minimum version 1.24)
Go version: go1.21.6
Git commit: f417435
Built: Tue Feb 6 21:13:09 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.28
GitCommit: ae07eda36dd25f8a1b98dfbf587313b99c0190bb
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0
在 Docker 容器中运行 Nginx 代理管理器
Nginx 代理管理器将使用端口 80 表示 http,使用端口 443 表示 https 流量,使用端口 81 表示其管理仪表板。如果同一主机上有另一个 Web 服务器,例如 Nginx 或 Apache,请考虑禁用它。
要在基于 Debian 和 RHEL 的系统上停止当前的 Nginx 和 Apache Web 服务,请使用以下命令。
### Debian / Ubuntu ###
sudo systemctl disable --now nginx apache2
### RHEL based systems ###
sudo systemctl disable --now nginx httpd
创建包含 Nginx 代理管理器数据的目录。
mkdir ~/nginx-proxy-manager && cd ~/nginx-proxy-manager
Docker compose 是一种命令行工具,用于根据名为 docker-compose.yml 的单个 YAML 文件中的定义来定义和运行一个或多个容器应用程序。让我们创建这个文件
vim docker-compose.yml
这里我们有使用 Compose 运行应用程序所需的默认配置。默认数据库是SQLite。
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
# Add any other Stream port you want to expose
# - '21:21' # FTP
# Uncomment the next line if you uncomment anything in the section
# environment:
# Uncomment this if you want to change the location of
# the SQLite DB file within the container
# DB_SQLITE_FILE: "/data/database.sqlite"
# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
如果您希望使用 MariaDB 数据库,以下是 docker-compose.yml
的示例:
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
# Add any other Stream port you want to expose
# - '21:21' # FTP
environment:
# Mysql/Maria connection parameters:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm"
DB_MYSQL_NAME: "npm"
# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- db
db:
image: 'jc21/mariadb-aria:latest'
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'npm'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'npm'
MARIADB_AUTO_UPGRADE: '1'
volumes:
- ./mysql:/var/lib/mysql
通过执行以下命令激活容器运行。
docker compose up -d
预期的命令执行输出。
[+] Running 2/2
✔ Network nginx-proxy-manager_default Created 0.1s
✔ Container nginx-proxy-manager-app-1 Started 0.2s
如果一切顺利,您将看到如下所示的输出。
当应用程序启动时,将发生以下操作。
- GPG 密钥生成并保存在数据文件夹中
- 数据库将使用表结构进行初始化
- 将创建一个默认管理员用户 - 具有信用[电子邮件受保护]/changeme
前面提到的服务端口是80、443和81。
$ ss -tunelp | egrep '80|443|81'
tcp LISTEN 0 4096 0.0.0.0:80 0.0.0.0:* users:(("docker-proxy",pid=608762,fd=4)) ino:8689062 sk:100d cgroup:/system.slice/docker.service <->
tcp LISTEN 0 4096 0.0.0.0:81 0.0.0.0:* users:(("docker-proxy",pid=608740,fd=4)) ino:8689043 sk:100e cgroup:/system.slice/docker.service <->
tcp LISTEN 0 4096 0.0.0.0:443 0.0.0.0:* users:(("docker-proxy",pid=608718,fd=4)) ino:8688177 sk:100f cgroup:/system.slice/docker.service <->
tcp LISTEN 0 4096 [::]:80 [::]:* users:(("docker-proxy",pid=608768,fd=4)) ino:8689067 sk:1010 cgroup:/system.slice/docker.service v6only:1 <->
tcp LISTEN 0 4096 [::]:81 [::]:* users:(("docker-proxy",pid=608746,fd=4)) ino:8688198 sk:1011 cgroup:/system.slice/docker.service v6only:1 <->
tcp LISTEN 0 4096 [::]:443 [::]:* users:(("docker-proxy",pid=608724,fd=4)) ino:8688181 sk:1012 cgroup:/system.slice/docker.service v6only:1 <->
您可以在 http://ServerIP_or_FQDN:81 上访问 Nginx 代理管理器
默认登录详细信息是;
- 电子邮件:[电子邮件受保护]
- 密码:更改我
登录后编辑用户并设置名称和正确的电子邮件地址。
将其密码从更改更改为更强的密码。
仪表板的导航菜单中将包含以下部分。
使用 Let’s Encrypt SSL(通配符)
我发现对所有子域使用 Let's Encrypt 通配符 SSL 比为每个域生成证书更理想。要创建新的 SSL 证书,请导航至“SSL 证书”,然后“添加 SSL 证书”。
对于我的用例,我将选择“使用 DNS 挑战”,因为我的域托管在 Cloudflare 中。输入*.domain作为通配符子域ssl证书。您还可以添加主域,以便证书同时具有这两个域。
保存并等待证书生成。
添加代理主机
对于需要公开的服务,您必须为指向 Nginx 代理管理器 IP 地址的域名创建 DNS A 记录。例如;
grafana.computingforgeeks.com in A 192.168.20.3
在本教程的其余部分中,我们将使用 computingforgeeks.com 作为域,并将其替换为您的实际域名。
要添加新的虚拟主机,请导航至主机>代理主机。
单击“添加代理主机”配置新的虚拟主机。
填写以下详细信息来完成表格。
- 域名:输入一个或多个将访问该服务的域名。
- Scheme:设置Nginx访问服务所使用的scheme,因此不是代理本身使用的scheme。
- 转发主机名/IP:配置后端服务运行的IP地址或主机名。它可以是本地或公共 IP。
- 转发端口:后端服务使用的服务端口。
- 阻止常见漏洞:您可以打开此选项。
- 其他字段可以保留默认值。
在 SSL 部分下,您可以选择请求新的 SSL 证书或使用之前添加的现有 SSL 证书。填写获取 Let’s Encrypt SSL 证书所需的其他信息。
所有代理主机都列在“代理主机”菜单部分下。点击源 URL 来测试您的 nginx 代理服务。
结论
在本文中,我们演示了如何使用 Nginx 代理管理器来管理对受 Let's Encrypt SSL 证书保护的后端服务的外部前端或公共访问。这被认为是基本使用指南,但可以进行更高级的设置。这只是为了展示 nginx 代理管理器的功能和有效性。
更新于:4个月前
相关文章
- 【说站】Java如何在PDF添加注释
- 【说站】java软引用如何在浏览器使用
- DockerUI 中文可视化Docker管理工具使用示例
- 判断 nginx 服务是否启动,未启动自动重启 shell脚本
- docker 怎么部署 php 应用
- 容器化囧途~没上容器时好好的?
- 如何在 JavaScript 中使用正则表达式删除 HTML 标签?
- Supervisor 管理器常见问题
- brew 安装 nginx 配合PHP工作
- TP6.0 容器和依赖注入
- 使用Docker Wine Qemu KVM在Linux运行Windows应用
- docker部署.net core网站
- 简单了解Docker的概念和作用
- Docker 80端口 绑定多个域名
- Docker运维常用命令大全
- Nginx配置文件(nginx.conf)配置参数详解
- Nginx反向代理原理详解
- 使用docker搭建Nginx + PHP + mysql环境
- linux的shell脚本中如何在一个字符串中查找指定字符串是否存在
- .NET容器化支持和云原生支持