Nginx Proxy Manager: несколько сервисов на одном сервере

Nginx Proxy Manager — это Nginx с веб-панелью: вы указываете домен и адрес сервиса, а он сам настраивает обратный прокси и получает бесплатный SSL-сертификат Let’s Encrypt. Так на одном сервере с одним IP живут сразу несколько сайтов и сервисов, каждый на своём поддомене, и никто не пишет конфиги Nginx руками. Разберём установку Nginx Proxy Manager через Docker Compose, первый вход, добавление прокси-хоста и сертификата и частые ошибки. Все команды и выводы ниже — с тестового запуска версии 2.16.0 26 сентября 2026 года.

Список Proxy Hosts в Nginx Proxy Manager: два сервиса на одном сервере
Два сервиса за одним Nginx Proxy Manager: каждый домен ведёт в свой контейнер

Обратный прокси: что это и зачем он нужен

Порты 80 и 443 на сервере одни. Если на нём работают сайт, мониторинг и фотоархив, наружу их можно выставить только через один веб-сервер, который смотрит на имя домена в запросе и передаёт запрос нужному сервису. Это и есть обратный прокси сервер, по-английски reverse proxy. Nginx — самый популярный вариант, и Nginx Proxy Manager как раз даёт настроить nginx reverse proxy без правки конфигов:

  • status.example.com → контейнер мониторинга на порту 3001;
  • photo.example.com → фотоархив на порту 2283;
  • example.com → сайт.

Заодно прокси берёт на себя HTTPS: сертификат нужен только ему, а сами сервисы внутри сервера работают по обычному HTTP. В чистом Nginx это десяток строк конфига на каждый сервис плюс certbot. В Nginx Proxy Manager — форма из трёх полей.

Что нужно заранее

  • Сервер с Linux и Docker — VPS или домашний. Сам Nginx Proxy Manager лёгкий: в нашем тесте контейнер занимал около 87 МБ памяти. Как подготовить VPS — в статье настройка VPS: SSH-ключ, ufw и fail2ban.
  • Docker и Docker Compose — установка описана в статье Docker Compose для начинающих.
  • Домен с A-записями на IP сервера: для каждого поддомена своя запись или одна wildcard-запись *.example.com. Как их добавить — в статье DNS-записи домена.
  • Свободные порты 80 и 443. Если на сервере уже стоит Nginx или Apache, их придётся остановить — порты займёт Nginx Proxy Manager.

Установка Nginx Proxy Manager в Docker Compose

Официальная инструкция — один файл docker-compose.yml. Мы сделали в нём три изменения: наш часовой пояс, закрытую снаружи панель и общую Docker-сеть для сервисов (о ней ниже).

sudo mkdir -p /srv/npm && cd /srv/npm
docker network create proxy
nano docker-compose.yml
services:
  app:
    image: 'jc21/nginx-proxy-manager:2.16.0'
    restart: unless-stopped
    ports:
      - '80:80'
      - '443:443'
      - '127.0.0.1:81:81'   # панель только с самого сервера
    environment:
      TZ: "Europe/Moscow"
      DISABLE_IPV6: 'true'  # только если на сервере нет IPv6
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

networks:
  default:
    external: true
    name: proxy
docker compose up -d
docker compose ps
NAME        IMAGE                             COMMAND   SERVICE   CREATED          STATUS          PORTS
npm-app-1   jc21/nginx-proxy-manager:2.16.0   "/init"   app       43 seconds ago   Up 40 seconds   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 127.0.0.1:81->81/tcp

Настройки, база SQLite и сертификаты лежат в папках data и letsencrypt рядом с файлом — их и нужно копировать в резервную копию. Версию лучше указывать явно, а не latest: так обновление произойдёт тогда, когда вы решите.

Порт 81: панель управления

В официальном примере он открыт всему интернету, а Docker обходит правила ufw. Мы привязали панель к 127.0.0.1 и заходим в неё через SSH-туннель:

ssh -L 8181:127.0.0.1:81 user@ip-сервера
# затем в браузере: http://127.0.0.1:8181

Для домашнего сервера вместо 127.0.0.1 можно указать его адрес в локальной сети, например 192.168.1.10:81:81.

Первый вход: логин и пароль

Во многих старых инструкциях написано, что вход — admin@example.com с паролем changeme. В актуальных версиях это не так: при первом открытии панели Nginx Proxy Manager сразу просит создать учётную запись администратора — имя, почту и пароль. Проверить, что начальная настройка ещё не пройдена, можно через API:

curl -s http://127.0.0.1:81/api/
{"status":"OK","setup":false,"version":{"major":2,"minor":16,"revision":0}}

"setup":false означает, что администратора ещё нет. Не оставляйте панель в таком виде открытой в интернет: первый, кто её откроет, и станет админом. Интерфейс по умолчанию английский, язык переключается значком глобуса в правом верхнем углу.

Настройка Nginx Proxy Manager: добавляем прокси-хост

Для примера поднимем рядом два сервиса — Uptime Kuma и тестовый whoami, который просто показывает пришедший запрос. Главное — та же сеть proxy, а портов наружу нет вообще:

services:
  whoami:
    image: traefik/whoami:v1.11
    restart: unless-stopped
  kuma:
    image: louislam/uptime-kuma:1
    restart: unless-stopped
    volumes:
      - ./kuma:/app/data

networks:
  default:
    external: true
    name: proxy

Внутри общей Docker-сети контейнеры находят друг друга по имени сервиса, поэтому в Nginx Proxy Manager адрес указывается как kuma, а не IP. Этот приём советуют и сами разработчики в расширенной настройке: сервисам не нужно публиковать порты, и мимо прокси до них не достучаться.

Дальше в панели: Hosts → Proxy Hosts → Add Proxy Host.

Окно Add Proxy Host в Nginx Proxy Manager
Окно добавления прокси-хоста: домен, куда пересылать и опции
ПолеЧто указать
Domain NamesДомен или поддомен: status.example.com
Schemehttp — внутри сервера шифрование не нужно
Forward Hostname / IPИмя контейнера (kuma) или IP, если сервис не в Docker
Forward PortПорт внутри контейнера: у Uptime Kuma 3001
Block Common ExploitsВключить: отсекает часть типовых атак
Websockets SupportВключить, если сервис работает «вживую» — Uptime Kuma, Home Assistant, чаты

Сохраняем — и хост сразу работает. Проверка с самого сервера, без DNS, через подмену заголовка Host:

curl -s -H 'Host: whoami.example.com' http://127.0.0.1/
Hostname: dfcbca021729
IP: 127.0.0.1
IP: 172.19.0.3
RemoteAddr: 172.19.0.2:53726
GET / HTTP/1.1
Host: whoami.example.com
User-Agent: curl/8.5.0
Accept: */*
X-Forwarded-For: 172.19.0.1
X-Forwarded-Proto: http
X-Forwarded-Scheme: http
X-Real-Ip: 172.19.0.1

Видно, что запрос пришёл в контейнер whoami через прокси (RemoteAddr — адрес Nginx Proxy Manager в сети Docker), а настоящий адрес клиента передан в заголовках X-Forwarded-For и X-Real-Ip. На запрос с неизвестным доменом Nginx Proxy Manager отдаёт свою заглушку «Congratulations!» — её можно заменить на 404 или редирект в Settings → Default Site.

SSL в Nginx Proxy Manager: сертификат Let’s Encrypt

На вкладке SSL того же окна выберите Request a new Certificate и включите Force SSL — тогда все HTTP-запросы будут перенаправляться на HTTPS. Сертификат выпускается за несколько секунд и продлевается сам: Nginx Proxy Manager проверяет сертификаты с истекающим сроком (в логе при старте видно Renewing SSL certs expiring within 30 days).

Чтобы Let’s Encrypt выдал сертификат, должны выполняться два условия:

  • A-запись домена уже указывает на IP сервера (после изменения DNS может понадобиться подождать);
  • порт 80 доступен из интернета — через него Let’s Encrypt проверяет, что домен ваш.

Если порт 80 закрыт (частая история с домашним интернетом) или нужен wildcard-сертификат на *.example.com, используйте проверку через DNS: Nginx Proxy Manager сам ставит плагин certbot для вашего DNS-провайдера и создаёт проверочную TXT-запись через его API. Список провайдеров и оговорки — на странице Certbot в документации. Что вообще такое бесплатный сертификат и чем он отличается от платного — в статье бесплатный SSL-сертификат.

Что ещё умеет Nginx Proxy Manager

  • Redirection Hosts — перенаправление домена целиком, например www.example.com → example.com.
  • Streams — проброс TCP/UDP-портов, не HTTP: например, для игрового сервера. Порты для них нужно добавить в ports в docker-compose.yml.
  • 404 Hosts — домен, который всегда отвечает «не найдено».
  • Access Lists — доступ по паролю или только с определённых IP. Удобно для панелей, которым незачем быть публичными.
  • Custom Locations и вкладка с шестерёнкой — свои куски конфига Nginx для тех, кому формы мало.
  • Users и Audit Logs — несколько администраторов с разными правами и журнал их действий.

Как обновить Nginx Proxy Manager

Меняете версию в image: на новую и выполняете:

cd /srv/npm
docker compose pull
docker compose up -d

Базу Nginx Proxy Manager обновляет сам. Перед обновлением прочитайте заметки к новой версии: например, начиная с 2.14 не поддерживаются 32-битные ARM (armv7) — для старых Raspberry Pi остаётся только 2.13.7.

Частые ошибки

  • Контейнер запущен, но панель не открывается, в логе по кругу nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol). Мы поймали это на тестовом сервере без IPv6: Nginx пытается слушать IPv6-адрес. Помогает переменная DISABLE_IPV6: 'true' и docker compose up -d --force-recreate.
  • Порт 80 или 443 уже занят. docker compose up завершится ошибкой address already in use. Посмотреть, кто занял: sudo ss -tlnp | grep -E ':80|:443'.
  • 502 Bad Gateway. Прокси не может достучаться до сервиса: контейнер не в той же Docker-сети, неверное имя или указан внешний порт вместо внутреннего. Проверьте docker network inspect proxy. Как читать лог при 502 — в статье ошибка 500 и 502 Bad Gateway.
  • Сертификат не выпускается. Домен ещё не указывает на сервер, закрыт порт 80 или провайдер режет входящие соединения. Узнать, куда смотрит домен, — в статье как узнать IP сайта.
  • Не входит в панель после включения Access List с паролем. Это описано в FAQ: два входа по паролю (Access List и сам сервис) конфликтуют в заголовке Authorization. Оставьте один из них.
  • Сервисы опубликованы и напрямую. Если у контейнера остался ports: - 3001:3001, он доступен в обход прокси и без HTTPS. Уберите ports или привяжите к 127.0.0.1.

Пример сервиса, который удобно открыть наружу через Nginx Proxy Manager, — чат с локальной нейросетью Open WebUI.

Документация: руководство Nginx Proxy Manager, установка, расширенная настройка, обновление, образ на Docker Hub, типы проверок Let’s Encrypt. Проверено 26 сентября 2026 года.

1 / 1
Оцените статью
Да будет Интернет!