Обратный прокси – сервер представляет собой тип прокси – сервера, который принимает HTTP (S) запросы и прозрачно распределяет их на один или несколько внутренних серверов. Обратные прокси – серверы являются полезными, поскольку многие современные веб – приложения обработки входящих запросов HTTP с использованием серверов приложений бэкэнда, не должны быть доступны пользователям напрямую и часто поддерживают только элементарные функции HTTP.
Вы можете использовать обратный прокси-сервер для предотвращения от непосредственного доступа этих основных серверов приложений. Он также может быть использован для распределения нагрузки от входящих запросов на нескольких различных серверах приложений, увеличивая производительность в масштабе и обеспечение отказоустойчивости. Он может заполнить пробелы с функциями сервера приложений, которые не предлагают, такое как кэширование, сжатие или шифрование SSL.
В этом учебном пособии вы настроите Apache в качестве основного обратного прокси – сервера с помощью расширения mod_proxy
для перенаправления входящих подключений к одному или нескольким внутренним серверам, работающих в той же сети. Этот учебник использует простой бэкенд написанный на Flask web framework, но вы можете использовать любой сервер данных, который вы предпочитаете.
Следуя этому руководству, вам потребуется:
Apache имеет множество модулей в комплекте с ним, которые доступны, но не включены в новой установки. Во-первых, нам нужно включить те, которые мы будем использовать на этом уроке.
Модуль, который нам нужен, это mod_proxy
и некоторые из его дополнительных модулей, которые расширяют его функциональные возможности для поддержки различных сетевых протоколов. В частности, мы будем использовать:
mod_proxy
, главный прокси-модуль Apache модуль для перенаправления соединений; он позволяет Apache выступать в качестве шлюза для основных серверов приложений.mod_proxy_http
, который добавляет поддержку проксирования HTTP соединений.mod_proxy_balancer
и mod_lbmethod_byrequests
, добавляет новые функции балансировки нагрузки для нескольких внутренних серверов.Чтобы включить эти четыре модуля, необходимо выполнить следующие команды в последовательности.
sudo a2enmod proxy sudo a2enmod proxy_http sudo a2enmod proxy_balancer sudo a2enmod lbmethod_byrequests
Чтобы эти изменения вступили в силу, перезапустите Apache.
sudo systemctl restart apache2
Apache теперь готов действовать в качестве обратного прокси-сервера для HTTP-запросов. В следующем (по желанию) шаге, мы создадим два самых основных внутренних сервера. Это поможет нам проверить, что конфигурация работает правильно, но если у вас уже есть собственное приложение(я) бэкэнд, вы можете перейти к шагу 3.
Запуск некоторых простых внутренних серверов является простой способ проверить, что ваша конфигурация Apache работает должным образом. Здесь мы сделаем два тестовых сервера, которые отвечают HTTP – запросам с печатью строки текста. Один сервер скажет ‘Привет , мир! а другой скажет ‘AndreyEx мир! ,
ПримечаниеВ не-испытательных установках, Backend серверы, как правило, возвращают один и тот же тип содержимого. Тем не менее, для этого теста, в частности, два сервера возвращают различные сообщения, что позволяет легко проверить, что механизм балансировки нагрузки использует оба.
Flask является microframework Python для создания веб – приложений. Мы используем Flask для создания тестовых серверов, так как основное приложение требует всего несколько строк кода. Вам не нужно знать Python, чтобы настроить их.
Обновление списка пакетов в первую очередь.
sudo apt-get update
Затем установите pip, рекомендуемый менеджер пакетов Python.
sudo apt-get -y install python3-pip
Используйте pip чтобы установить Flask.
sudo pip3 install flask
Теперь, когда все необходимые компоненты установлены, начните с создания нового файла, который будет содержать код для первого сервера бэкэнда в домашнем каталоге текущего пользователя.
nano ~/backend1.py
Скопируйте следующий код в файл, а затем сохраните и закройте его.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello world!'
Первые две строки инициализации фреймворка Flask. Существует одна функция, home()
, которая возвращает строку текста ( Hello world!
). @app.route('/') над
home()
функции говорит Flask использовать home()
‘s возвращаемое значение в качестве ответа на HTTP – запросы, направленных на /
корневой URL приложения.
Второй сервер Бэкэнд точно так же, как и первый, кроме возвращения другой строчки текста, поэтому начните путем дублирования первого файла.
cp ~/backend1.py ~/backend2.py
Откройте вновь скопированный файл.
nano ~/backend2.py
Измените сообщение , которое будет возвращено из Привет , мир! в AndreyEx мир! А затем сохраните и закройте файл.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'AndreyEx world!'
Используйте следующую команду, чтобы запустить первый фоновый сервер на порту 8080
. Это также перенаправляет вывод Flask к /dev/null
.
FLASK_APP=~/backend1.py flask run --port=8080 >/dev/null 2>&1 &
Здесь мы предшествовали команде flask
, установив переменную окружения FLASK_APP
в той же строке. Переменные окружения представляют собой удобный способ передачи информации в процессах , которые порождаются из оболочки.
В этом случае, используя переменная окружения гарантирует, что параметр применим только к запущенной команде и не будет оставаться доступен после этого, как мы будет проходить другое имя файла точно так же набрать команду flask
, чтобы запустить второй сервер
Аналогичным образом, используйте эту команду, чтобы запустить второй сервер на порту 8081
. Обратите внимание на другое значение для переменной окружения FLASK_APP
.
FLASK_APP=~/backend2.py flask run --port=8081 >/dev/null 2>&1 &
Вы можете проверить, что оба сервера работают с использованием curl
. Тестирование первого сервера:
curl http://127.0.0.1:8080/
Это выведет Привет , мир! в терминале. Проверка второго сервера:
curl http://127.0.0.1:8081/
Это выведет AndreyEx мир!
ПримечаниеДля того, чтобы закрыть оба тестовых сервера после того, как вы больше не нуждаетесь в них, и когда вы закончите этот урок, вы можете просто выполнить killall flask.
На следующем шаге мы будем изменять конфигурационный файл Apache, чтобы включить его использование в качестве обратного прокси-сервера на Debian 8.
В этом разделе мы настроим Apache виртуальный хост по умолчанию, чтобы служить в качестве обратного прокси-сервера для одного сервера бэкэнд или массив с балансировкой нагрузки внутренних серверов.
В этом руководстве мы применяем настройки на уровне виртуального хоста. При установке по умолчанию Apache, есть только один включен, виртуальный хост по умолчанию. Тем не менее, вы можете использовать все эти фрагменты конфигурации в других виртуальных хостах.
Если ваш сервер работает на Apache как HTTP и HTTPS – сервер, ваша обратная конфигурация прокси – сервера должна быть размещена как в HTTP и HTTPS виртуальных хостах.
Откройте файл по умолчанию Apache конфигурации, используя nano
или ваш любимый текстовый редактор.
sudo nano /etc/apache2/sites-available/000-default.conf
Внутри этого файла вы найдете блок<VirtualHost *:80>
, начиная с первой строки. В первом примере ниже показано, как настроить этот блок для обратного прокси – сервера для одного сервера бэкэнда, а второй устанавливает балансировкой нагрузки обратного прокси для нескольких внутренних серверов.
Заменить все содержимое внутри блока VirtualHost
со следующим, ваш файл конфигурации должен выглядит следующим образом:
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
Если вы следовали вместе с серверами например, на шаге 2, используйте 127.0.0.1:8080
как написано в блоке выше. Если у вас есть свои собственные серверы приложений, использовать их адреса.
Есть три директивы здесь:
ProxyPreserveHost
делает Apache передают оригинальный Host
заголовок на внутренний сервер. Это полезно, так как это делает сервер бэкенд осознаный адрес, используемый для доступа к приложению.ProxyPass
главная директива конфигурации прокси. В этом случае, он указывает, что все в корневом URL ( /
) должен быть отображен на внутренний сервер по указанному адресу. Например, если Apache получает запрос на /example
, он будет подключаться и вернет ответ на оригинальный клиент. http://your_backend_server/example
ProxyPassReverse
должен иметь ту же конфигурацию, что и ProxyPass
. Это говорит Apache, чтобы изменить заголовки ответа от сервера бэкэнда. Это гарантирует, что если внутренний сервер возвращает заголовок перенаправления местоположения, браузер клиента будет перенаправлен на адрес прокси – сервера и не адреса сервера, бэкенда, который не будет работать, как предполагалось.Чтобы изменения вступили в силу, перезапустите Apache.
sudo systemctl restart apache2
Теперь, если вы получаете доступ к http://your_server_ip через веб – браузер, вы увидите ответ сервера бэкэнда вместо стандартной страницы приветствия Apache. Если вы следовали инструкциям Шаг 2, то вы будете видеть Привет мир!
Если у вас есть несколько внутренних серверов, хороший способ распределить трафик между ними, когда проксирование заключается в использовании балансировки нагрузки функции mod_proxy
.
Замените все содержимое внутри блока VirtualHost
следующим, так что ваш файл конфигурации выглядит следующим образом:
<VirtualHost *:80>
<Proxy balancer://mycluster>
BalancerMember http://127.0.0.1:8080
BalancerMember http://127.0.0.1:8081
</Proxy>
ProxyPreserveHost On
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>
Конфигурация аналогична предыдущей, но вместо указания одного сервера бэкэнд напрямую, мы использовали дополнительный блок Proxy
для определения нескольких серверов. Блок с именем balancer://mycluster
(имя может быть свободно изменено) и состоит из одного или нескольких BalancerMember
, которые определяют, лежащие в основе адреса бэкенда сервера. ProxyPass
и директива ProxyPassReverse
используют пул балансировки нагрузки с именем mycluster
вместо конкретного сервера.
Если вы следовали примеру на шаге 2, используя 127.0.0.1:8080
и 127.0.0.1:8081
для директивы BalancerMember
, как написано в блоке выше. Если у вас есть свои собственные серверы приложений, используйте их адреса вместо этих.
Чтобы изменения вступили в силу, перезапустите Apache.
sudo systemctl restart apache2
Зайдите в веб – браузере по адресу http://your_server_ip, вы увидите бэкэнд сервера вместо стандартной страницы Apache. Если вы следовали инструкциям на Шаге 2, обновите страницу несколько раз должен показать Привет, мир! и AndreyEx мир!, То есть обратный прокси – сервер работал и балансировка нагрузки между обоими серверами.
Теперь вы знаете , как настроить Apache в качестве обратного прокси – сервера для одного или нескольких основных серверов приложений. mod_proxy
можно эффективно использовать для настройки обратного прокси – сервера для серверов приложений, написанных на широкий спектр языков и технологий, таких как Python и Django или Ruby, и Ruby On Rails. Он может также использоваться для балансировки трафика между множеством внутренних серверов для сайтов с большим количеством трафика или для обеспечения высокой доступности через несколько серверов, или для обеспечения безопасной поддержки SSL на серверах, не поддерживающих SSL изначально.
В то время как mod_proxy
с mod_proxy_http
это, возможно, наиболее часто используемые комбинации модулей, существует несколько других , которые поддерживают различные сетевые протоколы. Мы не использовали их здесь, но и некоторые другие популярные модули включают в себя:
mod_proxy_ftp
для FTP.mod_proxy_connect
для SSL туннелирования.mod_proxy_ajp
для AJP (Apache JServ Protocol), как Tomcat на основе движков.mod_proxy_wstunnel
для веб-сокетов.Чтобы узнать больше о mod_proxy
, вы можете прочитать на официальном сайте Apache документацию о mod_proxy
.
Автору огромный респект за проделанную работу.
Возникает один вопрос: А что если серверов бекэнда несколько, к примеру: aa.zz, ss.cc и т.д и т.п.. И как быть в такой ситуации? Т.е. я имею ввиду, как адреса aa.zz и ss.cc отрозить в вируальным хосте (в конфиге)? Все в один файл, 000-default.conf и у каждого сервера своя строчка ProxyPass и ProxyPassReverse??? Спасибо за ранее