Поиск по сайту:

Как запустить прокси-менеджер Nginx в контейнере Docker


Мы все знаем, что ручное управление прокси-хостами Nginx, перенаправлениями и SSL может быть утомительным. Проект Nginx Proxy Manager начался как личный проект Джейми Керноу с целью предоставить более простой способ создания хостов обратного прокси-сервера и завершения SSL с помощью Nginx. В проекте есть дополнительные расширенные параметры для расширенного использования прокси. Ниже приведены некоторые полезные функции Nginx Proxy Manager.

  • Поддержка управления пользователями, предоставления разрешений и ведения журнала аудита.
  • Он поставляется с красивым и безопасным интерфейсом администратора на основе Tablerоткрыть в новом окне.
  • Поддержка бесплатного SSL с использованием Let’s Encrypt или возможность предоставления собственных сертификатов SSL.
  • Возможность создавать домены пересылки, перенаправления, потоки и хосты 404 без владения концепциями Nginx.
  • Для суперпользователей доступна расширенная конфигурация Nginx.
  • Поддержка списков доступа и базовой HTTP-аутентификации для определенных хостов.
  • Простота развертывания: он создан в виде образа Docker для быстрой установки.

В следующих разделах мы выполним установку, настройку и продемонстрируем базовое использование Nginx Proxy Manager в Docker-контейнере. Чтобы следовать этой статье, вам не нужны глубокие знания Linux.

Установить механизм Docker

Nginx Proxy Manager упакован в виде образа контейнера, который можно запустить в Docker, Podman или любом аналогичном контейнерном движке. Для простоты в этой статье мы используем Docker Engine. Следуйте статье ниже, чтобы выполнить установку Docker Container Engine.

  • Как установить Docker Engine в системах Linux

После установки вы можете проверить версию 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

Запустите Nginx Proxy Manager в Docker-контейнере

Nginx Proxy Manager будет использовать порты 80 для http, порт 443 для https-трафика и порт 81 для своей панели администратора. Если у вас есть другой веб-сервер, например Nginx или Apache, на том же хосте, рассмотрите возможность его отключения.

Чтобы остановить текущие веб-службы Nginx и Apache в системах на базе Debian и RHEL, используйте следующие команды.

### 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 — это инструмент командной строки, используемый для определения и запуска одного или нескольких приложений-контейнеров на основе определений в одном файле YAML с именем docker-compose.yml. Давайте создадим этот файл

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. Будет создан пользователь-администратор по умолчанию с учетными данными [email /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 <->

Вы можете получить доступ к Nginx Proxy Manager по адресу http://ServerIP_or_FQDN:81.

Данные для входа по умолчанию:

  • Электронная почта: [электронная почта защищена]
  • Пароль: changeme

Отредактируйте пользователя после входа в систему, задайте имена и правильный адрес электронной почты.

Измените пароль с изменить на более надежный пароль.

Панель управления будет иметь следующие разделы в меню навигации.

Использование Let’s Encrypt SSL (подстановочный знак)

Я считаю, что использование SSL с подстановочными знаками Let’s Encrypt для всех поддоменов более идеально, чем создание сертификата для каждого домена. Чтобы создать новые сертификаты SSL, перейдите к «Сертификаты SSL» , затем «Добавить сертификат SSL».

В моем случае я выберу вариант «Использовать DNS-запрос» , поскольку мой домен размещен в Cloudflare. Введите *.domain для SSL-сертификата субдомена с подстановочным знаком. Вы также можете добавить основной домен, чтобы в сертификате были оба.

Сохраните и дождитесь создания сертификата.

Добавить прокси-хосты

Для службы, которую вам нужно будет предоставить, вы должны создать запись DNS A для доменного имени, указывающую на IP-адрес прокси-менеджера Nginx. Например;

grafana.computingforgeeks.com in A 192.168.20.3

В оставшейся части этого руководства мы будем использовать computingforgeeks.com в качестве домена, заменив его фактическим доменным именем.

Чтобы добавить новый виртуальный хост, перейдите в раздел Хосты > Прокси-хосты.

Нажмите «Добавить прокси-хост» , чтобы настроить новый виртуальный хост.

Заполните форму, указав следующие данные.

  • Доменные имена. Введите одно или несколько доменных имен, через которые будет осуществляться доступ к службе.
  • Схема: установите схему, используемую Nginx для доступа к службе. Таким образом, это не схема, используемая для самого прокси.
  • Переслать имя хоста/IP: настройте IP-адрес или имя хоста, на котором работает серверная служба. Это может быть локальный или общедоступный IP-адрес.
  • Порт пересылки: порт службы, используемый внутренней службой.
  • Блокировать распространенные эксплойты: вы можете включить эту опцию.
  • Остальные поля можно оставить по умолчанию.

В разделе SSL вы можете запросить новый сертификат SSL или использовать существующий, добавленный ранее. Заполните другую информацию, необходимую для получения SSL-сертификата Let’s Encrypt.

Все прокси-хосты перечислены в разделе меню «Прокси-хосты». Нажмите исходный URL-адрес, чтобы протестировать прокси-службу nginx.

Заключение

В этой статье мы продемонстрировали, как вы можете использовать Nginx Proxy Manager для управления внешним внешним или общедоступным доступом к серверным службам, защищенным с помощью SSL-сертификатов Let’s Encrypt. Это базовое руководство по использованию, но можно выполнить и более сложные настройки. Это сделано только для демонстрации функциональных возможностей и эффективности прокси-менеджера nginx.