Как установить и использовать Nginx Proxy Manager с Docker
На этой странице
- Предпосылки
- Шаг 1. Настройка брандмауэра
- Cent OS/Rocky Linux/Alma Linux
- Убунту/Дебиан
- Cent OS/Rocky Linux/Alma Linux
- Убунту
- Дебиан
- Настройка Ghost в Nginx Proxy Manager
- Другое использование Nginx Proxy Manager
- Используйте Nginx Proxy Manager для размещения статического веб-сайта.
- Использовать функцию управления доступом Nginx Proxy Managers
- Включить поддержку дополнительных доменных имен
- Перенаправить целевую страницу по умолчанию
Обратный прокси — это веб-сервер, который может располагаться перед другим веб-сервером или веб-службой. Он может шифровать исходящий трафик, действовать как балансировщик нагрузки, перенаправлять трафик и предлагать защиту. Веб-сервер Nginx можно использовать в качестве прокси-сервера перед традиционными серверами, но иногда его настройка может быть утомительной и вызывать проблемы, если она не выполнена должным образом.
Nginx Proxy Manager — это приложение, которое упрощает настройку Nginx в качестве прокси-сервера, предоставляя графический пользовательский интерфейс (GUI) с такими функциями, как встроенная поддержка SSL с использованием Lets Encrypt, поддержка нескольких хостов, HTTP-аутентификация, списки доступа и пользовательские управление.
В этом руководстве вы узнаете, как установить прокси-менеджер Nginx на сервер Linux с помощью Docker. Мы рассмотрим все популярные дистрибутивы Linux в одном руководстве.
Предпосылки
- Сервер Linux под управлением Ubuntu/Debian/CentOS/Alma Linux/Rocky Linux с минимум 1 ГБ оперативной памяти.
- Пользователь без полномочий root с привилегиями sudo.
- Полное доменное имя (FQDN), например
npm.example.com
, указывающее на сервер.
Шаг 1. Настройте брандмауэр
ОС Cent/Rocky Linux/Alma Linux
У вас должен быть установлен брандмауэр Firewalld. Проверьте состояние брандмауэров.
$ sudo firewall-cmd --state running
Откройте порты 80, 81 и 443.
$ sudo firewall-cmd --permanent --add-service=http $ sudo firewall-cmd --permanent --add-service=https $ sudo firewall-cmd --permanent --add-port=81/tcp
Перезагрузите брандмауэр, чтобы изменения вступили в силу.
$ sudo firewall-cmd --reload
Убунту/Дебиан
Системы Ubuntu и Debian по умолчанию используют ufw (несложный брандмауэр).
Проверьте, работает ли брандмауэр.
$ sudo ufw status
Если он запущен, то откройте порты 80, 81 и 443.
$ sudo ufw allow 80 $ sudo ufw allow 81 $ sudo ufw allow 443
Откройте порт SSH, если брандмауэр не работает.
$ sudo ufw allow "OpenSSH"
Включите брандмауэр, если он не запущен.
$ sudo ufw enable
Если он запущен, перезагрузите его, чтобы применить изменения.
$ sudo ufw reload
Шаг 2 — Установите Докер
ОС Cent/Rocky Linux/Alma Linux
Выполните следующую команду, чтобы установить Docker.
$ sudo yum install -y yum-utils $ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo $ sudo yum install docker-ce docker-ce-cli containerd.io
Убунту
$ sudo apt install ca-certificates curl gnupg lsb-release $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg $ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null $ sudo apt update $ sudo apt install docker-ce docker-ce-cli containerd.io
Дебиан
$ sudo apt install ca-certificates curl gnupg lsb-release $ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg $ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null $ sudo apt update $ sudo apt install docker-ce docker-ce-cli containerd.io
Включите и запустите службу Docker.
$ sudo systemctl start docker --now
Добавьте свое имя пользователя в группу Docker.
$ sudo usermod -aG docker $USER
Выйдите из системы и войдите снова, чтобы применить изменения.
Шаг 3 — Установите Docker Compose
Скачайте и установите двоичный файл Docker compose.
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Применить разрешение на выполнение к двоичному файлу.
$ sudo chmod +x /usr/local/bin/docker-compose
Шаг 4 — Создайте файл Docker Compose
Создайте каталог для прокси-менеджера Nginx.
$ mkdir ~/nginx-proxy
Перейдите в каталог.
$ cd ~/nginx-proxy
Создайте каталоги для пользовательских данных и SSL-сертификатов.
$ mkdir {data,letsencrypt}
Создайте и откройте файл
docker-compose.yml
для редактирования.$ nano docker-compose.yml
Вставьте в него следующий код.
version: "3" services: npm-app: image: 'jc21/nginx-proxy-manager:latest' container_name: npm-app restart: unless-stopped ports: - '80:80' # Public HTTP Port - '443:443' # Public HTTPS Port - '81:81' # Admin Web Port # Add any other Stream port you want to expose # - '21:21' # FTP environment: DB_MYSQL_HOST: "npm-db" DB_MYSQL_PORT: 3306 DB_MYSQL_USER: "npm" DB_MYSQL_PASSWORD: "npm" DB_MYSQL_NAME: "npm" # Uncomment the line below if IPv6 is not enabled on your host # DISABLE_IPV6: 'true' volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt depends_on: - npm-db networks: - npm-nw - npm-internal npm-db: image: 'mariadb:latest' container_name: npm-db restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: 'npm' MYSQL_DATABASE: 'npm' MYSQL_USER: 'npm' MYSQL_PASSWORD: 'npm' volumes: - ./data/mysql:/var/lib/mysql networks: - npm-internal networks: npm-internal: npm-nw: external: true
Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.
Давайте пройдемся по файлу. В первой части файла мы импортируем образ прокси-менеджера Nginx и устанавливаем некоторые переменные среды в виде учетных данных базы данных. Мы также предоставляем серверу порты 80, 81 и 443 для доступа. Вы можете указать больше портов, например 21, для FTP-доступа. Вы можете отключить поддержку IPV6, раскомментировав строку
DISABLE_IPV6: true
. Мы сопоставили несколько каталогов с нашего хоста с Docker для хранения данных и SQL.Здесь мы используем две сети. Одним из них является внутренняя сеть
npm-internal
для подключения прокси-менеджера и базы данных. Это необязательно, так как оно создается автоматически. Но здесь мы делаем это вручную, давая ему имя по нашему выбору.Мы добавили внешнюю сеть в контейнер диспетчера прокси с именем
npm-nw
. Эта сеть необходима, потому что вы можете использовать ее для подключения прокси-менеджера к любым другим контейнерам докеров, которые вы устанавливаете. Использование сети позволит вам подключить любой контейнер напрямую, без необходимости открывать его порты серверу.Шаг 5 — Запустите прокси-менеджер Nginx
Перед запуском контейнера Docker нам нужно создать внешнюю сеть
npm-nw
. Внутренние сети создаются автоматически. Выполните следующую команду, чтобы создать внешнюю сеть.$ docker network create npm-nw
Запустите контейнер Docker с помощью следующей команды.
$ docker-compose up -d
Проверьте состояние контейнеров.
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c91ca0ddca97 jc21/nginx-proxy-manager:latest "/init" About a minute ago Up About a minute 0.0.0.0:80-81->80-81/tcp, :::80-81->80-81/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp npm-app 1738d71b95da mariadb:latest "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp npm-db
Шаг 6. Доступ к прокси-менеджеру Nginx
Теперь вы можете получить доступ к своему прокси-менеджеру Nginx через URL-адрес
http://yourserverIP:81
. Вы должны получить следующий экран входа в систему.Введите следующие учетные данные по умолчанию для входа.
Адрес электронной почты:
[email
Пароль: changemeДалее вас сразу же попросят указать имя и адрес электронной почты.
Нажмите кнопку Сохранить, и вам будет предложено установить новый пароль.
Нажмите кнопку «Сохранить» еще раз, и теперь вы можете начать использовать приложение.
Если вы откроете URL-адрес
http://yourserverIP
в своем браузере, вы попадете на страницу по умолчанию, которую установил менеджер прокси.Шаг 7 — Настройка доменного имени и SSL для Nginx Proxy Manager
Давайте установим доменное имя для доступа к Nginx Proxy Manager. Этот шаг необязателен, но полезен, если вы хотите поместить приложение за SSL.
Нажмите Hosts >> Proxy Hosts в меню панели инструментов, чтобы открыть страницу Proxy Hosts. Оттуда нажмите кнопку «Добавить прокси-хост», чтобы продолжить.
Добавьте полное доменное имя (
npm.example.com
) и нажмите на него. Введите IP-адрес вашего сервера и 81 в качестве порта пересылки.Перейдите на вкладку SSL.
Выберите Запросить новый SSL-сертификат в раскрывающемся меню. Выберите параметры Принудительно поддерживать SSL и HTTP/2. Если вы хотите включить HSTS, вы также можете включить это. Если ваш домен настроен через Cloudflare, не включайте опцию Force SSL, иначе вы застрянете в петле перенаправления.
Введите свой адрес электронной почты, примите условия использования Lets Encrypt (TOS) и нажмите кнопку «Сохранить», чтобы завершить.
Ваш домен должен быть живым и рабочим. Попробуйте открыть
https://npm.example.com
в своем браузере, и вы должны увидеть экран входа в Nginx Proxy Managers.Аналогичным образом вы можете сделать это для целевой страницы по умолчанию и присвоить ей доменное имя, например
https://example.com
. Просто измените порт с 81 на 81 при настройке прокси-сервера.Шаг 8. Используйте Nginx Proxy Manager с другим веб-приложением Docker.
Теперь, когда мы установили прокси-менеджер, пришло время использовать его. Первое, что мы сделаем, это используем его для размещения другого веб-приложения Docker. Для этого мы установим блог Ghost. Если вы хотите узнать больше, ознакомьтесь с нашим руководством по установке Ghost с помощью Docker на сервере Ubuntu.
Создайте еще один каталог для своего блога Ghost.
$ mkdir ~/ghost
Перейдите в каталог Ghost.
$ cd ~/ghost
Создайте два каталога для содержимого и базы данных.
$ mkdir {content,mysql}
Даже если вы используете один и тот же образ MySQL, вы должны хранить данные и их контейнеры отдельно от прокси-менеджеров. Это поможет изолировать любые проблемы, с которыми вы можете столкнуться, и позволит вам перемещать вещи в случае необходимости.
Создайте и откройте файл компоновки Docker для редактирования.
$ nano docker-compose.yml
Вставьте следующий код. Замените
example.com
вашим фактическим доменным именем для вашего блога Ghost. Введите данные SMTP, если хотите получать электронные письма. Вы можете удалить их, если они вам не нужны.version: '3.3' services: ghost-app: image: ghost:latest container_name: ghost-app restart: always depends_on: - ghost-db environment: url: https://ghost.example.com database__client: mysql database__connection__host: ghost-db database__connection__user: ghost database__connection__password: ghostdbpass database__connection__database: ghostdb mail__transport: SMTP mail__options__host: {Your Mail Service host} mail__options__port: {Your Mail Service port} mail__options__secureConnection: {true/false} mail__options__service: {Your Mail Service} mail__options__auth__user: {Your User Name} mail__options__auth__pass: {Your Password} volumes: - /home/<username>/ghost/content:/var/lib/ghost/content networks: - npm-nw - ghost-network ghost-db: image: mariadb:latest container_name: ghost-db restart: always environment: MYSQL_ROOT_PASSWORD: your_mysql_root_password MYSQL_USER: ghost MYSQL_PASSWORD: ghostdbpass MYSQL_DATABASE: ghostdb volumes: - /home/<username>/ghost/mysql:/var/lib/mysql networks: - ghost-network networks: ghost-network: npm-nw: external: true
Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.
Как видите, мы подключили контейнер Ghost к прокси-менеджеру Nginx, используя внешнюю сеть
npm-nw
. Таким образом, мы не раскрываем порты Ghost для системы. Мы также использовали внутреннюю сетьhost-network
для подключения нашего приложения Ghost и соответствующего контейнера базы данных.Запустите контейнер.
$ docker-compose up -d
Настройка Ghost в Nginx Proxy Manager
Теперь нам нужно установить обратный прокси-сервер для нашей установки Ghost. Откройте диспетчер Nginx Proxy в своем браузере, перейдите в Панель инструментов >> Хосты >> Прокси-хост и добавьте новый прокси-хост.
Добавьте доменное имя, которое вы выбрали для своего блога Ghost. В качестве значения Hostname/IP введите имя вашего контейнера. В данном случае это будет
призрак-приложение
. Мы не можем добавить сюда IP-адрес, потому что мы не предоставили серверу порт Ghosts, и прокси-сервер Nginx не сможет получить доступ к Ghost через IP. Следовательно, мы используем имя контейнера, к которому NPM может получить доступ через сеть Dockersnpm-nw
, которую мы создали. Используйте2368
в качестве порта, порта по умолчанию, используемого Ghost Blog. Проверьте другие параметры, как показано на скриншоте выше.Затем перейдите на вкладку SSL и создайте новый SSL-сертификат, следуя шагу 6. Поскольку вы будете загружать контент в свой блог Ghost, было бы неплохо установить максимальный размер загрузки для ваших загрузок.
К счастью, NPM позволяет добавлять собственные конфигурации. Перейдите на вкладку «Дополнительно» и введите в поле
client_max_body_size 50m;
.Нажмите кнопку Сохранить, чтобы завершить добавление прокси-сервера. Вы должны иметь доступ к своему блогу Ghost через URL-адрес
https://ghost.exampl.com
.Шаг 9. Используйте Nginx Proxy Manager в качестве службы перенаправления
Давайте посмотрим, как вы можете использовать NPM для простого перенаправления одного домена на другой. Для этого перейдите на Панель управления >> Хосты >> Хосты перенаправления. Оттуда нажмите кнопку «Добавить узел перенаправления», чтобы начать.
Введите доменное имя, которое вы хотите переадресовать. И введите домен переадресации. Домен пересылки уже должен быть настроен. Оставьте схему как авто. В зависимости от ваших требований вы можете выбрать http или https. Выберите правильный HTTP-код и установите флажки «Сохранить путь» и «Блокировать распространенные эксплойты». Если вы используете автоматическую схему или схему https, убедитесь, что вы выбрали или создали сертификат SSL с помощью NPM. Нажмите «Сохранить», чтобы завершить добавление хоста перенаправления.
Ваш домен
example.com
должен начать перенаправление наblog.example.com
.Другие варианты использования Nginx Proxy Manager
Есть еще два способа использования Nginx Proxy Manager. Вы можете использовать его как хост 404, что означает, что вы можете использовать домен в качестве целевой страницы, чтобы показать поисковым системам, что страницы домена не существуют. Этот шаг включает в себя только ввод домена и настройку SSL для него. Вы также можете использовать это как возможность отслеживать журналы для доменного имени и просматривать трафик реферера.
Другая функция — использовать NPM в качестве хоста потока. Вы можете использовать эту функцию для переадресации портов TCP/UDP на другой компьютер в сети. Это полезно, если вы размещаете игровые серверы. Единственное, что требуется, это ввести входящий порт, домен пересылки или IP-адрес, порт пересылки и выбрать тип порта.
Используйте Nginx Proxy Manager для размещения статического веб-сайта
Nginx Proxy Manager также может размещать простые статические или динамические веб-сайты. Для этого добавьте новый прокси-хост и выберите
127.0.0.1
в качестве домена пересылки и 80 в качестве порта.На вкладке «Дополнительно» введите конфигурацию, указав корневой каталог. Убедитесь, что корневой каталог сайта смонтирован в исходной конфигурации компоновки Docker. Здесь мы используем каталог
/data/static
для размещения нашего статического веб-сайта.Нажмите «Сохранить», чтобы закончить, и ваш сайт должен быть доступен. Точно так же вы можете разместить сайт любого типа, используя прокси-менеджер.
Шаг 10 — Прочие функции
Используйте функцию контроля доступа Nginx Proxy Managers
Вы можете использовать функцию списков доступа NPM, чтобы включить HTTP-аутентификацию или заблокировать диапазоны IP-адресов. Откройте NPM и перейдите на страницу Dashboard >> Access Lists.
Нажмите кнопку «Добавить список доступа», чтобы начать.
Вы можете назвать свою конфигурацию списка доступа (ACL). Вкладка Satisfy Any, если она отмечена, разрешает доступ, если клиент выполняет любое из указанных условий. Если клиент проходит аутентификацию HTTP, но может не получить доступ на основе IP, он будет разрешен. Но если опция Satisfy Any не отмечена, клиент должен будет выполнить все условия.
Функция Pass Auth to Host переадресует функцию аутентификации на хост-сервер.
Далее перейдите на вкладку Авторизация. Здесь вы можете создать имя пользователя и пароль для метода аутентификации HTTP. Чтобы добавить более одного пользователя, нажмите кнопку «Добавить». Вы можете добавить не более 5 пользователей. И есть ошибка с кнопкой «Добавить», поэтому сначала используйте кнопку, а затем заполните детали. Если вы заполните детали и нажмете кнопку позже, чтобы добавить другого пользователя, он удалит данные предыдущего пользователя.
Перейдите на вкладку «Доступ». Здесь вы можете установить, какие IP-адреса должны быть предоставлены или запрещены в доступе.
Нажмите Сохранить, чтобы закончить.
Чтобы использовать этот список доступа, вам нужно выбрать его при добавлении прокси-сервера. Как и в приведенном ниже примере для Ghost Blog, мы выбрали наш список доступа.
Включить поддержку большего количества доменных имен
По мере роста количества хостов и доменов у вашего Nginx может закончиться хеш-пространство или могут возникнуть проблемы с памятью. Мы можем добавить пользовательскую конфигурацию, которая будет применяться ко всем хостам, чтобы решить эту проблему.
Для этого создайте каталог custom внутри
~/nginx-proxy/data/nginx
.$ sudo mkdir ~/nginx-proxy/data/nginx/custom
Создайте и откройте файл
http.conf
внутри этого каталога.$ sudo nano ~/nginx-proxy/data/nginx/custom/http.conf
Вставьте в него следующие строки.
proxy_headers_hash_max_size 1024; proxy_headers_hash_bucket_size 128;
Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.
Nginx должен автоматически принимать эти значения. Если этого не произошло, вы можете перезапустить контейнер NPM с помощью следующей команды.
$ docker restart npm-app
Перенаправить целевую страницу по умолчанию
На шаге 6 вы увидите страницу по умолчанию при вводе URL-адреса
http://
. Если вы хотите изменить это, это возможно сделать. Для этого перейдите на страницу настроек. Нажмите на три точки справа и нажмите кнопку «Изменить».Вы можете настроить целевую страницу как страницу 404, страницу перенаправления или добавить к ней собственный HTML-код, используя параметр «Пользовательская страница». Если вы выберете Redirect, вам нужно будет указать целевой URL.
Это пользовательский HTML, который мы использовали для нашей цели.
<!doctype html> <html> <head> <title>Nothing Here</title> <meta charset="utf-8"/> <meta name="robots" content="noindex"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> body { text-align: center; padding: 20px; font: 20px Helvetica, sans-serif; color: #333; } @media (min-width: 768px){ body{ padding-top: 150px; } } h1 { font-size: 50px; } article { display: block; text-align: left; max-width: 650px; margin: 0 auto; } </style> </head> <body> <article> <h1>Oops!</h1> <div> <p>Sorry for the inconvenience but you are not supposed to be here. You won't get anything here. This page was set for HowtoForge Nginx Proxy Manager Guide. Maybe, someday it will show something.</p> </div> </article> </body> </html>
Нажмите Сохранить, чтобы закончить. Ваша целевая страница должна измениться на что-то вроде приведенного ниже.
Шаг 11. Обновите прокси-менеджер Nginx
Чтобы обновить NPM, сначала остановите контейнеры.
$ cd ~/nginx-proxy $ docker-compose down --remove-orphans
Вытащите последние изображения.
$ docker-compose pull
Запустите контейнеры снова.
$ docker-compose up -d
Заключение
На этом мы завершаем наше руководство, в котором вы установили Nginx Proxy Manager и научились использовать его для добавления прокси-узла для другого контейнера докеров, использования его в качестве службы перенаправления и управления доступом с его помощью. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.