mod_proxy_fcgi
描述: | 适用于mod_proxy的 FastCGI 支持模块 |
状态: | 延期 |
模块标识符: | proxy_fcgi_module |
源文件: | mod_proxy_fcgi.c |
兼容性: | 可在 version 2.3 及更高版本中使用 |
摘要
该模块需要mod_proxy的服务。它为FastCGI协议提供支持。
因此,为了获得处理FastCGI
协议的能力,必须在服务器中存在mod_proxy和mod_proxy_fcgi。
与mod_fcgid和mod_fastcgi不同,mod_proxy_fcgi没有启动 application process 的规定;为此目的提供了fcgistarter(在某些平台上)。或者,可以在正在使用的 FastCGI application framework 中使用外部启动或 process management。
警告
在有保护你的服务器之前不要启用代理。开放代理服务器对您的网络和整个 Internet 都是危险的。
例子
请记住,为了使以下示例有效,您必须启用mod_proxy和mod_proxy_fcgi。
单个 application 实例
ProxyPass "/myapp/" "fcgi://localhost:4000/"
mod_proxy_fcgi默认情况下禁用连接重用,因此在请求完成后,该 httpd 子 process 将不会保持连接打开,并且不会重复使用。如果 FastCGI application 能够处理来自 httpd 的并发连接,则可以 opt-in 连接重用,如下面的示例所示:
单个 application 实例,连接重用(2.4.11 及更高版本)
ProxyPass "/myapp/" "fcgi://localhost:4000/" enablereuse=on
启用连接重用到 FCGI 后端,如 PHP-FPM
请记住 PHP-FPM(在写作时间,2018 年 2 月)使用 prefork model,即每个 worker 进程可以在 time 处理一个连接。
默认情况下 mod_proxy(使用enablereuse=on
配置)允许在使用线程 mpm(如工人或事件)时为每个 httpd process 的后端连接ThreadsPerChild连接池,因此应考虑以下用例:
- 在 HTTP/1.1 加载下,它可能会导致创建最多MaxRequestWorkers连接到 FCGI 后端。
- 在 HTTP/2 load 下,由于mod_http2的实现方式,还有其他 h2 worker 线程可能会强制创建其他后端连接。池中连接的总数可能会增加到MaxRequestWorkers以上。
需要明智地配置 PHP-FPM worker 进程的最大数量,因为它们有可能最终“忙”处理 idle 持久连接,没有任何建立新连接的空间,最终用户体验将是一堆 HTTP 请求超时。
以下 example 将请求 URI 作为 PHP-FPM 守护程序的文件系统路径传递给 run。请求 URL 隐式添加到第二个参数。 fcgi://之后的主机名和 port 是 PHP-FPM 正在侦听的位置。连接 pooling/reuse 已启用。
PHP-FPM
ProxyPassMatch "^/myapp/.*.php(/.*)?$" "fcgi://localhost:9000/var/www/" enablereuse=on
以下 example 将请求 URI 作为 PHP-FPM 守护程序的文件系统路径传递给 run。在这种情况下,PHP-FPM 正在侦听 unix 域 socket(UDS)。需要 2.4.9 或更高版本。使用此语法,将忽略 fcgi://之后的主机名和可选 port。
PHP-FPM 与 UDS
ProxyPassMatch "^/(.*.php(/.*)?)$" "unix:/var/run/php5-fpm.sock|fcgi://localhost/var/www/"
除了上面列出的代理模块之外,平衡网关还需要mod_proxy_balancer和至少一个负载均衡器算法模块,例如mod_lbmethod_byrequests。mod_lbmethod_byrequests是默认值,将用于此 example configuration。
平衡网关到多个 application 实例
ProxyPass "/myapp/" "balancer://myappcluster/" <Proxy "balancer://myappcluster/"> BalancerMember "fcgi://localhost:4000" BalancerMember "fcgi://localhost:4001" </Proxy>
您还可以通过创建合适的 Handler pass-through 来强制将请求作为 reverse-proxy 请求处理。下面的 example configuration 将使用反向代理将所有 PHP 脚本请求传递到指定的 FastCGI 服务器。此 feature 可在 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行为的 configuration 指令外,还有许多控制 FCGI 协议提供程序的环境变量:
- proxy-fcgi-pathinfo 通过 ProxyPass 或 ProxyPassMatch 配置时,mod_proxy_fcgi 将不会设置 PATH_INFO 环境变量。这允许后端 FCGI 服务器正确地确定 SCRIPTNAME 和 Script-URI 并且符合 RFC 3875 部分 3.3.如果您需要 mod_proxy_fcgi 为 PATH_INFO 生成“最佳猜测”,请设置此 env-var。这是针对某些 FCGI implementations 中的错误的解决方法。此变量可以设置为多个值,以调整选择最佳猜测的方式(仅在 2.4.11 及以后):first-dot PATH_INFO 从第一个“。”后面的斜杠中分割出来。在 URL 中。 last-dot PATH_INFO 从最后一个“。”后面的斜杠中分割出来。在 URL 中。完整 PATH_INFO 是通过尝试将 URL 映射到本地文件系统来计算的。 unescape PATH_INFO 是 URL 的路径 component,未转义/已解码。任何其他 value PATH_INFO 与 URL 的路径 component 相同。最初,这是唯一的 proxy-fcgi-pathinfo 选项。
ProxyFCGIBackendType 指令
描述: | 指定后端 FastCGI application 的类型 |
句法: | ProxyFCGIBackendType FPM\|GENERIC |
默认: | ProxyFCGIBackendType FPM |
Context: | server config,virtual host,directory,.htaccess |
状态: | 延期 |
模块: | mod_proxy_fcgi |
兼容性: | 可在 version 2.4.26 及更高版本中使用 |
该指令允许指定后端类型 FastCGI application。某些 FastCGI 服务器(例如 PHP-FPM)使用环境变量的历史怪癖来标识正在使用的代理服务器的类型。如果非 PHP-FPM application 无法解释服务器设置的 SCRIPT_FILENAME 或 PATH_TRANSLATED 等环境变量,请将此指令设置为“GENERIC”。
根据此指令的设置更改的一个示例值是 SCRIPT_FILENAME。历史上使用mod_proxy_fcgi时,SCRIPT_FILENAME 的前缀是 string“proxy:fcgi://”。这个变量是一些通用的 FastCGI applications 读取它们的脚本输入,但 PHP-FPM 会剥离前缀然后记住它正在与 Apache 交谈。在 2.4.21 到 2.4.25 中,此前缀被服务器自动剥离,破坏了 PHP-FPM 在某些情况下检测和与 Apache 互操作的能力。
ProxyFCGISetEnvIf 指令
描述: | 允许修复发送到 FastCGI 服务器的变量 |
句法: | ProxyFCGISetEnvIf conditional-expression[!]environment-variable-name[value-expression] |
Context: | server config,virtual host,directory,.htaccess |
状态: | 延期 |
模块: | mod_proxy_fcgi |
兼容性: | 可在 version 2.4.26 及更高版本中使用 |
在将请求传递给配置的 FastCGI 服务器之前,web 服务器的核心根据当前请求的详细信息设置了许多环境变量。 FastCGI 程序通常使用这些环境变量作为输入,以确定它们将处理的底层脚本或它们直接生成的输出。
值得注意的环境变量的例子有:
- SCRIPTNAME
- SCRIPT_FILENAME
- REQUEST_URI
- PATH_INFO
- PATH_TRANSLATED
该指令允许覆盖上面的环境变量或任何其他感兴趣的环境变量。在设置这些变量的初始值之后,将对此指令进行求值,因此它们可以用作条件表达式和 value 表达式的输入。
参数语法:
- conditional-expression
指定一个表达式,该表达式控制是否修改后面的环境变量。有关表达式语法的信息,请参阅后面的示例或 ap_expr 文档中的完整规范。 - environment-variable-name
指定要更改的 CGI 环境变量,例如 PATH_INFO。如果前面有感叹号,则该变量将被取消设置。 - value-expression
指定前面环境变量的替换 value。可以在 conditional-expression 中的正则表达式捕获中包含反向引用,例如“$1”。如果省略,则将变量设置(或覆盖)为空 string -但请参阅下面的注释。
# 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"
注意:Unset 与 Empty
以下将取消设置VARIABLE
,防止将其发送到 FastCGI 服务器:
ProxyFCGISetEnvIf true !VARIABLE
以下将删除VARIABLE
的任何现有 value(通过将其设置为空 string),但空VARIABLE
仍将被发送到服务器:
ProxyFCGISetEnvIf true VARIABLE
具有空 value 的变量与不存在的变量之间的 CGI/1.1 规范不区分。但是,许多 CGI 和 FastCGI implementations 区分(或允许脚本区分)两者之间。选择使用哪个取决于您的 implementation 和修改变量的原因。