ispmanager 6 lite, pro, host

Обратный прокси

Обратный прокси позволяет предоставить доступ к сайту или приложению через домен, настроенный в ispmanager. Он принимает запросы пользователей, передает их целевому серверу или приложению и возвращает полученные ответы. Такой получатель запросов называется апстримом: это может быть приложение на том же сервере, приложение в Docker-контейнере, удаленный веб-сервер или другой прокси.

Пользователь → Обратный прокси → Апстрим
Пользователь ← Обратный прокси ← Апстрим

Преимущества обратного проксирования: 

  • Безопасность: прокси помогает скрыть от клиентов IP-адрес и внутреннюю структуру апстрима.
  • SSL-терминация: на прокси можно настроить HTTPS. Тогда HTTPS-трафик будет расшифровывать прокси, снижая нагрузку на апстрим, а соединение между прокси и апстримом может работать по HTTP.
  • Кеширование: на прокси можно настроить кеширование ответов. Тогда при повторных запросах прокси будет отдавать ответы без нового обращения к апстриму, что ускорит работу сайта или приложения.

Как работает прокси

В ispmanager в качестве прокси используется Nginx.

Способы проксирования

Доступно 2 способа проксирования: через прокси-сайт или проксирование отдельных путей. Правила проксирования отдельных путей можно настроить как для обычного, так и для прокси-сайта.

ВариантЧто проксируетсяЧто происходит с остальными запросами
Прокси-сайтВсе запросы к домену. Для отдельных путей можно настроить дополнительные правила и направить их на другой апстримЗапросы к корню сайта и к путям без отдельных правил передаются основному апстриму
Проксирование отдельных путейТолько запросы к указанным путямОстальные запросы обрабатываются основным сайтом: например, PHP-, Node.js- или Python-приложением

Способы подключения апстрима

Способ подключения зависит от цели проксирования, т. е. того, где расположен апстрим: 

Цель проксированияСпособ подключения
Локальный серверсокет-файл или URL вида http://127.0.0.1:ПОРТ
Удаленный серверURL
Docker-контейнерпорт Docker-контейнера

Когда нужен прокси

Выбор способа проксирования и способа подключения зависит от ваших задач. Например:

ЗадачаСпособ проксированияСпособ подключения
Открыть по домену приложение из Docker-контейнераПрокси-сайтПорт Docker-контейнера
Основной сайт на PHP, а /api обслуживает Java-приложениеОбычный сайт + проксирование пути /apiURL http://127.0.0.1:3000 или сокет
Сайт переехал на другой сервер, а домен и SSL остаются в панелиПрокси-сайтURL внешнего сервера
Приложение работает только по HTTP, а нужен HTTPSПрокси-сайт с SSL-сертификатомURL с http://

Требования для настройки прокси

  • Панель ispmanager лайт, про или хост
  • Веб-сервер Nginx или связка Apache + Nginx
  • Установленный Docker, если планируется использовать Docker-контейнер
  • Апстрим должен быть доступен с сервера ispmanager, на котором работает прокси:

    Способ подключенияЧто указать или подготовить
    URLHTTP- или HTTPS-адрес апстрима. Он может быть локальным, например http://127.0.0.1:3000, или удаленным, например https://app.example.com . Для доступа по доменному имени DNS-записи домена должны указывать на сервер с прокси. Для доступа по HTTPS у домена должен быть настроен действующий SSL-сертификат
    Сокет-файлПуть к сокет-файлу приложения. Сокет должен быть доступен процессам Nginx
    Порт Docker-контейнераРаботающий контейнер и сопоставление порта приложения в контейнере с портом сервера, через который прокси сможет подключиться к приложению

Ограничения для прокси-сайта

Для прокси-сайта недоступны следующие возможности:

  • установка CMS и веб-скриптов
  • конструктор Site.pro
  • страницы ошибок, перенаправления, управление доступом к каталогам
  • настройки обработчиков PHP / Node.js / Python, CGI, каталог сайта
  • кеширование статики Nginx, расширения статических файлов, настройки времени кеширования

Для обычного сайта, у которого проксируются лишь отдельные пути, эти возможности доступны.

Настройка прокси

Настройка прокси выполняется под учетной записью уровня администратор или выше.

Шаг 1. Подготовка приложения

Запустите приложение и убедитесь, что оно принимает запросы.

Если приложение работает в Docker-контейнере, проверьте сопоставление портов. Например, если приложение слушает порт 3000 внутри контейнера, а этот порт опубликован на порту 8080 сервера, для подключения с сервера используется порт 8080.

Если приложение доступно по URL, предварительно проверьте его ответ с сервера, на котором работает прокси:

curl -i http://127.0.0.1:8080/

Адрес и порт замените своими. Для удаленного апстрима используйте его URL.

Шаг 2. Создание прокси-сайта

  1. Перейдите в раздел Сайты.
  2. На панели инструментов нажмите Создать сайт → Обратный прокси.Анимация перехода в раздел «Сайты» и к форме создания прокси-сайта
  3. Укажите параметры сайта. Обязательные параметры отмечены звездочками.
    • Проксируемый домен* — доменное имя, по которому сайт будет доступен в интернете
    • Владелец сайта* — пользователь, которому будет принадлежать сайт
    • SSL-сертификат* — сертификат для защищенного соединения: 
      • Новый бесплатный от Let's Encrypt 
      • Новый самоподписанный
      • Существующий
      • Не используется
  4. Укажите параметры проксирования. Обязательные параметры отмечены звездочками.
  5. Сохраните изменения.

Прокси-сайт появится в разделе Сайты и будет отмечен значком иконка «Обратный прокси». Для просмотра добавленных проксирований нажмите на этот значок. Сразу после создания сайта там будет отображаться одно проксирование — для его корня.

Шаг 3. Добавление проксирования для пути 

  1. Перейдите в раздел Сайты.
  2. Возле нужного сайта нажмите иконка «Контекстное меню».
  3. В контекстном меню выберите Проксирование запросов.
  4. На панели инструментов нажмите Создать проксирование.Анимация перехода в раздел «Сайты» и создания проксирования для отдельного пути
  5. Укажите путь проксирования: 
    • Проксируемый путь* — путь на домене, запросы к которому будут перенаправляться на апстрим. Путь задается относительно корня домена. Например, если указать путь blog на домене example.com, проксироваться будут запросы к http(s)://example.com/blog. Для каждого пути можно создать только одно проксирование.
  6. Укажите параметры проксирования. Обязательные параметры отмечены звездочками.
  7. Сохраните изменения.

У сайта, для которого были добавлены проксирования, появится значок иконка «Обратный прокси». Чтобы просмотреть добавленные проксирования, нажмите на этот значок.

Шаг 4. Проверка работы прокси

Проверьте доступ через домен

Откройте сайт по настроенному адресу. Проверьте не только главную страницу, но и основные действия: загрузку ресурсов, переходы между страницами и запросы к API, если они используются.

Для проверки ответа через командную строку выполните команду. Если HTTPS еще не настроен, используйте http://.

curl -i https://ПРОКСИ-ДОМЕН/

Ожидаемый результат зависит от приложения: это может быть успешный ответ, перенаправление на страницу входа или запрос авторизации.

Проверьте отдельный путь

Если настроено проксирование /api, запросите существующий ресурс приложения:

curl -i https://example.com/api

Затем проверьте ресурс за пределами проксируемого пути. Он должен обрабатываться обычным сайтом или основным апстримом — в зависимости от выбранного варианта настройки.

Проверьте HTTPS и перенаправления

Убедитесь, что браузер не сообщает об ошибке сертификата, приложение не перенаправляет пользователя на внутренний адрес и не возникает циклических перенаправлений.

Если результат отличается от ожидаемого, проверьте журналы Nginx и приложения.

Параметры проксирования

Базовые настройки

  • Цель проксирования* — адрес апстрима: 

    URL* — URL в формате http(s)://IP_ИЛИ_ДОМЕН/РЕСУРС

    Путь до сокет-файла — путь к сокет-файлу на локальном сервере с ispmanager

    • Docker-контейнер — контейнер, в котором запущено приложение, выступающее в роли апстрима
    • Порт — порт контейнера, который вы указали при настройке сопоставления портов

Расширенные настройки

  • Кешировать ответы апстрима — установите галочку, чтобы ответы апстрима кешировались на прокси. По умолчанию кешируются ответы на GET- и HEAD-запросы. Параметры кеширования (размер, время жизни) задаются в конфигурационном файле панели.
  • Таймауты*:
    • Таймаут соединения — время, отведенное на установку соединения между прокси и апстримом. Если за это время соединение не будет установлено, запрос будет прерван и клиент получит ошибку. Значение по умолчанию: 30 секунд.
    • Таймаут отправки — время, отведенное на отправку запроса от прокси к апстриму. Отсчитывается между операциями записи: если апстрим за это время не принимает очередную порцию данных, соединение обрывается. Значение по умолчанию: 120 секунд.
    • Таймаут ожидания ответа — время, отведенное на получение прокси ответа от апстрима. Отсчитывается между операциями чтения: если апстрим не отвечает дольше указанного времени, соединение закрывается. Значение по умолчанию: 180 секунд.
  • Заголовки — заголовки, которые прокси передает с запросом апстриму. Заголовки Host, X-Forwarded-For, X-Forwarded-Proto и X-Forwarded-Port добавляются автоматически. Чтобы переопределить Host, добавьте новый заголовок Host со своим значением. Значения заголовков подставляются в кавычках, чтобы исключить инъекцию директив.

Действия с проксированиями

Очистка кеша прокси

Кеш автоматически обновляется при истечении его срока жизни. При необходимости очистите его вручную:

  1. Авторизуйтесь в панели под учетной записью уровня администратор или выше.
  2. Перейдите в раздел Сайты.
  3. Возле нужного сайта нажмите иконка «Контекстное меню».
  4. В контекстном меню выберите Проксирование запросов.
  5. Выберите проксируемый путь и на панели инструментов нажмите иконка «Удалить кеш ответов апстрима для выбранных путей».

Для выбранного проксирования будет удален каталог с кешем и создан заново пустым. 

Удаление проксирований

  1. Авторизуйтесь в панели под учетной записью уровня администратор или выше.
  2. Перейдите в раздел Сайты.
  3. Выберите нужный сайт и на панели инструментов нажмите иконка «Удалить проксирование».

Будут удалены сам сайт, все его проксирования, конфигурационные файлы Nginx, каталоги кеша и служебные каталоги.

  1. Авторизуйтесь в панели под учетной записью уровня администратор или выше.
  2. Перейдите в раздел Сайты.
  3. Возле нужного сайта нажмите иконка «Контекстное меню».
  4. В контекстном меню выберите Проксирование запросов.
  5. Выберите путь проксирования и на панели инструментов нажмите иконка «Удалить проксирование».

Будут удалены проксирование, его конфигурационный файл Nginx и каталог кеша.

Конфигурационные файлы прокси

Правила проксирования

Конфигурация правил проксирования состоит из двух уровней и включает следующие файлы:

  • /etc/nginx/vhosts-resources/ДОМЕН/reverse-proxy.d/ID_ПРОКСИРОВАНИЯ.conf — конфигурационный файл правил проксирования для конкретного пути. Называется по идентификатору в таблице базы данных reverse_proxy
  • /etc/nginx/vhosts-resources/ДОМЕН/reverse-proxy.conf — индексный файл, в который включаются конфигурационные файлы правил проксирования для всех путей на домене. Включается в секцию server конфигурационного файла сайта

Схема подключения конфигурационных файлов выглядит следующим образом:

Для просмотра и редактирования конфигурационного файла проксирования:

  1. Авторизуйтесь в панели под учетной записью уровня администратор или выше.
  2. Перейдите в раздел Сайты.
  3. Возле нужного сайта нажмите иконка «Контекстное меню».
  4. В контекстном меню выберите Проксирование запросов.
  5. Выберите проксируемый путь и на панели инструментов нажмите иконка «Изменить конфигурационный файл Nginx для выбранного пути».
Пример конфигурации проксирования для пути
location / {
	resolver 1.1.1.1 8.8.8.8 valid=300s;
	proxy_pass $rp_upstream$request_uri;
	proxy_redirect https://ПРОКСИ /;
	access_log /usr/local/mgr5/var/nginx.log ispmgr_trafstat;
	access_log /var/www/httpd-logs/ПРОКСИ.access.log ispmgr_reverse_proxy;
	proxy_set_header Host "custom_host";
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header X-Forwarded-Proto $scheme;
	proxy_set_header X-Forwarded-Port $server_port;
	proxy_connect_timeout 30s;
	proxy_send_timeout 120s;
	proxy_read_timeout 180s;
	set $rp_upstream https://АПСТРИМ;
	proxy_ssl_server_name on;
	proxy_ssl_name "Custom host";
	proxy_cache               rp_2;
	proxy_cache_key           $scheme$host$request_uri;
	proxy_cache_methods       GET HEAD;
	proxy_cache_lock          on;
	proxy_cache_revalidate    on;
	proxy_cache_use_stale     updating;
}
Подробнее

Подробнее о параметрах конфигурации прокси — в официальной документации Nginx.

  • resolver — серверы имен, которые будут использоваться для преобразования имени апстрима в IP-адрес. Могут быть указаны в виде домена/IP-адреса и номера порта (опционально). Значения по умолчанию: 1.1.1.1 8.8.8.8. Параметр valid показывает, на какой срок будут кешироваться ответы серверов имен. Значение по умолчанию: 300s (300 секунд)
  • proxy_pass — адрес проксируемого ресурса 
  • proxy_redirect — адрес прокси-сайта, который Nginx передаст клиенту в заголовке ответа
  • access_log — настройки логирования трафика и посещений для прокси: директива с ispmgr_reverse_proxy задает собственный формат журнала посещений, директива с ispmgr_trafstat включает для сайта логирование трафика
  • proxy_set_header — заголовки запросов, которые прокси передает апстриму
  • proxy_connect_timeout — таймаут соединения. Значение по умолчанию: 30s (30 секунд)
  • proxy_send_timeout — таймаут отправки. Значение по умолчанию: 120s (120 секунд)
  • proxy_read_timeout — таймаут ожидания ответа. Значение по умолчанию: 180s (180 секунд)
  • set $rp_upstream — создание переменной в Nginx, в которую записывается адрес апстрима, куда прокси будет перенаправлять запросы
  • proxy_cache — зона кеша проксирования, т. е. название каталога на диске, где хранится кеш для указанного пути. Имеет значение rp_ID, где ID — это идентификатор проксирования в таблице БД reverse_proxy
  • proxy_cache_key — ключ кеширования, т. е. идентификатор закешированного ответа на запрос $scheme$host$request_uri, где $scheme — протокол запроса (HTTP или HTTPS), $host — домен запроса, $request_uri — путь к ресурсу на домене
  • proxy_cache_methods — типы запросов, ответы на которые кешируются и отдаются из кеша. Значение по умолчанию: GET и HEAD. Остальные запросы всегда перенаправляются на апстрим
  • proxy_cache_lock — если опция включена, при одновременных запросах к одному и тому же незакешированному ресурсу на апстрим перенаправляется только один запрос, а остальные ждут его ответа. Это защищает апстрим от потока одинаковых запросов. Значение по умолчанию: on — включено
  • proxy_cache_revalidate — если опция включена, когда истекает срок жизни кеша, Nginx запрашивает у апстрима, изменился ли ответ. При отсутствии изменений кеш продлевается без полной перезагрузки. Ускоряет обработку запросов при истечении срока жизни кеша. Значение по умолчанию: on — включено
  • proxy_cache_use_stale — если директива имеет параметр updating, пока запись кеша обновляется, клиентам отдается устаревшая копия. Ускоряет обработку запросов при обновлении кеша

Кеш 

Конфигурация кеша проксирований состоит из двух уровней и включает следующие файлы:

  • /etc/nginx/conf.d/reverse-proxy-cache.d/ДОМЕН/ID_ПРОКСИРОВАНИЯ.conf — конфигурационный файл кеша для конкретного пути. Называется по идентификатору в таблице базы данных reverse_proxy
  • /etc/nginx/conf.d/reverse-proxy-cache.conf — индексный файл, в который включаются конфигурационные файлы кеша для всех путей на домене. Включается в секцию http глобального конфигурационного файла Nginx

Данные кеша хранятся в каталоге /var/cache/nginx/reverse-proxy/ДОМЕН/ID_ПРОКСИРОВАНИЯ.

Схема подключения конфигурационных файлов выглядит следующим образом:

Пример конфигурации кеша для пути
proxy_cache_path /var/cache/nginx/reverse-proxy/ДОМЕН/ID_ПРОКСИРОВАНИЯ levels=1:2 keys_zone=rp_ID_ПРОКСИРОВАНИЯ:1m max_size=64m inactive=24h use_temp_path=off;

Параметры директивы берутся из конфигурации панели ispmgr.conf.

Подробнее

proxy_cache_path — определяет параметры кеширования:

  • /var/cache/nginx/reverse-proxy/ДОМЕН/ID_ПРОКСИРОВАНИЯ — каталог, в который сохраняется кеш
  • levels — иерархия вложенности папок кеша. Значение по умолчанию 1:2 означает, что Nginx создаст двухуровневую структуру:
        • Первый уровень — каталог из 1 последнего символа хэша, например /c/
        • Второй уровень — каталог из 2 предыдущих символов, например /29/
        • Итоговый файл b7f54b2df7773722d382f4809d65029c сохранится в каталог /var/cache/nginx/reverse-proxy/ДОМЕН/ID_ПРОКСИРОВАНИЯ/c/29/
  • keys_zone — зона в оперативной памяти для хранения метаданных кеша для данного проксирования. Значения по умолчанию:
    • rp_ID_ПРОКСИРОВАНИЯ — ключ (идентификатор) зоны
    • 1m — размер зоны (1 МБ)
  • max_size — максимальный размер кеша на диске для данного проксирования. Значение по умолчанию: 64m (64 МБ)
  • inactive — время жизни неактивного кеша. Если за это время к закешированному файлу ни разу не обратились, Nginx удалит его с диска. Значение по умолчанию: 24h (24 часа)
  • use_temp_path — использование временной директории. Если опция включена, Nginx сначала сохраняет файл в общую временную директорию, а затем копирует в каталог кеша. Значение по умолчанию: off (отключено) 

Таблицы прокси в базе данных

Информация о проксированиях сохраняется в базе данных панели.

Статус сайта хранится в таблице webdomain в поле reverse_proxy: on — сайт является прокси, off — сайт является обычным сайтом.

Параметры проксирования хранятся в таблице reverse_proxy. 

Поля таблицы reverse_proxy
  • id — идентификатор проксирования.
  • site_id — ссылка на таблицу webdomain. При удалении сайта удаляется и запись о проксировании.
  • location — проксируемый путь.
  • target_type — тип цели проксирования: 0 — URL, 1 — сокет, 2 — Docker-контейнер.
  • target — целевой ресурс (URL, путь к сокету или КОНТЕЙНЕР:ПОРТ).
  • cache_upstream_answer — статус кеширования ответов: on — включено, off — выключено.
  • connect_timeout — таймаут соединения.
  • send_timeout — таймаут отправки запроса.
  • read_timeout — таймаут ожидания ответа.
  • headers — пользовательские заголовки в кодировке base64.