Как запустить прокси-менеджер 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
Если все пойдет хорошо, вы увидите результат, как показано ниже.
При запуске приложений произойдут следующие операции.
- Ключи GPG генерируются и сохраняются в папке данных.
- База данных будет инициализирована табличными структурами.
- Будет создан пользователь-администратор по умолчанию с учетными данными [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.