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

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

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

  • При нагрузке HTTP/1.1 это, вероятно, приведёт к созданию до MaxRequestWorkers соединений с сервером FastCGI.
  • При нагрузке HTTP/2 из-за особенностей реализации mod_http2 могут появиться дополнительные рабочие потоки h2, которые приведут к созданию других соединений с сервером. Общее количество соединений в пулах может превысить 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>

Также можно принудительно обрабатывать запрос как запрос обратного прокси-сервера, создав подходящий обработчик pass-through. Приведённая ниже конфигурация будет передавать все запросы к 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, существует ряд переменных окружения, которые управляют поставщиком протокола FastCGI:

proxy-fcgi-pathinfo
При настройке через ProxyPass или ProxyPassMatch, mod_proxy_fcgi не устанавливает переменную окружения PATH_INFO. Это позволяет серверу FastCGI на стороне приложения правильно определить SCRIPT_NAME и Script-URI и соответствовать разделу 3.3 RFC 3875. Если вместо этого требуется, чтобы mod_proxy_fcgi генерировал «наиболее вероятное» значение PATH_INFO, задайте эту переменную окружения. Это обходной путь для ошибки в некоторых реализациях FastCGI. Этой переменной можно задать несколько значений, чтобы изменить способ выбора наиболее вероятного значения (только в версии 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, используют исторически сложившиеся особенности переменных окружения, чтобы определить тип используемого прокси-сервера. Если у приложения, отличного от PHP-FPM, возникают проблемы с интерпретацией переменных окружения, таких как SCRIPT_FILENAME или PATH_TRANSLATED, заданных сервером, установите для этой директивы значение "GENERIC".

Один из примеров значений, меняющихся в зависимости от настройки этой директивы, — 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

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

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

условное-выражение
Задаёт выражение, определяющее, следует ли изменить следующую за ним переменную окружения. Сведения о синтаксисе выражений см. в приведённых ниже примерах или в полной спецификации в документации ap_expr.
имя-переменной-окружения
Задаёт переменную окружения CGI, которую необходимо изменить, например PATH_INFO. Если перед именем стоит восклицательный знак, переменная будет удалена.
выражение-значения
Задаёт новое значение предыдущей переменной окружения. Можно использовать обратные ссылки, например "$1", полученные из совпадений с регулярным выражением в условном-выражении. Если параметр не указан, переменной присваивается (или вместо её значения устанавливается) пустая строка — см. примечание ниже.
# 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