Модуль 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