Nginx Proxy Manager: Конфигурация для популярных веб-интерфейсов

🎯 Введение

Если вы устали запоминать порты типа 8006, 8443, 8080 и 9443 — эта статья для вас. Nginx Proxy Manager (NPM) превратит вашу коллекцию веб-интерфейсов в аккуратный список красивых доменных имён с автоматическим SSL.

Что вы получите после настройки:

  • Все сервисы по доменным именам: pve.domain.com, cloud.domain.com, nas.domain.com
  • Автоматическое обновление SSL сертификатов Let’s Encrypt
  • Единая точка входа с возможностью добавления SSO (Authelia/Authentik)
  • Защита от распространённых атак “из коробки”
  • Простой и понятный веб-интерфейс для управления

⚙️ Установка Nginx Proxy Manager

Рекомендуем использовать Docker-версию — она проще в обновлении и управлении.

# docker-compose.yml для NPM
version: ‘3.8’
services:
app:
image: ‘jc21/nginx-proxy-manager:latest’
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
– ’80:80′ # HTTP трафик
– ’81:81′ # Админка NPM
– ‘443:443’ # HTTPS трафик
volumes:
– ./data:/data
– ./letsencrypt:/etc/letsencrypt
networks:
– proxy-networknetworks:
proxy-network:
driver: bridge

Первые шаги:

  1. Создайте папку для NPM: mkdir nginx-proxy-manager && cd nginx-proxy-manager
  2. Создайте файл docker-compose.yml с содержимым выше
  3. Запустите: docker-compose up -d
  4. Откройте браузер: http://ваш-сервер:81
  5. Логин по умолчанию: admin@example.com / changeme

⚠️ Важно!

Сразу после первого входа смените пароль администратора. Если ваш сервер доступен из интернета, ограничьте доступ к порту 81 только с доверенных IP-адресов.

Proxmox VE (порт 8006)

⚡ Особенности:

  • Использует порт 8006 (HTTPS)
  • Требует WebSocket для консоли виртуальных машин
  • Самоподписанный сертификат по умолчанию
  • Специфичные заголовки для авторизации

Настройка в NPM:

  1. Добавляем новый Proxy Host
  2. Domain Names: pve.yourdomain.com
  3. Scheme: https
  4. Forward Hostname/IP: IP вашего Proxmox сервера
  5. Forward Port: 8006
  6. Включаем: WebSocket Support, Block Common Exploits
  7. SSL: Let’s Encrypt

Кастомная конфигурация Nginx (Advanced tab):

# Отключаем проверку SSL для самоподписанного сертификата Proxmox
proxy_ssl_verify off;# Критические заголовки для Proxmox
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port 443;# Таймауты для консоли виртуальных машин
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;# Отключаем буферизацию для консоли
proxy_buffering off;

# Размер загружаемых файлов (для ISO и т.д.)
client_max_body_size 50G;

✅ Проверка:

После сохранения откройте https://pve.yourdomain.com. Должна появиться страница входа Proxmox. Зайдите и проверьте, что консоли виртуальных машин работают корректно.

Zimbra Collaboration

Zimbra имеет два основных интерфейса: веб-клиент (порт 8443) и админка (порт 7071).

# Порта Zimbra:
# 7071 – Админка Zimbra (zmi)
# 8443 – Веб-клиент (HTTPS)
# 8080 – Веб-клиент (HTTP, редирект)
# 7073 – Почтовый прокси

Для веб-клиента (пользователи):

  1. Domain Names: mail.yourdomain.com
  2. Scheme: https
  3. Forward Hostname/IP: IP Zimbra сервера
  4. Forward Port: 8443
  5. Включаем: Block Common Exploits

Кастомная конфигурация:

# Zimbra чувствителен к заголовкам
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port 443;# Для корректной работы загрузки файлов
client_max_body_size 1024M;# Zimbra любит долгие соединения
proxy_read_timeout 300s;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;# Отключаем компрессию для некоторых запросов
proxy_set_header Accept-Encoding “”;

Для админки Zimbra:

Создайте отдельный Proxy Host для zimbra-admin.yourdomain.com на порт 7071.

MailCow Dockerized

📌 Важно для MailCow:

  • MailCow слушает на 127.0.0.1:80/443 внутри контейнера
  • Нужно пробросить порты наружу или использовать Docker сеть
  • Требует корректные заголовки X-Forwarded-*

Способ 1: Через Docker сеть (рекомендуется)

# 1. Создаем общую сеть
docker network create proxy-network# 2. Подключаем NPM к этой сети
# В docker-compose.yml NPM добавляем:
networks:
default:
name: proxy-network# 3. Подключаем MailCow к этой же сети
# В docker-compose.yml MailCow:
networks:
default:
name: proxy-network
# И убираем ВСЕ ports секции из MailCow

Теперь в NPM указываем:

  • Forward Hostname/IP: nginx-mailcow (имя контейнера nginx в MailCow)
  • Forward Port: 80
  • Scheme: http

Кастомная конфигурация для MailCow:

# MailCow требует CSRF корректную настройку
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;# Для WebSocket
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;# Отключаем буферизацию для реального времени
proxy_buffering off;

Proxmox Backup Server (порт 8007)

PBS очень похож на Proxmox VE, но имеет свои особенности для работы с большими бэкапами.

# Настройка в NPM:
# Domain Names: pbs.yourdomain.com
# Scheme: https
# Forward Hostname/IP: IP PBS сервера
# Forward Port: 8007
# WebSocket Support: ВКЛ
# Block Common Exploits: ВКЛ

Кастомная конфигурация:

# Аналогично Proxmox VE, но с дополнениями
proxy_ssl_verify off;proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;# PBS требует эти заголовки для API
proxy_set_header X-Forwarded-Port 443;
proxy_set_header X-Forwarded-Host $host;# Для больших бэкапов
client_max_body_size 0; # Без ограничений
proxy_read_timeout 86400s; # 24 часа для больших задач
proxy_send_timeout 86400s;

# Отключаем компрессию для бинарных данных
proxy_set_header Accept-Encoding “”;

Pi-hole (порт 80)

🎯 Особенности:

  • Работает на HTTP (порт 80)
  • Требует WebSocket для live-статистики
  • Простая настройка, но важно location /ws

Настройка в NPM:

  1. Domain Names: pihole.yourdomain.com
  2. Scheme: http
  3. Forward Hostname/IP: IP сервера с Pi-hole
  4. Forward Port: 80
  5. WebSocket Support: Обязательно ВКЛ
  6. Block Common Exploits: ВКЛ
  7. SSL: Let’s Encrypt

Кастомная конфигурация:

# Pi-hole WebSocket для live данных
location / {
proxy_pass http://pihole:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}# Отдельно для WebSocket
location /ws {
proxy_pass http://pihole:80;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;
proxy_set_header Host $host;
}# Кэширование статики
location /admin/img/ {
expires 30d;
add_header Cache-Control “public, immutable”;
}# Заголовки безопасности
add_header X-Frame-Options “SAMEORIGIN” always;
add_header X-Content-Type-Options “nosniff” always;
add_header X-XSS-Protection “1; mode=block” always;

Nextcloud (порт 80/443 в Docker)

📌 Особенности Nextcloud:

  • Множество под-путей: /.well-known/, /remote.php/, /ocs/
  • WebDAV на стандартных портах
  • WebSocket для реальных уведомлений и Talk
  • Строгие требования к заголовкам
  • Большие файлы требуют корректной настройки лимитов

Настройка в NPM для Docker-версии:

  1. Domain Names: cloud.yourdomain.com
  2. Scheme: http (SSL терминация на NPM)
  3. Forward Hostname/IP: nextcloud-app (имя контейнера)
  4. Forward Port: 80
  5. Включаем: WebSocket Support, Block Common Exploits
  6. SSL: Let’s Encrypt

Кастомная конфигурация Nginx (обязательно!):

# Базовые заголовки
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;# Критически важные заголовки для Nextcloud
proxy_set_header X-Forwarded-Port 443;
add_header Referrer-Policy “no-referrer” always;
add_header X-Content-Type-Options “nosniff” always;
add_header X-Download-Options “noopen” always;
add_header X-Frame-Options “SAMEORIGIN” always;
add_header X-Permitted-Cross-Domain-Policies “none” always;
add_header X-Robots-Tag “none” always;
add_header X-XSS-Protection “1; mode=block” always;# Для больших файлов
client_max_body_size 10G;
proxy_request_buffering off;# Долгие таймауты
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;

# WebSocket для Nextcloud Talk
location /push/ {
proxy_pass http://nextcloud-app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “Upgrade”;
}

# WebDAV отдельно
location /remote.php/dav/ {
proxy_pass http://nextcloud-app;
client_max_body_size 10G;
proxy_read_timeout 3600s;
}

Настройка в Nextcloud config.php:

// В config/config.php добавляем:
‘overwriteprotocol’ => ‘https’,
‘overwritehost’ => ‘cloud.yourdomain.com’,
‘overwritewebroot’ => ‘/’,
‘trusted_proxies’ => [‘192.168.1.10’], // IP вашего NPM
‘forwarded_for_headers’ => [‘HTTP_X_FORWARDED_FOR’],
‘upload_max_filesize’ => ’10G’,
‘post_max_size’ => ’10G’,

OpenMediaVault (порт 80)

⚙️ Особенности OMV:

  • Работает на стандартном порту 80 (HTTP)
  • Использует Basic Auth и сессии
  • WebSocket для уведомлений в реальном времени
  • Может конфликтовать с другими веб-серверами на том же хосте

Настройка в NPM:

  1. Domain Names: nas.yourdomain.com
  2. Scheme: http
  3. Forward Hostname/IP: IP вашего сервера OMV
  4. Forward Port: 80 (или 8080 если изменён)
  5. Включаем: WebSocket Support, Block Common Exploits
  6. SSL: Let’s Encrypt

Кастомная конфигурация Nginx:

# Базовые настройки прокси
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;# OMV требует точный Host заголовок
proxy_set_header Host $http_host;# WebSocket для уведомлений OMV
location /ws {
proxy_pass http://omv-server:80;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;# Таймауты для долгих подключений
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}

# Защитные заголовки
add_header X-Frame-Options “SAMEORIGIN” always;
add_header X-Content-Type-Options “nosniff” always;
add_header X-XSS-Protection “1; mode=block” always;

⚠️ Конфликт портов:

Если на сервере уже работает nginx/apache, OMV может не запуститься на порту 80. Используйте порт 8080:

# В /etc/default/openmediavault
OMV_WEBGUI_PORT=”8080″
# Затем перезапустить:
sudo systemctl restart nginx
sudo systemctl restart php-fpm

📊 Сравнительная таблица настроек

Сервис Домен Порт WebSocket Особые настройки Проверка
Proxmox VE pve.* 8006 Да proxy_ssl_verify off Консоль VM работает
Zimbra mail.* 8443 Нет client_max_body_size 1G Вложение 100MB+
MailCow mail.* 80 (cont) Да X-Forwarded-Host Почта отправляется
Proxmox Backup pbs.* 8007 Да client_max_body_size 0 Бэкап запускается
Pi-hole pihole.* 80 Да location /ws Live stats работают
Nextcloud cloud.* 80 (cont) Да (/push/) client_max_body_size 10G, trusted_proxies Talk, WebDAV
OpenMediaVault nas.* 80 или 8080 Да (/ws) proxy_set_header Host $http_host Уведомления real-time

🚀 Продвинутые настройки

А. Единый вход (SSO) с Authelia

# Для каждого хоста в Advanced → Custom Locations
location / {
# Прокси в Authelia для проверки аутентификации
set $upstream_authelia http://authelia:9091/api/verify;# Проверяем аутентификацию
auth_request $upstream_authelia;
auth_request_set $user $upstream_http_remote_user;
proxy_set_header Remote-User $user;# Если не аутентифицирован — редирект в Authelia
error_page 401 =302 https://auth.yourdomain.com;# Прокси к целевому сервису
proxy_pass http://целевой-сервис:порт;
}

Б. Гео-блокировка и ограничение доступа

# Разрешаем только из локальной сети
allow 192.168.1.0/24;
allow 10.0.0.0/8;
deny all;# Basic Auth как дополнительная защита
auth_basic “Admin Area”;
auth_basic_user_file /etc/nginx/.htpasswd;

В. Docker Compose для всей инфраструктуры

version: ‘3.8’
networks:
proxy-net:
name: proxy-network
driver: bridgeservices:
npm:
image: jc21/nginx-proxy-manager:latest
container_name: nginx-proxy-manager
ports: [“80:80”, “443:443”, “81:81”]
volumes: [“./npm/data:/data”, “./npm/letsencrypt:/etc/letsencrypt”]
networks: [proxy-net]nextcloud:
image: nextcloud:latest
container_name: nextcloud-app
volumes: [“./nextcloud/html:/var/www/html”, “./nextcloud/data:/var/www/html/data”]
networks: [proxy-net]pihole:
image: pihole/pihole:latest
container_name: pihole
environment: [TZ=Europe/Moscow, WEBPASSWORD=ваш_пароль]
networks: [proxy-net]
dns: [127.0.0.1, 8.8.8.8]

🔧 Решение типичных проблем

# 1. “Invalid CSRF token” в MailCow/Zimbra
# Решение: Добавить правильные proxy_set_header
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port 443;# 2. Не работают консоли в Proxmox
# Решение: Проверить WebSocket, увеличить таймауты
proxy_read_timeout 3600s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;# 3. Ошибка 413 Request Entity Too Large
# Решение:
client_max_body_size 1024M; # или 0 для безлимита# 4. Nextcloud показывает “Доступ запрещён”
# Решение: Настроить trusted_proxies в config.php
‘trusted_proxies’ => [‘nginx-proxy-manager’],
‘overwriteprotocol’ => ‘https’,

# 5. OMV не отображает реальные IP пользователей
# Решение:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Диагностические команды:

# Проверить конфигурацию NPM
docker exec nginx-proxy-manager nginx -t# Посмотреть логи
docker logs –tail 50 nginx-proxy-manager# Проверить SSL сертификаты
openssl s_client -connect mail.yourdomain.com:443 -servername mail.yourdomain.com# Проверить WebSocket
curl -i -H “Connection: Upgrade” -H “Upgrade: websocket” \
-H “Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==” \
-H “Sec-WebSocket-Version: 13” \
https://pve.yourdomain.com

🏁 Итог

✅ Итоговый чеклист

  • Все сервисы доступны по своим доменным именам
  • SSL сертификаты действительны и не истекли
  • WebSocket соединения работают (консоли, live-статистика)
  • Загрузка больших файлов работает в Nextcloud и Zimbra
  • Нет ошибок CSRF в формах
  • Реальные IP пользователей отображаются в логах
  • Бэкап конфигурации NPM настроен

Итоговый результат: Вместо запоминания портов и IP-адресов вы получаете аккуратный список: https://pve.domain.com, https://cloud.domain.com, https://nas.domain.com. Все с валидными SSL-сертификатами, защищённые и удобные.

🎯 Ключевые преимущества Nginx Proxy Manager:

  • Простота: Веб-интерфейс вместо правки конфигов вручную
  • Автоматизация: Let’s Encrypt SSL без скриптов
  • Безопасность: Встроенная защита от распространённых атак
  • Гибкость: Кастомные настройки nginx для особых случаев
  • Мониторинг: Доступ к логам и статистике

Nginx Proxy Manager делает рутинную работу за вас, позволяя сосредоточиться на настройке и использовании сервисов, а не на инфраструктуре доступа к ним.

© 2024 Полное руководство по Nginx Proxy Manager. Для системных администраторов и DevOps инженеров.

Статья обновлена: Декабрь 2024 | Теги: #Nginx #Proxy #Docker #SelfHosted #DevOps

Оставьте комментарий