Руководство по обратному прокси
Помимо функций «обычного» веб-сервера и предоставления конечным пользователям статического и динамического содержимого, Apache httpd (как и большинство других веб-серверов) может также выступать в роли сервера обратного прокси, также известного как сервер «шлюза».
В таких сценариях httpd сам не генерирует и не размещает данные. Вместо этого содержимое предоставляется одним или несколькими внутренними серверами, которые обычно не имеют прямого подключения к внешней сети. Получив запрос от клиента, httpd перенаправляет его через прокси на один из этих внутренних серверов. Тот обрабатывает запрос, генерирует содержимое и отправляет его обратно в httpd, который затем формирует фактический HTTP-ответ клиенту.
Для такой реализации существует множество причин, но обычно к ней прибегают в целях безопасности, обеспечения высокой доступности, балансировки нагрузки и централизованной аутентификации/авторизации. При такой реализации крайне важно изолировать и защитить структуру, дизайн и архитектуру внутренней инфраструктуры (серверов, которые фактически обрабатывают запросы) от внешнего мира: с точки зрения клиента обратный прокси-сервер является единственным источником всего содержимого.
Типичная реализация показана ниже:
Обратный прокси
| Связанные модули | Связанные директивы |
|---|---|
Простая настройка обратного прокси
Директива ProxyPass задаёт соответствие входящих запросов внутреннему серверу (или кластеру серверов, называемому группой Balancer). В самом простом случае все запросы ("/") перенаправляются на один внутренний сервер:
ProxyPass "/" "http://www.example.com/"
Чтобы заголовки Location:, сформированные внутренним сервером, указывали на обратный прокси, а не на сам внутренний сервер, чаще всего требуется директива ProxyPassReverse:
ProxyPass "/" "http://www.example.com/" ProxyPassReverse "/" "http://www.example.com/"
Как показано в этом примере, через прокси можно перенаправлять только запросы к определённым URI:
ProxyPass "/images" "http://www.example.com/" ProxyPassReverse "/images" "http://www.example.com/"
В приведённом выше примере все запросы, начинающиеся с пути /images, будут перенаправляться на указанный внутренний сервер, а остальные будут обрабатываться локально.
Кластеры и балансировщики
Несмотря на полезность описанного выше решения, у него всё же есть недостатки: если единственный внутренний узел выйдет из строя или будет перегружен, перенаправление запросов не даст реальных преимуществ. Необходимо иметь возможность определять набор или группу внутренних серверов, способных обрабатывать такие запросы, чтобы обратный прокси мог балансировать нагрузку между ними и переключаться на резервные серверы при сбоях. Такую группу иногда называют кластером, но в Apache httpd для неё используется термин балансировщик. Балансировщик определяется с помощью директив <Proxy> и BalancerMember, как показано ниже:
<Proxy balancer://myset>
BalancerMember http://www2.example.com:8080
BalancerMember http://www3.example.com:8080
ProxySet lbmethod=bytraffic
</Proxy>
ProxyPass "/images/" "balancer://myset/"
ProxyPassReverse "/images/" "balancer://myset/" Схема balancer:// сообщает httpd, что мы создаём набор балансировщика с именем myset. В него входят 2 внутренних сервера, которые httpd называет BalancerMembers. В данном случае любые запросы к /images будут перенаправляться на один из двух внутренних серверов. Директива ProxySet указывает, что балансировщик myset должен использовать алгоритм балансировки нагрузки на основе объёма операций ввода-вывода.
Примечание
BalancerMembers также иногда называют рабочими узлами.
Настройка балансировщика и BalancerMember
Можно настроить множество параметров балансировщиков и рабочих узлов с помощью различных параметров, определённых в ProxyPass. Например, если мы хотим, чтобы http://www3.example.com:8080 обрабатывал в 3 раза больше трафика с тайм-аутом в 1 секунду, настройки нужно изменить следующим образом:
<Proxy balancer://myset>
BalancerMember http://www2.example.com:8080
BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
ProxySet lbmethod=bytraffic
</Proxy>
ProxyPass "/images" "balancer://myset/"
ProxyPassReverse "/images" "balancer://myset/" Переключение при сбое
Можно также точно настроить различные сценарии переключения при сбое, указав, к каким рабочим узлам и даже балансировщикам следует обращаться в таких случаях. Например, приведённая ниже настройка реализует три сценария переключения при сбое:
-
http://spare1.example.com:8080иhttp://spare2.example.com:8080будут получать трафик только в том случае, если один или оба узлаhttp://www2.example.com:8080илиhttp://www3.example.com:8080недоступны. (Один резервный узел будет использоваться для замены одного неисправного узла в том же наборе балансировщика.) -
http://hstandby.example.com:8080будет получать трафик только в том случае, если все остальные рабочие узлы в наборе балансировщика0недоступны. - Если все рабочие узлы, резервные узлы и резервный узел ожидания из набора балансировщика
0недоступны, только тогда в обработку будут включены рабочие узлыhttp://bkup1.example.com:8080иhttp://bkup2.example.com:8080из набора балансировщика1.
Таким образом, для каждого набора балансировщика можно настроить один или несколько горячих резервных узлов и резервных узлов ожидания.
<Proxy balancer://myset>
BalancerMember http://www2.example.com:8080
BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
BalancerMember http://spare1.example.com:8080 status=+R
BalancerMember http://spare2.example.com:8080 status=+R
BalancerMember http://hstandby.example.com:8080 status=+H
BalancerMember http://bkup1.example.com:8080 lbset=1
BalancerMember http://bkup2.example.com:8080 lbset=1
ProxySet lbmethod=byrequests
</Proxy>
ProxyPass "/images/" "balancer://myset/"
ProxyPassReverse "/images/" "balancer://myset/" При переключении в случае сбоя горячие резервные узлы заменяют неисправные узлы в том же наборе балансировщика. Рабочий узел считается неисправным, если он находится в режиме вывода из эксплуатации, остановлен или иным образом пребывает в состоянии ошибки/сбоя. Горячие резервные узлы ожидания используются, если все рабочие и резервные узлы в наборе балансировщика недоступны. Наборы балансировщика (с соответствующими горячими резервными узлами и узлами ожидания) всегда проверяются по порядку, от наименьшего значения к наибольшему.
Менеджер балансировщика
Одна из самых уникальных и полезных функций обратного прокси Apache httpd — встроенное приложение balancer-manager. Подобно mod_status, balancer-manager отображает текущую рабочую конфигурацию и состояние включённых балансировщиков и используемых рабочих узлов. При этом он не только показывает эти параметры, но и позволяет динамически изменять почти все из них во время работы, в том числе добавлять новые BalancerMembers (рабочие узлы) в существующий балансировщик. Чтобы включить эту возможность, добавьте в конфигурацию следующее:
<Location "/balancer-manager">
SetHandler balancer-manager
Require host localhost
</Location> Предупреждение
Не включайте balancer-manager, пока не защитите сервер. В частности, убедитесь, что доступ к URL строго ограничен.
При обращении к обратному прокси-серверу по этому URL (например: http://rproxy.example.com/balancer-manager/) вы увидите страницу, похожую на приведённую ниже:

Эта форма позволяет администратору DevOps изменять различные параметры, отключать рабочие узлы, менять алгоритмы балансировки нагрузки и добавлять новые рабочие узлы. Например, при нажатии на сам балансировщик откроется следующая страница:

При нажатии на рабочий узел отображается эта страница:

Чтобы эти изменения сохранялись после перезапуска обратного прокси, убедитесь, что включён параметр BalancerPersist.
Динамическая проверка работоспособности
Перед тем как httpd перенаправит запрос на рабочий узел, он может «проверить», доступен ли этот узел. Для этого задайте параметр ping для данного узла с помощью ProxyPass. Зачастую полезнее проверять работоспособность рабочих узлов вне основного потока обработки, динамически. В Apache httpd это реализуется с помощью модуля mod_proxy_hcheck.
Флаги состояния BalancerMember
В balancer-manager отображается текущее состояние, или статус, рабочего узла; его можно установить или сбросить. Значения статусов описаны ниже:
| Флаг | Строка | Описание |
|---|---|---|
| Ok | Рабочий узел доступен | |
| Init | Рабочий узел инициализирован | |
D |
Dis | Рабочий узел отключён и не будет принимать запросы; будут автоматически предприниматься повторные попытки. |
S |
Stop | Рабочий узел остановлен администратором; он не будет принимать запросы, и автоматические повторные попытки предприниматься не будут. |
I |
Ign | Рабочий узел работает в режиме игнорирования ошибок и всегда будет считаться доступным. |
R |
Spar | Рабочий узел является горячим резервным узлом. Для каждого неисправного рабочего узла в заданном наборе балансировщика (находящегося в режиме вывода из эксплуатации, остановленного, в состоянии ошибки и т. д.) вместо него будет использоваться доступный горячий резервный узел из того же набора. Горячие резервные узлы помогают обеспечить постоянную доступность заданного числа рабочих узлов для балансировщика. |
H |
Stby | Рабочий узел находится в режиме горячего ожидания и будет использоваться только в том случае, если в наборе балансировщика нет других доступных рабочих или резервных узлов. |
E |
Err | Рабочий узел находится в состоянии ошибки, обычно из-за сбоя проверки перед обработкой запроса; запросы не будут перенаправляться на этот узел, но повторные попытки будут предприниматься в зависимости от значения параметра retry для этого узла. |
N |
Drn | Рабочий узел находится в режиме вывода из эксплуатации: он будет принимать только существующие привязанные сеансы, предназначенные для него, и игнорировать все остальные запросы. |
C |
HcFl | Рабочий узел не прошёл динамическую проверку работоспособности и не будет использоваться, пока не пройдёт последующие проверки. |
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/howto/reverse_proxy.html