Spec-Zone.ru › Apache HTTP Server

Модуль Apache mod_proxy_fcgi

Описание: Модуль поддержки FastCGI для mod_proxy
Статус: Расширение
Идентификатор модуля: proxy_fcgi_module
Файл исходного кода: mod_proxy_fcgi.c
Совместимость: Доступен в версии 2.3 и более поздних

Резюме

Этот модуль требует службы mod_proxy. Он обеспечивает поддержку протокола FastCGI.

Таким образом, для получения возможности обработки протокола FastCGI, mod_proxy и mod_proxy_fcgi должны присутствовать в сервере.

В отличие от mod_fcgid и mod_fastcgi, mod_proxy_fcgi не предусматривает запуска процесса приложения; fcgistarter (на некоторых платформах) предназначен для этой цели. В качестве альтернативы, внешний запуск или управление процессами могут быть доступны в используемой инфраструктуре приложения FastCGI.

Предупреждение

Не активируйте проксирование, пока не обеспечите безопасность вашего сервера. Открытые прокси-серверы представляют опасность как для вашей сети, так и для Интернета в целом.

Примеры

Помните, для работы следующих примеров необходимо активировать mod_proxy и mod_proxy_fcgi.

Один экземпляр приложения

ProxyPass "/myapp/" "fcgi://localhost:4000/"

mod_proxy_fcgi по умолчанию отключает повторное использование соединения, поэтому после завершения запроса соединение НЕ будет сохранено процессом httpd и не будет повторно использовано. Если приложение FastCGI способно обрабатывать одновременные подключения от httpd, вы можете включить повторное использование соединения, как показано в следующем примере:

Один экземпляр приложения, повторное использование соединения (2.4.11 и более поздние версии)

ProxyPass "/myapp/" "fcgi://localhost:4000/" enablereuse=on

Включить повторное использование соединения с FCGI-бекендом, например, PHP-FPM

Обратите внимание, что PHP-FPM (на момент написания, февраль 2018 года) использует модель prefork, то есть каждый из его рабочих процессов может обрабатывать по одному соединению за раз.
По умолчанию mod_proxy (настроенный с enablereuse=on) позволяет пул соединений размером ThreadsPerChild с бэкендом для каждого процесса httpd при использовании многопоточного mpm (например, worker или event), поэтому необходимо учитывать следующие случаи использования:

  • Под нагрузкой HTTP/1.1, вероятно, будет создано до MaxRequestWorkers подключений к FCGI-бекенду.
  • Под нагрузкой HTTP/2, из-за того, как реализован mod_http2, есть дополнительные потоки h2 worker, которые могут заставить создать дополнительные подключения к бэкенду. Общее количество подключений в пулах может возрасти более чем до MaxRequestWorkers.

Максимальное количество рабочих процессов PHP-FPM необходимо настроить разумно, так как есть вероятность, что все они окажутся «заняты» обработкой неактивных постоянных соединений, без возможности создания новых, и пользовательский опыт будет похож на кучу таймаутов запросов HTTP.

В следующем примере путь запроса URI передается как путь к файловой системе для демона PHP-FPM. Запрос URL неявно добавляется ко второму параметру. Хост и порт после fcgi:// — это место, где прослушивает PHP-FPM. Включено пул соединений/повторное использование.

PHP-FPM

ProxyPassMatch "^/myapp/.*\.php(/.*)?$" "fcgi://localhost:9000/var/www/" enablereuse=on

В следующем примере путь запроса URI передается как путь к файловой системе для демона PHP-FPM. В этом случае PHP-FPM прослушивает сокет доменной unix-системы (UDS). Требуется версия 2.4.9 или более поздняя. С этим синтаксисом имя хоста и необязательный порт после fcgi:// игнорируются.

PHP-FPM с UDS

ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php5-fpm.sock|fcgi://localhost/var/www/"

Сбалансированный шлюз нуждается в mod_proxy_balancer и по меньшей мере в одном модуле алгоритма балансировки нагрузки, таком как mod_lbmethod_byrequests, помимо перечисленных выше модулей прокси. mod_lbmethod_byrequests по умолчанию и будет использоваться для этой конфигурации примера.

Сбалансированный шлюз для нескольких экземпляров приложения

ProxyPass "/myapp/" "balancer://myappcluster/"
<Proxy "balancer://myappcluster/">
    BalancerMember "fcgi://localhost:4000"
    BalancerMember "fcgi://localhost:4001"
</Proxy>

Вы также можете принудительно обработать запрос как запрос обратного проксирования, создав соответствующий пропуск обработчика. Нижеприведенная конфигурация примера передаст все запросы для скриптов PHP на указанный сервер FastCGI с использованием обратного проксирования. Эта функция доступна в Apache HTTP Server 2.4.10 и более поздних версиях. По соображениям производительности вы захотите определить рабочий процесс, представляющий тот же бэкенд fcgi://. Преимущество этой формы заключается в том, что она позволяет использовать стандартное сопоставление URI с именем файла на сервере, а локальный результат файловой системы передается бэкенду. При такой конфигурации FastCGI сервер может рассчитать наиболее точное значение PATH_INFO.

Прокси через обработчик

<FilesMatch "\.php$">
    # Note: The only part that varies is /path/to/app.sock
    SetHandler  "proxy:unix:/path/to/app.sock|fcgi://localhost/"
</FilesMatch>

# Define a matching worker.
# The part that is matched to the SetHandler is the part that
# follows the pipe. If you need to distinguish, "localhost; can
# be anything unique.
<Proxy "fcgi://localhost/" enablereuse=on max=10>
</Proxy>

<FilesMatch ...>
    SetHandler  "proxy:fcgi://localhost:9000"
</FilesMatch>

<FilesMatch ...>
    SetHandler  "proxy:balancer://myappcluster/"
</FilesMatch>

Переменные среды

В дополнение к директивам конфигурации, которые управляют поведением mod_proxy, существует ряд переменных среды, которые управляют поставщиком протокола FCGI:

proxy-fcgi-pathinfo
При настройке через ProxyPass или ProxyPassMatch, mod_proxy_fcgi не будет устанавливать переменную среды PATH_INFO. Это позволяет бэкенд-серверу FCGI правильно определить SCRIPT_NAME и Script-URI и соответствовать RFC 3875 раздел 3.3. Если вместо этого вам нужно, чтобы mod_proxy_fcgi сгенерировал "предположение" для PATH_INFO, установите эту переменную среды. Это обходной путь для ошибки в некоторых реализациях FCGI. Эта переменная может быть установлена ​​с несколькими значениями, чтобы настроить способ выбора лучшего предположения (только в версиях 2.4.11 и более поздних):
first-dot
PATH_INFO разделяется с косой чертой, следующей за первым «.» в URL.
last-dot
PATH_INFO разделяется с косой чертой, следующей за последним «.» в URL.
full
PATH_INFO вычисляется путем попытки сопоставить URL с локальной файловой системой.
unescape
PATH_INFO — это компонент пути URL, необработанный / декодированный.
любое другое значение
PATH_INFO — это то же самое, что и компонент пути URL. Первоначально это была единственная опция proxy-fcgi-pathinfo.

Директива ProxyFCGIBackendType

Описание: Укажите тип бэкенд-приложения FastCGI
Синтаксис:
ProxyFCGIBackendType FPM|GENERIC
Значение по умолчанию:
ProxyFCGIBackendType FPM
Контекст: конфигурация сервера, виртуальный хост, каталог, .htaccess
Статус: Расширение
Модуль: mod_proxy_fcgi
Совместимость: Доступен в версии 2.4.26 и более поздних

Эта директива позволяет указать тип бэкенд-приложения FastCGI. Некоторые серверы FastCGI, такие как PHP-FPM, используют исторические особенности переменных среды для определения типа используемого прокси-сервера. Установите эту директиву в «GENERIC», если ваше приложение, не являющееся PHP-FPM, имеет проблемы с интерпретацией переменных среды, таких как SCRIPT_FILENAME или PATH_TRANSLATED, заданных сервером.

Один из примеров значений, изменяющихся в зависимости от настройки этой директивы, — SCRIPT_FILENAME. При историческом использовании mod_proxy_fcgi, SCRIPT_FILENAME предварялся строкой «proxy:fcgi://». Эта переменная — то, что некоторые универсальные приложения FastCGI считали бы своим входным скриптом, но PHP-FPM удалял префикс, затем запоминал, что он взаимодействовал с Apache. В версиях 2.4.21–2.4.25 этот префикс автоматически удалялся сервером, что нарушало способность PHP-FPM определять и взаимодействовать с Apache в некоторых сценариях.

Директива ProxyFCGISetEnvIf

Описание: Разрешить изменение переменных, отправляемых серверам FastCGI
Синтаксис:
ProxyFCGISetEnvIf conditional-expression [!]environment-variable-name [value-expression]
Контекст: конфигурация сервера, виртуальный хост, каталог, .htaccess
Статус: Расширение
Модуль: mod_proxy_fcgi
Совместимость: Доступен в версии 2.4.26 и более поздних

Непосредственно перед передачей запроса на настроенный сервер FastCGI ядро веб-сервера устанавливает ряд переменных среды на основе деталей текущего запроса. Программы FastCGI часто используют эти переменные среды в качестве входных данных, определяющих, какие основополагающие скрипты они будут обрабатывать, или какой вывод они будут генерировать напрямую.

Примеры важных переменных среды:

  • SCRIPT_NAME
  • SCRIPT_FILENAME
  • REQUEST_URI
  • PATH_INFO
  • PATH_TRANSLATED

Эта директива позволяет переопределить указанные выше переменные среды или любые другие переменные, представляющие интерес. Эта директива вычисляется после первоначальной установки значений этих переменных, поэтому их можно использовать в качестве входных данных как для выражений условия, так и для выражений значения.

Синтаксис параметра:

conditional-expression
Указывает выражение, которое управляет тем, будет ли изменен следующий за ним параметр переменной среды. Подробную информацию о синтаксисе выражения см. в примерах ниже или в полном описании в документации по ap_expr.
environment-variable-name
Указывает имя CGI-переменной среды, которую нужно изменить, например, PATH_INFO. Если перед именем стоит знак восклицания (!), переменная будет удалена.
value-expression
Указывает значение замены для предыдущей переменной среды. Можно использовать обратные ссылки, например "$1", из захватов регулярных выражений в conditional-expression. Если опущено, переменная устанавливается (или переопределяется) пустой строкой — но см. Примечание ниже.
# A basic, unconditional override
ProxyFCGISetEnvIf "true" PATH_INFO "/example"

# Use an environment variable in the value
ProxyFCGISetEnvIf "true" PATH_INFO "%{reqenv:SCRIPT_NAME}"

# Use captures in the conditions and backreferences in the replacement
ProxyFCGISetEnvIf "reqenv('PATH_TRANSLATED') =~ m|(/.*prefix)(\d+)(.*)|" PATH_TRANSLATED "$1$3"

Примечание: Удаление против Пустой строки

Следующее действие удалит VARIABLE, предотвращая его отправку на сервер FastCGI:
ProxyFCGISetEnvIf true !VARIABLE
В то время как следующее действие удалит любое существующее значение VARIABLE (установив его в пустую строку), но пустая VARIABLE все равно будет отправлена ​​на сервер:
ProxyFCGISetEnvIf true VARIABLE
Спецификация CGI/1.1 не различает переменную с пустым значением и переменную, которая не существует. Однако многие реализации CGI и FastCGI различают (или позволяют скриптам различать) эти два случая. Выбор, какой использовать, зависит от вашей реализации и ваших целей при изменении переменной.

© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_proxy_fcgi.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API