1. Блог
  2. Мануали

Nginx Proxy Manager: встановлення, проксі-хости та SSL

Nginx Proxy Manager: встановлення, проксі-хости та SSL

Nginx Proxy Manager (NPM) — вебінтерфейс для зворотного проксі на базі Nginx. Він дає змогу публікувати сервіси на власних доменах і випускати SSL-сертифікати Let’s Encrypt у кілька клацань, без ручного редагування конфігурації. Це найпростіший спосіб дати нормальні адреси з HTTPS застосункам, запущеним у Docker.

Що знадобиться

Встановлення

mkdir -p ~/npm && cd ~/npm

Створіть файл docker-compose.yml:

services:
  npm:
    image: jc21/nginx-proxy-manager:latest
    container_name: npm
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "81:81"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    networks:
      - proxy

networks:
  proxy:
    name: proxy

Запустіть контейнер:

docker compose up -d

Порти 80 і 443 приймають трафік сайтів, порт 81 — панель керування. Каталоги data і letsencrypt зберігають налаштування та сертифікати: саме їх потрібно включати в резервні копії.

Перший вхід

Відкрийте http://IP-сервера:81. Актуальні версії під час першого запуску пропонують створити обліковий запис адміністратора. У старих версіях використовувалися стандартні дані admin@example.com і changeme, які панель вимагала змінити одразу після входу.

Додавання проксі-хоста

Припустімо, на сервері працює застосунок на порту 8080, і його потрібно відкрити за адресою app.example.com.

  1. Відкрийте Hosts → Proxy Hosts і натисніть Add Proxy Host.
  2. На вкладці Details заповніть:
    • Domain Names — app.example.com;
    • Scheme — http (протокол, за яким працює сам застосунок);
    • Forward Hostname / IP — адреса застосунку;
    • Forward Port — 8080.
  3. Увімкніть Block Common Exploits. Якщо застосунок використовує WebSocket, увімкніть Websockets Support.
  4. Перейдіть на вкладку SSL, оберіть Request a new SSL Certificate, увімкніть Force SSL і HTTP/2 Support, прийміть умови Let’s Encrypt.
  5. Натисніть Save.

За кілька секунд застосунок буде доступний за адресою https://app.example.com.

Яку адресу вказувати у Forward Hostname

Це найчастіше джерело помилок.

  • Застосунок у Docker на тому самому сервері. Підключіть його контейнер до мережі proxy і вкажіть ім’я контейнера. Публікувати порт назовні при цьому не потрібно:
services:
  app:
    image: nginx:alpine
    container_name: app
    networks:
      - proxy

networks:
  proxy:
    external: true

У NPM вкажіть app і порт, який слухає застосунок усередині контейнера.

  • Застосунок встановлено безпосередньо на сервері. Адреса 127.0.0.1 не підійде: усередині контейнера вона вказує на сам контейнер NPM. Використовуйте IP-адресу сервера в мережі Docker (зазвичай 172.17.0.1) або його зовнішню адресу.
  • Застосунок на іншому сервері. Вкажіть його IP-адресу й переконайтеся, що порт доступний для сервера з NPM.

Wildcard-сертифікат

Сертифікат для всіх піддоменів випускається з перевіркою через DNS. Відкрийте SSL Certificates → Add SSL Certificate → Let’s Encrypt, вкажіть *.example.com і example.com, увімкніть Use a DNS Challenge, оберіть свого DNS-провайдера та вставте токен API. Готовий сертифікат потім обирається в налаштуваннях будь-якого проксі-хоста.

Обмеження доступу

Списки доступу закривають сервіс паролем або дозволяють вхід лише з певних адрес.

  1. Відкрийте Access Lists → Add Access List.
  2. На вкладці Authorization додайте логін і пароль, на вкладці Access — дозволені IP-адреси.
  3. У налаштуваннях проксі-хоста оберіть створений список у полі Access List.

Так зручно захищати внутрішні панелі, які не мають власної авторизації.

Інші можливості

  • Redirection Hosts — перенаправлення одного домену на інший, наприклад із www на основну адресу.
  • Streams — прокидання TCP- і UDP-портів для сервісів, які працюють не через HTTP.
  • Custom locations — різні застосунки на різних шляхах одного домену.
  • Advanced — довільні директиви Nginx для конкретного хоста.

Захист панелі керування

Панель на порту 81 типово відкрита всьому інтернету й працює без шифрування. Виправте це одразу після налаштування.

Найпростіший варіант — опублікувати порт лише на локальній адресі:

      - "127.0.0.1:81:81"

і підключатися до панелі через SSH-тунель:

ssh -L 8081:127.0.0.1:81 root@203.0.113.10

Поки з’єднання відкрите, панель доступна за адресою http://localhost:8081. Інший варіант — створити проксі-хост для самої панелі (npm, порт 81) із SSL-сертифікатом і списком доступу, після чого прибрати публікацію порту 81.

Оновлення

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

Перед оновленням зробіть копію каталогів data і letsencrypt та прочитайте примітки до випуску: в окремих версіях змінюється робота DNS-плагінів для випуску сертифікатів.

Часті проблеми

  • 502 Bad Gateway — NPM не може достукатися до застосунку: перевірте адресу, порт і спільну мережу Docker.
  • Сертифікат не випускається — домен не вказує на сервер або порт 80 закрито файрволом.
  • Нескінченне перенаправлення — застосунок сам перенаправляє на HTTPS, а в полі Scheme вказано http. Змініть схему на https або вимкніть перенаправлення в застосунку.
  • Порт 80 зайнятий — на сервері вже працює інший вебсервер: sudo ss -tlnp | grep ':80 '.

NPM чи ручне налаштування

Nginx Proxy Manager зручний, коли сервісів небагато й хочеться керувати ними через інтерфейс. Якщо конфігурацію потрібно зберігати в Git і описувати поруч із сервісами, подивіться Traefik; якщо потрібен повний контроль над Nginx — ручне налаштування віртуальних хостів.

#nginx proxy manager#nginx#reverse proxy#ssl#docker

Ця стаття іншими мовами:EnglishРусский