Описание: | Сопоставляет удаленные серверы с адресным пространством локального сервера. |
Синтаксис: | ProxyPass [path] !|url [key=value
[key=value ...]] [nocanon] [interpolate] [noquery] |
Контекст: | конфигурация сервера, виртуальный хост, каталог |
Статус: | Расширение |
Модуль: | mod_proxy |
Совместимость: | Поддержка Unix Domain Socket (UDS) добавлена в версии 2.4.7. |
Эта директива позволяет отображать удаленные серверы в пространство локального сервера. Локальный сервер не действует как прокси в обычном смысле, а является зеркалом удаленного сервера. Локальный сервер часто называют обратным прокси или шлюзом . Путь — это имя локального виртуального пути; url является частичным URL-адресом удаленного сервера и не может включать строку запроса.
Настоятельно рекомендуется просмотреть концепцию работника, прежде чем продолжить изучение этого раздела. Эта директива не поддерживается внутри
контейнеров
<Directory>
и
<Files>
. Директиву
ProxyRequests
обычно следует отключать
при использовании
ProxyPass
.
В версии 2.4.7 и более поздних версиях поддержка использования сокета домена Unix доступна при использовании цели, которая начинается с unix:/path/lis.sock|
. Например, чтобы проксировать HTTP и нацелить UDS на /home/www/socket, вы должны использовать
unix:/home/www.socket|http://localhost/whatever/
.
Примечание. Путь, связанный с
unix:
URL-адресом,
DefaultRuntimeDir
известен.
При использовании внутри <Location>
раздела первый аргумент опускается, а локальный каталог получается из файла <Location>
. То же самое произойдет внутри
<LocationMatch>
раздела; ProxyPassMatch
однако ProxyPass не интерпретирует регулярное выражение как таковое, поэтому в этой ситуации необходимо использовать вместо него.
Предположим, что локальный сервер имеет адрес http://example.com/
; затем
<Location "/mirror/foo/">
ProxyPass "http://backend.example.com/"
</Location>
приведет к
http://example.com/mirror/foo/bar
внутреннему преобразованию локального запроса в прокси-запрос к http://backend.example.com/bar
.
Если вам требуется более гибкая конфигурация обратного прокси-сервера, см.
RewriteRule
директиву с
[P]
флагом.
Возможен следующий альтернативный синтаксис; однако он может привести к снижению производительности, если он присутствует в очень большом количестве. Преимущество приведенного ниже синтаксиса заключается в том, что он позволяет осуществлять динамическое управление через интерфейс Balancer Manager:
ProxyPass "/mirror/foo/" "http://backend.example.com/"
Если первый аргумент заканчивается символом / , второй аргумент также должен заканчиваться символом / , и наоборот. В противном случае результирующие запросы к серверной части могут пропустить некоторые необходимые косые черты и не предоставить ожидаемых результатов.
Директива !
полезна в ситуациях, когда вы не хотите использовать обратный прокси для подкаталога, например
<Location "/mirror/foo/">
ProxyPass "http://backend.example.com/"
</Location>
<Location "/mirror/foo/i">
ProxyPass "!"
</Location>
ProxyPass "/mirror/foo/i" "!"
ProxyPass "/mirror/foo" "http://backend.example.com"
будет проксировать все запросы к, /mirror/foo
кроме
backend.example.com
запросов , сделанных к
/mirror/foo/i
.
Заказ директив ProxyPass
Настроенные ProxyPass
и ProxyPassMatch
правила проверяются в порядке настройки. Выигрывает первое совпадающее правило. Поэтому обычно вы должны сортировать конфликтующие
ProxyPass
правила, начиная с самых длинных URL-адресов. В противном случае более поздние правила для более длинных URL-адресов будут скрыты любым более ранним правилом, использующим начальную подстроку URL-адреса. Обратите внимание, что существует некоторая связь с совместным использованием рабочих процессов. Напротив,
ProxyPass
в блоке может быть размещена только одна директива Location
, и более конкретное расположение будет иметь приоритет.
По тем же причинам исключения должны предшествовать общим директивам ProxyPass
. В версии 2.4.26 и более поздних версиях переменная среды «без прокси» является альтернативой исключениям и единственным способом настроить исключение директивы ProxyPass
в Location
контексте. Эта переменная должна быть установлена с помощью SetEnvIf
, так как SetEnv
она не оценивается достаточно рано.
key=value
Параметры проксипасса
В Apache HTTP Server 2.1 и более поздних версиях mod_proxy поддерживает соединения в пуле с внутренним сервером. Подключения, созданные по запросу, можно сохранить в пуле для использования в будущем. Ограничения на размер пула и другие настройки можно закодировать в ProxyPass
директиве с помощью key=value
параметров, описанных в таблицах ниже.
Максимальное количество подключений к серверной части
По умолчанию mod_proxy разрешает и сохраняет максимальное количество подключений, которые могут использоваться одновременно этим дочерним процессом веб-сервера. Используйте max
параметр, чтобы уменьшить число по умолчанию. Пул соединений поддерживается для каждого дочернего процесса веб-сервера, а max
другие параметры не согласовываются между всеми дочерними процессами, за исключением случаев, когда только один дочерний процесс разрешен конфигурацией или дизайном MPM.
Используйте ttl
параметр, чтобы установить необязательное время жизни; соединения, которые не использовались в течение как минимум
ttl
секунд, будут закрыты. ttl
можно использовать, чтобы избежать использования соединения, которое может быть закрыто из-за тайм-аута поддержания активности внутреннего сервера.
Пример
ProxyPass "/example" "http://backend.example.com" max=20 ttl=120 retry=300
Параметры Worker|BalancerMember |
---|
Параметр |
По умолчанию |
Описание |
мин |
0 |
Минимальное количество записей пула соединений, не связанное с фактическим количеством соединений. Его нужно изменить только по умолчанию для особых обстоятельств, когда память кучи, связанная с внутренними соединениями, должна быть предварительно выделена или сохранена. |
Макс |
1...н |
Максимальное количество разрешенных подключений к внутреннему серверу. По умолчанию для этого ограничения используется количество потоков на процесс в активном MPM. В Prefork MPM это всегда 1, в то время как в других MPM оно управляется директивой
ThreadsPerChild . |
смакс |
Макс |
Сохраненные записи пула соединений, превышающие этот предел, освобождаются во время определенных операций, если они не использовались дольше, чем время жизни, контролируемое параметром ttl . Если запись пула соединений имеет связанное соединение, оно будет закрыто. Его нужно изменить только по умолчанию для особых обстоятельств, когда записи пула соединений и любые связанные соединения, которые превысили время жизни, должны быть освобождены или закрыты более агрессивно. |
приобретать |
- |
Если установлено, это будет максимальное время ожидания свободного соединения в пуле соединений в миллисекундах. Если в пуле нет свободных подключений, Apache httpd вернет SERVER_BUSY
статус клиенту.
|
время соединения вышло |
тайм-аут |
Время ожидания подключения в секундах. Количество секунд, в течение которых Apache httpd ожидает завершения создания соединения с серверной частью. Добавляя постфикс мс, время ожидания также можно установить в миллисекундах.
|
отключитьповторное использование |
Выключенный |
Этот параметр следует использовать, если вы хотите заставить mod_proxy немедленно закрыть соединение с бэкендом после использования и, таким образом, отключить его постоянное соединение и пул для этого бэкэнда. Это помогает в различных ситуациях, когда брандмауэр между Apache httpd и внутренним сервером (независимо от протокола) имеет тенденцию молча сбрасывать соединения или когда сами внутренние серверы могут находиться под DNS с циклическим перебором. Когда повторное использование соединения включено, каждый серверный домен разрешается (с DNS-запросом) только один раз для дочернего процесса и кэшируется для всех дальнейших подключений, пока дочерний процесс не будет перезапущен. Чтобы отключить повторное использование соединения, установите для этого свойства значение On .
|
разрешить повторное использование |
На |
Это действие, обратное описанному выше 'disablereuse', предоставляется для удобства обработчиков схем, которым требуется разрешение на повторное использование соединения (например, mod_proxy_fcgi ). 2.4.11 и выше только.
|
флеш-пакеты |
выключенный |
Определяет, будет ли прокси-модуль автоматически сбрасывать выходную группу после каждого «куска» данных. «выкл» означает, что он будет сбрасываться только при необходимости; «on» означает после отправки каждого фрагмента; а «авто» означает опрос/ожидание в течение определенного периода времени и сброс, если в течение миллисекунд «flushwait» не было получено никаких входных данных. В настоящее время это действует только для AJP.
|
флешвейт |
10 |
Время ожидания дополнительных входных данных в миллисекундах перед сбросом выходной группы, если для параметра «flushpackets» установлено значение «auto».
|
iobuffersize |
8192 |
Регулирует размер внутреннего буфера ввода-вывода блокнота. Это позволяет вам переопределить ProxyIOBufferSize для конкретного работника. Это должно быть не менее 512 или установлено значение 0 для системного значения по умолчанию 8192.
|
поддержка активности |
Выключенный |
Этот параметр следует использовать, если у вас есть брандмауэр между вашим Apache httpd и внутренним сервером, который имеет тенденцию сбрасывать неактивные соединения. Этот флаг укажет операционной системе отправлять KEEP_ALIVE
сообщения о неактивных соединениях и, таким образом, предотвратит разрыв соединения брандмауэром. Чтобы включить поддержку активности, установите для этого свойства значение On .
Частота начальных и последующих проверок активности TCP зависит от глобальных настроек ОС и может достигать 2 часов. Чтобы быть полезным, частота, настроенная в ОС, должна быть меньше порогового значения, используемого брандмауэром.
|
набор фунтов |
0 |
Задает набор кластеров подсистемы балансировки нагрузки, членом которого является рабочий процесс. Балансировщик нагрузки будет пробовать все элементы lbset с меньшим номером, прежде чем пробовать элементы с более высокими номерами.
|
пинг |
0 |
Свойство Ping указывает веб-серверу «проверить» соединение с серверной частью перед пересылкой запроса. Для AJP вызывает
mod_proxy_ajp отправку CPING
запроса на соединение ajp13 (реализовано на Tomcat 3.3.2+, 4.1.28+ и 5.0.13+). Для HTTP это приводит mod_proxy_http
к отправке 100-Continue на серверную часть (действительно только для HTTP/1.1 — для серверных частей, отличных от HTTP/1.1, это свойство не действует). В обоих случаях параметром является задержка в секундах ожидания ответа. Эта функция была добавлена, чтобы избежать проблем с зависшими и занятыми бэкендами. Это увеличит сетевой трафик во время нормальной работы, что может быть проблемой, но уменьшит трафик, если некоторые из узлов кластера не работают или заняты. Добавляя постфикс мс, задержку также можно установить в миллисекундах.
|
получить размер буфера |
0 |
Настраивает размер явного (TCP/IP) размера сетевого буфера для прокси-соединений. Это позволяет вам переопределить
ProxyReceiveBufferSize для конкретного работника. Это должно быть не менее 512 или установлено значение 0 для системы по умолчанию.
|
перенаправить |
- |
Маршрут перенаправления рабочего. Это значение обычно задается динамически, чтобы обеспечить безопасное удаление узла из кластера. Если установлено, все запросы без идентификатора сеанса будут перенаправлены на BalancerMember, у которого параметр маршрута равен этому значению.
|
повторить попытку |
60 |
Тайм-аут повторной попытки работника пула подключений в секундах. Если рабочий пул подключений к внутреннему серверу находится в состоянии ошибки, Apache httpd не будет пересылать запросы на этот сервер до истечения времени ожидания. Это позволяет отключить внутренний сервер для обслуживания и снова включить его позже. Значение 0 означает, что рабочие процессы всегда повторяются в состоянии ошибки без тайм-аута.
|
маршрут |
- |
Маршрут работника при использовании внутри балансировщика нагрузки. Маршрут — это значение, добавляемое к идентификатору сеанса.
|
положение дел |
- |
Однобуквенное значение, определяющее начальный статус этого воркера.
D: Worker отключен и не будет принимать запросы. |
S: Worker административно остановлен. |
I: Worker находится в режиме игнорирования ошибок и всегда будет считаться доступным. |
H: Рабочий процесс находится в режиме горячего резерва и будет использоваться только в том случае, если нет доступных других жизнеспособных рабочих процессов. |
E: Рабочий процесс находится в состоянии ошибки. |
N: Worker находится в режиме слива и будет принимать только существующие закрепленные сеансы, предназначенные для себя, и игнорировать все остальные запросы. |
Статус можно установить (по умолчанию), поставив перед ним «+», или очистить, добавив перед ним «-». Таким образом, установка «SE» устанавливает этот рабочий процесс в состояние «Остановлен» и сбрасывает флаг ошибки.
|
тайм-аут |
ProxyTimeout |
Время ожидания соединения в секундах. Количество секунд, в течение которых Apache httpd ожидает данные, отправленные / на серверную часть.
|
ттл |
- |
Время жизни для неактивных подключений и связанных записей пула подключений в секундах. После достижения этого предела соединение больше не будет использоваться; он будет закрыт через какое-то время.
|
промыватель |
румянец |
Имя провайдера, используемого mod_proxy_fdpass . См. документацию этого модуля для более подробной информации.
|
секрет |
- |
Значение секрета, используемого mod_proxy_ajp . См. документацию этого модуля для более подробной информации.
|
обновление |
Веб-сокет |
Протокол, принятый в заголовке Upgrade by mod_proxy_wstunnel . См. документацию этого модуля для более подробной информации.
|
Если схема директивы Proxy начинается с
balancer://
(например: balancer://cluster
, любая информация о пути игнорируется), то будет создан виртуальный рабочий процесс, который на самом деле не взаимодействует с внутренним сервером. Вместо этого он отвечает за управление несколькими «настоящими» работниками. В этом случае к этому виртуальному работнику можно добавить специальный набор параметров. mod_proxy_balancer
Для получения дополнительной информации о том, как работает балансировщик,
см .
Параметр |
По умолчанию |
Описание |
фунт-метод |
по запросу |
Балансировочный метод балансировки нагрузки. Выберите метод планировщика балансировки нагрузки для использования. Либо byrequests для выполнения взвешенного подсчета запросов; bytraffic , для выполнения взвешенной балансировки количества байтов трафика; или bybusyness , чтобы выполнить балансировку ожидающих запросов. Значение по умолчанию byrequests .
|
максимальное количество попыток |
На одного меньше, чем количество рабочих, или на 1 с одним рабочим. |
Максимальное количество попыток аварийного переключения перед отказом.
|
отказоустойчивость |
Выключенный |
Если установлено значение On , сеанс прервется, если рабочий процесс находится в состоянии ошибки или отключен. Установите это значение, On если внутренние серверы не поддерживают репликацию сеанса.
|
липкая сессия |
- |
Закрепляемое имя сеанса балансировщика. Это значение обычно имеет что-то вроде JSESSIONID или PHPSESSIONID , и оно зависит от внутреннего сервера приложений, который поддерживает сеансы. Если внутренний сервер приложений использует другое имя для файлов cookie и идентификатор в кодировке URL (например, контейнеры сервлетов), используйте | чтобы разделить их. Первая часть для файла cookie, вторая для пути.
Доступно в Apache HTTP Server 2.4.4 и более поздних версиях.
|
липкая сессия |
"." |
Устанавливает символ разделения в файле cookie сеанса. Некоторые внутренние серверы приложений не используют '.' как символ. Например, сервер Oracle Weblogic использует '!'. С помощью этой опции можно установить правильный символ. Установка «Выкл.» означает, что символ не используется.
|
scolonpathdelim |
Выключенный |
Если установлено значение On , символ точки с запятой ';' будет использоваться в качестве дополнительного липкого разделителя/разделителя пути сеанса. В основном это используется для имитации поведения mod_jk при работе с такими путями, как JSESSIONID=6736bcf34;foo=aabfa
|
тайм-аут |
0 |
Время ожидания балансировщика в секундах. Если установлено, это будет максимальное время ожидания свободного работника. По умолчанию не ждать.
|
отказоустойчивость |
- |
Одиночный или разделенный запятыми список кодов состояния HTTP. Если установлено, это приведет к тому, что рабочий процесс будет находиться в состоянии ошибки, когда серверная часть вернет любой код состояния в списке. Восстановление рабочего процесса происходит так же, как и при других ошибках рабочего процесса.
|
отказоустойчивость |
Выключенный |
Если установлено, тайм-аут чтения ввода-вывода после отправки запроса на серверную часть приведет к переходу рабочего процесса в состояние ошибки. Восстановление рабочего процесса происходит так же, как и при других ошибках рабочего процесса.
Доступно в Apache HTTP Server 2.4.5 и более поздних версиях.
|
одноразовый номер |
<авто> |
Защитный одноразовый номер, используемый на balancer-manager странице приложения. По умолчанию используется автоматически определенный одноразовый номер на основе UUID, чтобы обеспечить дополнительную защиту страницы. Если установлено, то одноразовому номеру присваивается это значение. Параметр None
отключает проверку всех одноразовых номеров.
Примечание
В дополнение к одноразовому номеру balancer-manager страница должна быть защищена с помощью ACL.
|
рост |
0 |
Количество дополнительных BalancerMembers, которые можно добавить к этому балансировщику в дополнение к тем, которые определены в конфигурации.
|
принудительное восстановление |
На |
Принудительное немедленное восстановление всех рабочих процессов без учета параметра повторных попыток рабочих процессов, если все рабочие процессы балансировщика находятся в состоянии ошибки. Могут быть случаи, когда уже перегруженная серверная часть может столкнуться с более серьезными проблемами, если восстановление всех рабочих процессов принудительно выполняется без учета параметра повторной попытки каждого рабочего процесса. В этом случае установите значение Off .
Доступно в Apache HTTP Server 2.4.2 и более поздних версиях.
|
Пример настройки балансировщика:
ProxyPass "/special-area" "http://special.example.com" smax=5 max=10
ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid nofailover=On
<Proxy "balancer://mycluster">
BalancerMember "ajp://1.2.3.4:8009"
BalancerMember "ajp://1.2.3.5:8009" loadfactor=20
# Less powerful server, don't send as many requests there,
BalancerMember "ajp://1.2.3.6:8009" loadfactor=5
</Proxy>
Настройка горячего резерва, который будет использоваться только в том случае, если другие участники недоступны:
ProxyPass "/" "balancer://hotcluster/"
<Proxy "balancer://hotcluster">
BalancerMember "ajp://1.2.3.4:8009" loadfactor=1
BalancerMember "ajp://1.2.3.5:8009" loadfactor=2.25
# The server below is on hot standby
BalancerMember "ajp://1.2.3.6:8009" status=+H
ProxySet lbmethod=bytraffic
</Proxy>
Дополнительные ключевые слова ProxyPass
Обычно mod_proxy канонизирует URL-адреса ProxyPassed. Но это может быть несовместимо с некоторыми бэкендами, особенно с теми, которые используют PATH_INFO . Необязательное ключевое слово nocanon
подавляет это и передает URL-адрес «сырым» в серверную часть. Обратите внимание, что это ключевое слово может повлиять на безопасность вашего бэкэнда, поскольку оно удаляет обычную ограниченную защиту от атак на основе URL, обеспечиваемую прокси-сервером.
Обычно mod_proxy включает строку запроса при создании переменной окружения SCRIPT_FILENAME . Необязательное ключевое слово noquery (доступно в httpd 2.4.1 и более поздних версиях) предотвращает это.
Необязательное ключевое слово interpolate в сочетании с
ProxyPassInterpolateEnv
заставляет ProxyPass интерполировать переменные среды, используя синтаксис
${VARNAME} . Обратите внимание, что многие из стандартных переменных среды, производных от CGI, не будут существовать, когда произойдет эта интерполяция, поэтому вам все равно придется прибегать к mod_rewrite
сложным правилам. Также обратите внимание, что интерполяция не поддерживается в части схемы URL-адреса. Динамическое определение схемы можно выполнить, mod_rewrite
как в следующем примере.
RewriteEngine On
RewriteCond "%{HTTPS}" =off
RewriteRule "." "-" [E=protocol:http]
RewriteCond "%{HTTPS}" =on
RewriteRule "." "-" [E=protocol:https]
RewriteRule "^/mirror/foo/(.*)" "%{ENV:protocol}://backend.example.com/$1" [P]
ProxyPassReverse "/mirror/foo/" "http://backend.example.com/"
ProxyPassReverse "/mirror/foo/" "https://backend.example.com/"