Научитесь настраивать обратный прокси-сервер с помощью Nginx Proxy Manager, чтобы упростить управление сервером и повысить безопасность всего за несколько простых шагов.
Nginx Proxy Manager (NPM) — это простой в использовании инструмент для управления конфигурациями обратного прокси-сервера. По сути, он представляет собой удобный интерфейс для высокопроизводительного веб-сервера Nginx, а также использует Let’s Encrypt в фоновом режиме для выдачи бесплатных SSL-сертификатов, обеспечивая таким образом подключение по протоколу HTTPS к проксируемым сервисам.
По сравнению с другими решениями для обратного прокси-сервера, такими как Nginx, Caddy или Traefik, основное преимущество NPM заключается в том, что он предоставляет удобный графический интерфейс для управления настройками прокси-сервера, сертификатами SSL/TLS и контролем доступа, что делает его доступным даже для тех, у кого есть минимальный опыт работы с командной строкой.
Однако, если вы хотите попробовать другие варианты обратного прокси-сервера, вы можете воспользоваться нашими простыми руководствами по Nginx и Caddy. Теперь вернёмся к теме. Вот основные преимущества Nginx Proxy Manager.
Использование Nginx Proxy Manager в качестве обратного прокси-сервера может дать несколько преимуществ:
NPM работает в контейнере Docker. Поэтому убедитесь, что на вашем сервере установлен Docker. Но не волнуйтесь, если у вас его ещё нет; мы вам поможем. Наши руководства по установке Docker почти на все основные дистрибутивы Linux, такие как Ubuntu, Debian, Fedora, Linux Mint, Pop!_OS, Alma и Rocky Linux, помогут вам легко выполнить эти действия.
Далее давайте уточним нашу настройку. На нашем сервере есть два контейнерных приложения-образца, к которым мы будем перенаправлять трафик: программа для чтения RSS-каналов FreshRSS и приложение для заметок Memos, которые работают на портах 1080 и 5230 соответственно.
Конечно, вы можете работать и с большим количеством приложений. Nginx Proxy Manager может без проблем справляться с такими большими нагрузками. Мы выбрали всего два приложения, чтобы всё было максимально просто и понятно.
Кроме того, мы используем «tmplinux.com» — домен, которым мы владеем и который используем для тестирования. Мы направим две записи DNS A для поддоменов «rss.tmplinux.com» для приложения FreshRSS и «memos.tmplinux.com» для приложения для заметок Memos на общедоступный IP-адрес сервера, на котором работает Nginx Proxy Manager.
Вот наш производственный процесс, чтобы дать вам лучшее наглядное представление.
Однако, если у вас нет собственного домена, вы всегда можете создать статическую запись для произвольного домена в файле «/etc/hosts».
Но имейте в виду, что если вы воспользуетесь этим подходом, то не сможете получить действительный SSL-сертификат от NPM, потому что для этого вам нужно владеть доменным именем и связать его с реальным публичным IP-адресом.
Теперь, когда всё понятно, давайте перейдём к сути: настройке Nginx Proxy Manager для выполнения задач обратного проксирования.
Перед установкой NPM необходимо сначала создать новую сеть Docker. Эта сеть будет соединять NPM с другими контейнерами, с которыми ему нужно взаимодействовать. Если мы этого не сделаем, Nginx Proxy Manager не сможет взаимодействовать с этими контейнерами и отправлять им трафик.
Давайте создадим нашу сеть Docker, выбрав в качестве имени «reverse_proxy».
docker network create reverse_proxy
Далее мы убедимся, что всё в порядке и сеть доступна.
docker network ls
После создания сети Docker «reverse_proxy» приступим к установке самого Nginx Proxy Manager. Для начала создайте каталог «npm» и войдите в него.
mkdir npm cd npm
Мы будем развёртывать NPM с помощью Docker Compose. Откройте текстовый редактор и создайте файл «docker-compose.yaml». Вставьте приведённый ниже текст, сохраните его и закройте редактор.
nano docker-compose.yaml
services: app: container_name: npm image: 'jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: - '80:80' # Общедоступный HTTP-порт - '443:443' # Общедоступный HTTPS-порт - '81:81' # Веб-порт администратора networks: - reverse_proxy volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt networks: reverse_proxy: name: reverse_proxy external: true
Как видите, это довольно простой файл Compose. Важно отметить, что порты 80 и 443 предназначены для приёма запросов Nginx Proxy Manager, а порт 81 позволяет получить доступ к веб-интерфейсу администратора NPM.
Кроме того, мы также создаём два тома в текущем каталоге, чтобы хранить данные конфигурации NPM и сертификаты SSL в безопасности. Это важно, потому что по умолчанию Docker не сохраняет данные постоянно; без этих томов все данные будут потеряны при перезапуске контейнера.
Прежде чем мы запустим NPM, давайте убедимся, что никакие другие службы не используют порты 80 и 443, которые необходимы для Nginx Proxy Manager. Если эти порты уже используются, вам нужно будет остановить службы, которые их используют. В противном случае NPM не запустится и выдаст ошибку.
Чтобы узнать, какие порты используются, мы воспользуемся командой netstat:
netstat
и посмотрим на вывод для портов 80 и 443. Если их нет в списке, то всё в порядке.
netstat -tulnp
Теперь мы готовы приступить к развёртыванию контейнера Nginx Proxy Manager:
docker compose up -d
Опять же, менеджер прокси-серверов Nginx должен быть подключен к той же сети, что и контейнеры, которым он перенаправляет запросы, чтобы иметь возможность взаимодействовать с ними. Для этого необходимо изменить их развертывание.
Например, для настройки нашего приложения FreshRSS необходимо добавить часть сети «reverse_proxy», как показано ниже:
Убедитесь, что вы перезапустили свои контейнеры после внесения изменений.
Вы также можете подключить уже запущенные контейнеры к сети «reverse_proxy», которую мы настроили ранее, с помощью следующей команды:
docker network connect reverse_proxy CONTAINER_NAME
Или при их запуске, если вы используете одну команду
docker run
, подключите их к нужной сети:
docker run --network=reverse_proxy YOUR-OTHER-OPTIONS-HERE
Используйте следующую команду, чтобы проверить, используют ли запущенные контейнеры нужную вам сеть Docker.
docker ps --format "table {{.Names}}\t{{.Networks}}"
Откройте браузер и перейдите по IP-адресу вашего сервера на порт 81 («http://server-ip-address:81»), где вы можете получить доступ к интерфейсу администратора NPM. Войдите, используя учётные данные по умолчанию:
Появится всплывающее окно с запросом на обновление информации о вашей учётной записи администратора. Введите своё полное имя, имя пользователя и действующий адрес электронной почты, затем нажмите кнопку «Save», чтобы подтвердить изменения.
Откроется новое окно для обновления пароля администратора. Введите «changeme» в поле «Current Password», а затем выберите и введите новый надежный пароль в следующих двух полях. Нажмите «Save», чтобы применить изменения.
Это приведёт вас на страницу пользователя, где вы увидите, что ваша учётная запись администратора была обновлена.
Мы готовы выдать действительный SSL-сертификат, чтобы наши сервисы могли безопасно подключаться по протоколу HTTPS. Просто убедитесь, что у вас есть действительная (разрешимая) DNS-запись «A», которая указывает на публичный IP-адрес сервера, на котором вы только что установили Nginx Proxy Manager.
Вы можете быстро проверить это с помощью nslookup или команды dig. Например, мы получаем SSL-сертификат для хоста «memos.tmplinux.com». Быстрая проверка подтверждает, что он указывает на правильный IP-адрес.
andreyex@destroyer: ~/npm$ nslookup memos.tmplinux.com
Выберите «SSL-Certificates» в главном меню. Затем нажмите кнопку «Add SSL Certificate», чтобы получить сертификат через веб-интерфейс Nginx Proxy Manager.
На следующем экране выполните следующие действия:
NPM быстро начнёт работать в фоновом режиме, и весь процесс настройки сертификата займёт не более 20–30 секунд.
Страница автоматически перезагрузится, и если всё пройдёт успешно, ваш новый SSL-сертификат для указанного домена будет готов.
Теперь мы подошли к самой интересной части: настройке обратного прокси-сервера с помощью Nginx Proxy Manager. Мы рассмотрим два сценария: один, в котором мы используем SSL-сертификат для безопасного HTTPS-соединения, и другой, в котором мы настраиваем обратный прокси-сервер без сертификата, используя только HTTP. Давайте начнём.
Перейдите в главное меню, выберите «Hosts», а затем в появившемся подменю выберите «Proxy Hosts».
На следующей странице нажмите кнопку «Add Proxy Host».
Этот раздел имеет решающее значение для успешной настройки обратного прокси-соединения, поэтому мы подробно описали каждый вариант ниже.
На вкладке «Details» в поле «Domain Names» введите доменное имя, для которого вы хотите создать обратный прокси-сервер в Nginx Proxy Manager. В нашем случае это имя, для которого мы только что выдали SSL-сертификат на предыдущем шаге, а именно «memos.tmplinux.com».
Раздел «Scheme» имеет решающее значение. Здесь вы можете выбрать между «http» и «https». Этот выбор указывает, прослушивает ли контейнер Docker запросы по протоколу HTTP или HTTPS. Почти во всех случаях контейнеры Docker по умолчанию не настроены на обработку HTTPS, поэтому обычно здесь нужно выбрать «http».
В поле «Forward Hostname/IP» просто введите имя службы Docker. Поскольку мы отправляем трафик как в контейнер NPM, так и в другие контейнеры Docker, чтобы они работали в одной сети Docker, Nginx Proxy Manager подключается к ним, используя имена служб.
Не знаете, как называется эта услуга? Посмотрите на изображение ниже.
В поле «Forward Port» введите номер порта контейнера Docker для приёма входящих запросов. Опять же, это не следует путать с портами 80 и 443, на которых прослушивается сам контейнер NPM.
Если вы не уверены в правильности портов, вы можете легко проверить их с помощью следующей команды:
docker ps --format "table {{.Names}}\t{{.Ports}}"
Просто чтобы прояснить ситуацию: когда вы видите, например, «1080->80», это означает, что контейнер Docker связывает свой собственный внутренний порт 80 с портом 1080 на хост-компьютере. Другими словами, порт контейнера Docker, на котором он прослушивает запросы, — 80, а не 1080.
Наконец, мы рекомендуем включить опцию “Block Common Exploits” для лучшей защиты от распространённых кибератак.
Не спешите нажимать кнопку «Save», вместо этого перейдите на вкладку «SSL». В меню «SSL Certificate» выберите сертификат Let’s Encrypt, который вы выдали недавно.
Включите эти настройки:
Наконец, нажмите “Save”, чтобы применить внесенные изменения.
Момент истины! Откройте в браузере адрес, который вы настроили в NPM. Ваше приложение должно работать по протоколу HTTPS, о чём свидетельствует значок замка в адресной строке. Что мы можем добавить, кроме как «поздравляю»?
Добавление обратного прокси-сервера в NPM на хост, который не использует SSL-сертификат, похоже на предыдущий пример, но всё, что вам нужно сделать, находится на вкладке «Details». Другими словами, вам не нужно переходить на вкладку «SSL».
Мы добавим запись для «rss.tmplinux.com», которая будет указывать на наш второй контейнер Docker. Чтобы сделать это привычным для вас способом, перейдите в главное меню и выберите «Hosts», затем «Proxy Hosts». После этого просто нажмите кнопку «Add Proxy Host».
Схема — «http», а служба Docker называется «freshrss». Контейнер использует порт 80. Заполните необходимые поля и примените внесённые вами настройки, подтвердив их кнопкой «Save».
Обратите внимание, что в отличие от нашего первого хоста «memos.tmplinux.com», для которого мы выдали и настроили использование SSL-сертификата, наш новый адрес помечен как «HTTP only».
Направляя наш браузер на этот адрес, NPM перенаправляет трафик только по незащищённому HTTP-соединению.
Важно отметить, что мы рекомендуем использовать этот вариант только в том случае, если, например, вы будете использовать сервис исключительно в пределах своей домашней сети. Однако если ваш сервис доступен через Интернет, настройте SSL-сертификат в Nginx Proxy Manager, чтобы обеспечить безопасное HTTPS-соединение.
Один из эффективных способов повысить безопасность — ограничить доступ по IP-адресам. Nginx Proxy Manager делает этот процесс невероятно быстрым и простым, требуя всего несколько кликов. Давайте разберёмся, как это работает.
Перейдите в раздел «Access Lists» и нажмите кнопку «Add Access List».
Появится модальное окно. В разделе «Details» укажите любое описательное название по вашему выбору.
Перейдите на вкладку «Access». Предположим, вы хотите ограничить доступ к диапазону IP-адресов вашей домашней сети «192.168.x.x» и конкретному общедоступному IP-адресу «1.2.3.4».
Введите соответствующие адреса для вашей ситуации, убедившись, что последняя запись — это директива «deny» с параметром «all». После завершения настройки параметров нажмите кнопку «Save», чтобы применить изменения.
Если вы впервые создаёте список доступа, он появится в верхней части списка. Если вам нужно внести изменения, не волнуйтесь — вы можете легко отредактировать его в любое время, нажав на значок с тремя точками справа и выбрав «Edit».
Теперь давайте применим список доступа к одному из наших хостов, «memos.tmplinux.com». Перейдите в раздел “Hosts” -> “Proxy Hosts”, затем нажмите на значок с тремя точками справа и выберите «Edit».
В раскрывающемся меню «Access List» выберите недавно созданный «My Access List» и нажмите «Save» для подтверждения.
Вот и всё. Теперь, если мы попытаемся получить доступ к сервису с IP-адреса, отличного от тех, которые указаны в нашем «My Access List» Nginx Proxy Manager отобразит страницу «403 Forbidden», как показано ниже.
Настройка обратного прокси-сервера с помощью Nginx Proxy Manager — это надёжное и удобное решение для управления трафиком сервера, повышения безопасности и оптимизации производительности.
Благодаря удобному пользовательскому интерфейсу NPM позволяет пользователям, даже с ограниченным опытом работы с командной строкой, настроить надёжный, производительный и безопасный обратный прокси-сервер.
Это также значительно упрощает интеграцию SSL-сертификатов и контроль доступа, устраняя большую часть сложностей, традиционно связанных с настройкой такого сервера.
Для получения дополнительной информации мы настоятельно рекомендуем ознакомиться с официальной документацией NPM или веб-сайтом проекта.
Спасибо, что уделили время! Надеюсь, это руководство было для вас полезным. Пожалуйста, напишите мне в комментариях ниже, если у вас есть какие-либо вопросы.