Apache в качестве proxy http
Потребовалось в одном проекте прокинуть HTTP-трафик на внутренний сайт фирмы. Наружу смотрел Apache, а какой был внутри не суть важно, какое-то приложение с web-интерфейсом. Конечно у данной задачи есть масса решений. Люди работающие в данной сфере чаще всего предлагают решение с Nginx на периметре и он в свою очередь отдаёт трафик от нескольких web-серверов наружу. Так же на роутере можно прокинуть трафик с изменённым портом. Например, вместо 80 порта использовать 81 или 8080.
Но я не стал портить имеющуюся инфраструктуру и воспользовался наименее болезненным вариантом. И так, для того чтобы пробросить трафик на внутренний ресурс необходимо активировать прокси-модуль для Apache. Это делается в терминале операционной системы:
sudo a2enmod proxy sudo a2enmod proxy_html sudo a2enmod proxy_connect sudo a2enmod proxy_http sudo a2enmod proxy_http2 sudo service apache2 restart
Я сначала думал, что достаточно будет только одного прокси-модуля, но как показала практика необходимо запускать целую династию этих проксей. Без этого при редиректах или подключениях с разных версий браузеров возникали ошибки номер 404 или 500. А в логах сыпалось, что необходимо воспользоваться LoadModule.
Идём дальше. Теперь необходимо создать виртуальный хост который будет перенаправлять запрос на другой физический сервер. В моём случае, на другой сервер расположеный в локальной сети. Мой хост выглядел вот так.
ServerAdmin name@domain.local DocumentRoot /var/www/html ServerName stat.orcinus.ru ErrorLog /var/log/apache2/stat_error_log CustomLog /var/log/apache2/stat_access_log combined ProxyRequests Off ProxyPreserveHost On ProxyVia full ProxyPass / http://192.168.130.3:8080/ ProxyPassReverse / http://192.168.130.3:8080/
Поля ServerAdmin и DocumentRoot обязательны для заполнения и их игнорировать нельзя. По этому туда надо хоть что-то записать. Не забывайте, что в DNS должен существовать хост ServerName и он должен указывать на сервер на котором запущен Apache.
И так параметры, которые я использовал:
- ServerAdmin — электронная почта администратора. Можно писать, что угодно.
- DocumentRoot — каталог, так как это обязательный параметр его нельзя игнорировать. Можно указать любой.
- ServerName — имя хоста, который мы перенаправляем на внутренний сервер.
- ErrorLog и CustomLog — адрес файлов для логов и степень детализации.
- ProxyRequests — передача параметров на проксируемый сервер. Рекомендуется всегда отключать этот параметр. Его включение делает возможность получения несанкционированного доступа внутрь вашей сети.
- ProxyPreserveHost — сохранять имя хоста при передаче запроса. Необходимо если принимающий сервер оценивает эти заголовки.
- ProxyVia — отвечает за передачу HTTP-заголовка Via в цепочке HTTP-прокси по цепочке.
- ProxyPass и ProxyPassReverse — первый параметр говорит откуда идет отсчет. Можно проксировать только один каталог на другой сервер. Второй параметр указывает протокол, адрес и порт на который перенаправляется трафик.
Если вы хотите организовать обратный прокси-сервер к сайтам внутри вашей сети с нуля, то я бы рекомендовал использовать для этих целей сервер Nginx. Используя его вы сможете организовать кэширование, балансировку и много иных приятных плюшек касающихся ваших web-серверов.
Успехов в администрировании.
Тэги: ИТ
Отредактировано:2020-09-07 06:39:40