Обратный прокси – сервер представляет собой тип прокси – сервера, который принимает HTTP (S) запросы и прозрачно распределяет их на один или несколько внутренних серверов. Обратные прокси – серверы являются полезными, поскольку многие современные веб – приложения обработки входящих запросов HTTP с использованием серверов приложений бэкэнда, не должны быть доступны пользователям напрямую и часто поддерживают только элементарные функции HTTP.
Вы можете использовать обратный прокси-сервер для предотвращения от непосредственного доступа этих основных серверов приложений. Он также может быть использован для распределения нагрузки от входящих запросов на нескольких различных серверах приложений, увеличивая производительность в масштабе и обеспечение отказоустойчивости. Он может заполнить пробелы с функциями сервера приложений, которые не предлагают, такое как кэширование, сжатие или шифрование SSL.
В этом учебном пособии вы настроите Apache в качестве основного обратного прокси – сервера с помощью расширения mod_proxy
для перенаправления входящих подключений к одному или нескольким внутренним серверам, работающих в той же сети. Этот учебник использует простой бэкенд написанный на Flask web framework, но вы можете использовать любой сервер данных, который вы предпочитаете.
Предпосылки
Следуя этому руководству, вам потребуется:
- Один сервер с Debian 8 с первоначальной настройкой сервера.
- Apache 2, установленный на сервере, следуя гиду, как установить Linux, Apache, MySQL, PHP (LAMP) на Debian 8.
Шаг 1 – Включение необходимых модулей Apache
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.
Шаг 2 – Создание внутренних тестовых серверов
Запуск некоторых простых внутренних серверов является простой способ проверить, что ваша конфигурация Apache работает должным образом. Здесь мы сделаем два тестовых сервера, которые отвечают HTTP – запросам с печатью строки текста. Один сервер скажет ‘Привет , мир! а другой скажет ‘AndreyEx мир! ,
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 мир!
На следующем шаге мы будем изменять конфигурационный файл Apache, чтобы включить его использование в качестве обратного прокси-сервера на Debian 8.
Шаг 3 – Изменение конфигурации по умолчанию. Включение обратного прокси-сервера
В этом разделе мы настроим Apache виртуальный хост по умолчанию, чтобы служить в качестве обратного прокси-сервера для одного сервера бэкэнд или массив с балансировкой нагрузки внутренних серверов.
Откройте файл по умолчанию Apache конфигурации, используя nano
или ваш любимый текстовый редактор.
sudo nano /etc/apache2/sites-available/000-default.conf
Внутри этого файла вы найдете блок<VirtualHost *:80>
, начиная с первой строки. В первом примере ниже показано, как настроить этот блок для обратного прокси – сервера для одного сервера бэкэнда, а второй устанавливает балансировкой нагрузки обратного прокси для нескольких внутренних серверов.
Пример 1 – Обратное проксирование сервера
Заменить все содержимое внутри блока 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, то вы будете видеть Привет мир!
Пример 2 – балансировки нагрузки между несколькими серверами Backend
Если у вас есть несколько внутренних серверов, хороший способ распределить трафик между ними, когда проксирование заключается в использовании балансировки нагрузки функции 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
.