Поиск по сайту:

Как установить и использовать Nginx Proxy Manager с Docker


На этой странице

  1. Предпосылки
  2. Шаг 1. Настройка брандмауэра
    1. Cent OS/Rocky Linux/Alma Linux
    2. Убунту/Дебиан

    1. Cent OS/Rocky Linux/Alma Linux
    2. Убунту
    3. Дебиан

    1. Настройка Ghost в Nginx Proxy Manager

    1. Другое использование Nginx Proxy Manager
    2. Используйте Nginx Proxy Manager для размещения статического веб-сайта.

    1. Использовать функцию управления доступом Nginx Proxy Managers
    2. Включить поддержку дополнительных доменных имен
    3. Перенаправить целевую страницу по умолчанию

    Обратный прокси — это веб-сервер, который может располагаться перед другим веб-сервером или веб-службой. Он может шифровать исходящий трафик, действовать как балансировщик нагрузки, перенаправлять трафик и предлагать защиту. Веб-сервер 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 может получить доступ через сеть Dockers npm-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 и научились использовать его для добавления прокси-узла для другого контейнера докеров, использования его в качестве службы перенаправления и управления доступом с его помощью. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.