При развертывании высоконагруженных веб-приложений часто приходится взаимодействовать с прокси-сервером. Помимо прямого прокси-сервера (Forward Proxy Server), существуют также обратный прокси-сервер (Reverse Proxy Server), цель которого заключается в повышении безопасности и производительности, а также в управлении трафиком путем обработки запросов от клиентов и распределения их между несколькими внутренними сервисами. Также обратный прокси-сервер используется для сокрытия реального IP-адреса сервиса, тем самым повышая уровень безопасности. Сегодня мы рассмотрим программный продукт Nginx Proxy Manager, который можно использовать как reverse proxy (обратный прокси) для веб-приложений.
❯ Что такое Nginx Proxy Manager
Nginx Proxy Manager — это обратный прокси-сервер (reverse proxy) с поддержкой графического интерфейса, разработанный для упрощения настройки и управлением обратными прокси на основе веб-сервера Nginx. Сервис используется для организации доступа к различным веб-приложениям через единую точку входа (в качестве единой точки входа может выступать, например, доменное имя или IP-адрес) с дальнейшей маршрутизацией до конечного приложения.
Главная особенность Nginx Proxy Manager заключается в отсутствии необходимости вручную редактировать конфигурационные файлы. Вместо этого вся настройка осуществляется через встроенный веб-интерфейс. Проект является полностью бесплатным и не обладает дополнительными платными тарифами, а также имеет открытый исходный код, доступный на платформе GitHub.
Отличие Nginx Proxy Manager от Nginx
Несмотря на наличие слова «Nginx» в название программы, Nginx Proxy Manager не имеет прямого отношения к компании NGINX Inc., которая является коммерческим разработчиком оригинального веб-сервера Nginx. Однако Nginx Proxy Manager основан на оригинальном исходном коде Nginx и использует его в качестве основы для своей работы.
Также NPM обладает расширенным функционалом, который включает в себя следующие особенности:
-
Встроенный веб-интерфейс.
-
Быстрая и удобная настройка переадресации доменов, использование встроенной функции Streams для настройки потоков данных, проходящих через протоколы TCP/UDP, а также кастомизация страниц с кодом ошибки 404.
-
Наличие встроенного сервиса Let’s Encrypt для выпуска бесплатных SSL сертификатов. Также сохраняется возможность использования самоподписанных сертификатов и сертификатов, выпущенных сторонними удостоверяющими центрами.
-
Функционал по обеспечению безопасности, включающий в себя списки доступов (Access-control list) и HTTP-аутентификацию (HTTP Basic Auth).
-
Управление пользователями, настройка прав доступа и аудит лог файлов.
❯ Предварительные требования
Чтобы установить и использовать Nginx Proxy Manager, нам понадобится следующее:
-
Один сервер или одна виртуальная машина с любым предустановленным дистрибутивом Linux. В данной статье в качестве примера мы будем использовать дистрибутив Ubuntu 24.04.
Сервер должен соответствовать следующим требованиям:
-
Минимум 1 ГБ оперативной памяти. Данный объем подойдет только для тестирования Nginx Proxy Manager и не предназначен для решения реальных задач. Для production решений необходимо минимум 4 ГБ оперативной памяти.
-
Минимум 1-ядерный процессор для тестирования конфигурации. Для выполнения реальных задач рекомендуется 4-ядерный процессор.
Сервер можно создать в панели управления в разделе «Облачные серверы». В процессе:
-
Выберите регион с минимальным пингом для быстрой передачи данных.
-
Выберите конфигурацию, достаточную для ваших задач. В рамках данной статьи для запуска и тестового использования Nginx Proxy Manager без реальной нагрузки будет достаточно конфигурации с одноядерном процессором, 1 ГБ оперативной памяти и 15 ГБ места на NVMe-диске.
Остальные параметры можно оставить без изменений.
Сервер будет запущен через пару минут, и вы сможете найти IP-адрес, логин и пароль для подключения на Дашборде сервера.
❯ Подготовка сервера
Настройка Firewall
На сервере должны быть открыты порты 80, 81 и 443, которые Nginx Proxy Manager использует в своей работе. По умолчанию в дистрибутиве Ubuntu используется утилита UFW. Необходимо открыть данные порты, используя следующие команды:
Для протокола TCP:
ufw allow 80,81,443/tcp
Для протокола UDP:
ufw allow 80,81,443/udp
Либо UFW можно выключить совсем, если он не используется:
systemctl stop ufw && systemctl disable ufw
Если вместо UFW используется программа iptables, то команды будут следующими:
Для входящих соединений по протоколу TCP:
iptables -A INPUT -p tcp --match multiport --dports 80,81,443 -j ACCEPT
Для входящих соединений по протоколу UDP:
iptables -A INPUT -p udp --match multiport --dports 80,81,443 -j ACCEPT
Для исходящих соединений по протоколу TCP:
iptables -A OUTPUT -p tcp --match multiport --dports 80,81,443 -j ACCEPT
Для исходящих соединений по протоколу UDP:
iptables -A OUTPUT -p udp --match multiport --dports 80,81,443 -j ACCEPT
Установка Docker и Docker Compose
Для работы с Nginx Proxy Manager нам потребуются Docker и Docker Compose, которые мы установим из официального репозитория Docker. Для этого выполняем следующие шаги:
-
Создаем директорию
/etc/apt/keyringsс правами доступа 0755:
sudo install -m 0755 -d /etc/apt/keyrings
-
При помощи утилиты curl скачиваем GPG-ключ от официального репозитория Docker и перемещаем его в ранее созданную директорию
/etc/apt/keyrings:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
-
Выставляем права на чтение для скачанного ключа:
chmod a+r /etc/apt/keyrings/docker.asc
-
Добавляем адрес официального репозитория Docker в систему:
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
-
Обновляем индекс репозиториев и устанавливаем пакеты docker и docker-compose:
apt update && apt -y install docker-ce docker-compose-plugin
-
Проверьте успешность установки.
Для проверки установки Docker:
docker --version

Для проверки установки Docker Compose:
docker compose version

Если обе команды вернули версии программ, то Docker и Docker Compose успешно установлены в системе.
Подготовка тестовых приложений
В качестве теста мы будем использовать три контейнера Docker с веб-сервером Nginx. У каждого запущенного контейнера свой уникальный порт, при обращении к которому будет отображаться своя фраза. Цель будет заключаться в следующем: используя Nginx Proxy Manager, «опубликовать» все три сервиса, чтобы они были доступны пользователям в рамках частной сети по доменным именам и возвращали пользователям свой уникальный контент. Для этого нам понадобится три доменных имени. Так как все действия производятся сугубо для тестирования, мы воспользуемся локальными доменами, а именно пропишем тестовые доменные в файле /etc/hosts.
По умолчанию, Docker создает свою подсеть с адресом 172.17.0.1:

-
Открываем на редактирование при помощи любого текстового редактора файл hosts:
nano /etc/hosts
И прописываем три тестовых домена, используя в качестве IP-адреса адрес интерфейса Docker — docker0.
172.17.0.1 nginx1.test.com 172.17.0.1 nginx2.test.com 172.17.0.1 nginx3.test.com

Сохраняем изменения и выходим из файла.
-
Далее создаем новую директорию, где будет храниться конфигурация для трех контейнеров в виде docker-compose-файла, и сразу переходим в нее:
mkdir nginx-test-apps && cd nginx-test-apps
-
Создаем файл с именем
docker-compose.yml:
nano docker-compose.yml
Используем следующее содержимое:
services: nginx1: image: nginx:alpine3.21 ports: - "8081:80" volumes: - ./nginx1/html:/usr/share/nginx/html command: ["/bin/sh", "-c", "echo 'Hello from nginx1!' > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"] nginx2: image: nginx:alpine3.21 ports: - "8082:80" volumes: - ./nginx2/html:/usr/share/nginx/html command: ["/bin/sh", "-c", "echo 'Hello from nginx2!' > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"] nginx3: image: nginx:alpine3.21 ports: - "8083:80" volumes: - ./nginx3/html:/usr/share/nginx/html command: ["/bin/sh", "-c", "echo 'Hello from nginx3!' > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"]

Сохраняем изменения и выходим из файла.
-
Для создания контейнеров используем команду:
docker compose up -d
-
Убедимся, что все три контейнера успешно запущены, используя команду:
docker ps

Также проверим что все три приложения возвращаю в ответе свою фразу. Для этого используем команду curl с указанием IP-адреса сервера и порта контейнера:
curl 172.17.0.1:8081 curl 172.17.0.1:8082 curl 172.17.0.1:8083

Все три контейнера возвращают свои уникальные ответы. На этом подготовка тестовых приложений завершена.
Запуск и настройка Nginx Proxy Manager
Далее мы подробно рассмотрим процесс запуска и настройки Nginx Proxy Manager.
Запуск базовой конфигурации
Для начала рассмотрим базовый запуск программы, используя минимальный набор параметров.
-
Создаем новую директорию для проекта и переходим в нее:
mkdir nginx-proxy-manager-basic && cd nginx-proxy-manager-basic
-
Внутри директории создаем новый файл с именем
docker-compose.yml:
nano docker-compose.yml
И используем следующую конфигурацию:
services: app: image: 'jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: - '80:80' - '81:81' - '443:443' volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt

Сохраняем изменения и выходим из файла.
-
Для запуска воспользуемся командой:
docker compose up -d

При первом запуске дожидаемся процесса скачивания образа. При успешном завершении процесса команда сообщит о том, что контейнер был запущен:

По итогу у нас будет запущен один контейнер с Nginx Proxy Manager, у которого проброшены порты 80, 81 и 443.
На этом процесс запуска успешно завершен. Далее мы рассмотрим настройку Nginx Proxy Manager для трех веб-приложений, запущенных в контейнерах Docker.
Первоначальная настройка Nginx Proxy Manager
Ранее мы упоминали, что настройка Nginx Proxy Manager осуществляется исключительно через веб-интерфейс. Веб-консоль доступна на 81 порту. Открываем браузер и переходим по IP-адресу сервера, используя порт 81:

Логин (Email) и пароль по умолчанию следующие:
-
Email: admin@example.com
-
Password: changeme
При первом входе программа предложит поменять данные стандартного пользователя. Имя пользователя и псевдоним (nickname) можно поменять по желанию, однако адрес электронный почты надо обязательно сменить со стандартного на другой:

Далее система предложит изменить пароль. Для этого сначала необходимо ввести стандартный пароль, далее новый и повторить его:

После этого отобразится главная страница Nginx Proxy Manager:

Настройка и использование Nginx Proxy Manager
Настроим схему работы для трех запущенных приложений, при которой к каждому сервису можно обратиться по доменному имени и получить уникальный ответ от каждого приложения.
-
В веб-интерфейсе Nginx Proxy Manager переходим в раздел Proxy Hosts:

Далее нажимаем на кнопку Add Proxy Host:

-
Далее:
-
В поле Domain name вводим доменное имя, по которому будет доступно приложение.
-
В поле Forward Hostname / IP вводим IP адрес контейнера (в нашем случае это внутренний IP-адрес интерфейса Docker).
-
В разделе Forward Port необходимо указать порт контейнера, который «слушает» сервис.
-

Для сохранения конфигурации используем кнопку Save.
-
Для добавления нового прокси-хоста нажимаем на кнопку Add Proxy Host, которая располагается справа сверху:

-
По аналогии добавляем второе приложение:

И третье:

В итоге у нас будут добавлены три приложения:

-
После того как все приложения будут добавлены, возвращаемся на сервер и при помощи утилиты curl отправляем запрос на каждый из доменных имен:

По итогу мы получили уникальный ответ от каждого приложения.
Подключение MySQL/MariaDB
По умолчанию для хранения конфигурации и данных Nginx Proxy Manager использует встраиваемую СУБД SQLite. Однако при желании SQLite можно поменять на MySQL или на MariaDB. В качестве минимально поддерживаемых версий заявлены следующие:
-
MySQL версии 5.7.8 и выше
-
MariaDB версии 10.2.7 и выше
Ниже приведен пример использования конфигурации с СУБД MySQL/MariaDB:
services: app: image: 'jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: - '80:80' - '443:443' - '81:81' environment: DB_MYSQL_HOST: "db" DB_MYSQL_PORT: 3306 DB_MYSQL_USER: "npm" DB_MYSQL_PASSWORD: "npm" DB_MYSQL_NAME: "npm" 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
В качестве переменных окружения используются следующие:
-
DB_MYSQL_HOST— Адрес сервера, на котором запущена база данных. -
DB_MYSQL_PORT— Номер порта, через который осуществляется подключение к базе данных. -
DB_MYSQL_USER— Имя пользователя, используемое для аутентификации в базе данных. -
DB_MYSQL_PASSWORD— Пароль пользователя, из-под которого осуществляется подключение к базе данных. -
DB_MYSQL_NAME— Название базы данных, к которой производиться подключение. -
MYSQL_ROOT_PASSWORD— Пароль пользователя root в MySQL. -
MYSQL_DATABASE— Название базы данных, которая будет автоматически создана при запуске MySQL. -
MYSQL_USER— Имя дополнительного пользователя, из-под имени которого будет запущена база данных. -
MYSQL_PASSWORD— Пароль для пользователя, указанного в переменнойMYSQL_USER. -
MARIADB_AUTO_UPGRADE— Параметр, отвечающий за необходимость автоматического обновления схемы базы данных MariaDB до последней версии при запуске.
Все значения переменных, перечисленных выше, можно поменять в соответствии с вашими требованиями.
Подключение PostgreSQL
Помимо MySQL и MariaDB, в официальной документации по Nginx Proxy Manager упоминается и PostgreSQL, но официально поддержка PostgreSQL не заявлена. Однако в тестовых целях PostgreSQL можно использовать. Для этого достаточно применить следующую конфигурацию:
services: app: image: 'jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: - '80:80' - '443:443' - '81:81' environment: DB_POSTGRES_HOST: 'db' DB_POSTGRES_PORT: '5432' DB_POSTGRES_USER: 'npm' DB_POSTGRES_PASSWORD: 'npmpass' DB_POSTGRES_NAME: 'npm' volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt depends_on: - db db: image: postgres:latest environment: POSTGRES_USER: 'npm' POSTGRES_PASSWORD: 'npmpass' POSTGRES_DB: 'npm' volumes: - ./postgres:/var/lib/postgresql/data
Обратите внимание, что в качестве тега для образа postgres задан тег latest, что может привести к неработоспособности сервиса или содержать недоработки, а также проблемы, связанные с безопасностью.
❯ Заключение
Nginx Proxy Manager — это удобный инструмент для тех пользователей, кому необходимо настроить прокси-сервер без лишних неудобств. Сервис легко и быстро разворачивается в Docker, а вся настройка происходит исключительно в веб-интерфейсе, благодаря чему с программой сможет работать даже начинающий пользователь. Nginx Proxy Manager обладает самым необходимым функционалом, включающим управление доменами, настройку SSL, переадресацию и даже защиту доступа.
Автор текста: Александр Бархатов
Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале ↩
Перед оплатой в разделе «Бонусы и промокоды» в панели управления активируйте промокод и получите кэшбэк на баланс.
📚 Читайте также:
ссылка на оригинал статьи https://habr.com/ru/articles/893502/
Добавить комментарий