При развертывании высоконагруженных веб-приложений часто приходится взаимодействовать с прокси-сервером. Помимо прямого прокси-сервера (Forward Proxy Server), существуют также обратный прокси-сервер (Reverse Proxy Server), цель которого заключается в повышении безопасности и производительности, а также в управлении трафиком путем обработки запросов от клиентов и распределения их между несколькими внутренними сервисами. Также обратный прокси-сервер используется для сокрытия реального IP-адреса сервиса, тем самым повышая уровень безопасности. Сегодня мы рассмотрим программный продукт Nginx Proxy Manager, который можно использовать как reverse proxy (обратный прокси) для веб-приложений.
Nginx Proxy Manager — это обратный прокси-сервер (reverse proxy) с поддержкой графического интерфейса, разработанный для упрощения настройки и управлением обратными прокси на основе веб-сервера Nginx. Сервис используется для организации доступа к различным веб-приложениям через единую точку входа (в качестве единой точки входа может выступать, например, доменное имя или IP-адрес) с дальнейшей маршрутизацией до конечного приложения.
Главная особенность Nginx Proxy Manager заключается в отсутствии необходимости вручную редактировать конфигурационные файлы. Вместо этого вся настройка осуществляется через встроенный веб-интерфейс. Проект является полностью бесплатным и не обладает дополнительными платными тарифами, а также имеет открытый исходный код, доступный на платформе GitHub.
Несмотря на наличие слова «Nginx» в название программы, Nginx Proxy Manager не имеет прямого отношения к компании NGINX Inc., которая является коммерческим разработчиком оригинального веб-сервера Nginx. Однако Nginx Proxy Manager основан на оригинальном исходном коде Nginx и использует его в качестве основы для своей работы.
Также NPM обладает расширенным функционалом, который включает в себя следующие особенности:
Чтобы установить и использовать Nginx Proxy Manager, нам понадобится следующее:
Один сервер или одна виртуальная машина с любым предустановленным дистрибутивом Linux. В данной статье в качестве примера мы будем использовать дистрибутив Ubuntu 24.04.
Сервер должен соответствовать следующим требованиям:
Минимум 1 ГБ оперативной памяти. Данный объем подойдет только для тестирования Nginx Proxy Manager и не предназначен для решения реальных задач. Для production решений необходимо минимум 4 ГБ оперативной памяти.
Минимум 1-ядерный процессор для тестирования конфигурации. Для выполнения реальных задач рекомендуется 4-ядерный процессор.
Сервер можно создать в панели управления в разделе «Облачные серверы». В процессе:
Выберите регион с минимальным пингом для быстрой передачи данных.
Выберите конфигурацию, достаточную для ваших задач. В рамках данной статьи для запуска и тестового использования Nginx Proxy Manager без реальной нагрузки будет достаточно конфигурации с одноядерном процессором, 1 ГБ оперативной памяти и 15 ГБ места на NVMe-диске.
Остальные параметры можно оставить без изменений.
Сервер будет запущен через пару минут, и вы сможете найти IP-адрес, логин и пароль для подключения на Дашборде сервера.
cloud
На сервере должны быть открыты порты 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
Для работы с 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
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
Сохраняем изменения и выходим из файла.
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.
Для начала рассмотрим базовый запуск программы, используя минимальный набор параметров.
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 осуществляется исключительно через веб-интерфейс. Веб-консоль доступна на 81 порту. Открываем браузер и переходим по IP-адресу сервера, используя порт 81:
Логин (Email) и пароль по умолчанию следующие:
При первом входе программа предложит поменять данные стандартного пользователя. Имя пользователя и псевдоним (nickname) можно поменять по желанию, однако адрес электронный почты надо обязательно сменить со стандартного на другой:
Далее система предложит изменить пароль. Для этого сначала необходимо ввести стандартный пароль, далее новый и повторить его:
После этого отобразится главная страница Nginx Proxy Manager:
Настроим схему работы для трех запущенных приложений, при которой к каждому сервису можно обратиться по доменному имени и получить уникальный ответ от каждого приложения.
Далее нажимаем на кнопку Add Proxy Host:
Для сохранения конфигурации используем кнопку Save.
И третье:
В итоге у нас будут добавлены три приложения:
curl
отправляем запрос на каждый из доменных имен:По итогу мы получили уникальный ответ от каждого приложения.
По умолчанию для хранения конфигурации и данных Nginx Proxy Manager использует встраиваемую СУБД SQLite. Однако при желании SQLite можно поменять на MySQL или на MariaDB. В качестве минимально поддерживаемых версий заявлены следующие:
Ниже приведен пример использования конфигурации с СУБД 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 до последней версии при запуске.Все значения переменных, перечисленных выше, можно поменять в соответствии с вашими требованиями.
Помимо 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
, что может привести к неработоспособности сервиса или содержать недоработки, а также проблемы, связанные с безопасностью.
Выгодные тарифы на облако в Timeweb Cloud
Nginx Proxy Manager — это удобный инструмент для тех пользователей, кому необходимо настроить прокси-сервер без лишних неудобств. Сервис легко и быстро разворачивается в Docker, а вся настройка происходит исключительно в веб-интерфейсе, благодаря чему с программой сможет работать даже начинающий пользователь. Nginx Proxy Manager обладает самым необходимым функционалом, включающим управление доменами, настройку SSL, переадресацию и даже защиту доступа.