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

Nginx Proxy Manager (NPM) — вебінтерфейс для зворотного проксі на базі Nginx. Він дає змогу публікувати сервіси на власних доменах і випускати SSL-сертифікати Let’s Encrypt у кілька клацань, без ручного редагування конфігурації. Це найпростіший спосіб дати нормальні адреси з HTTPS застосункам, запущеним у Docker.
Що знадобиться
- VPS з Docker і Docker Compose — див. інструкцію зі встановлення;
- вільні порти 80 і 443;
- домени, A-записи яких вказують на IP-адресу сервера.
Встановлення
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.
- Відкрийте Hosts → Proxy Hosts і натисніть Add Proxy Host.
- На вкладці Details заповніть:
- Domain Names —
app.example.com; - Scheme —
http(протокол, за яким працює сам застосунок); - Forward Hostname / IP — адреса застосунку;
- Forward Port —
8080.
- Domain Names —
- Увімкніть Block Common Exploits. Якщо застосунок використовує WebSocket, увімкніть Websockets Support.
- Перейдіть на вкладку SSL, оберіть Request a new SSL Certificate, увімкніть Force SSL і HTTP/2 Support, прийміть умови Let’s Encrypt.
- Натисніть 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. Готовий сертифікат потім обирається в налаштуваннях будь-якого проксі-хоста.
Обмеження доступу
Списки доступу закривають сервіс паролем або дозволяють вхід лише з певних адрес.
- Відкрийте Access Lists → Add Access List.
- На вкладці Authorization додайте логін і пароль, на вкладці Access — дозволені IP-адреси.
- У налаштуваннях проксі-хоста оберіть створений список у полі 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 — ручне налаштування віртуальних хостів.


