雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

如何在 Docker 容器中运行 Nginx 代理管理器

2024-07-24 85

我们都知道 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

如果一切顺利,您将看到如下所示的输出。

当应用程序启动时,将发生以下操作。

  1. GPG 密钥生成并保存在数据文件夹中
  2. 数据库将使用表结构进行初始化
  3. 将创建一个默认管理员用户 - 具有信用[电子邮件受保护]/changeme

前面提到的服务端口是80、44381。

$ 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个月前
赞一波!1

文章评论

评论问答