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