<-
Apache > HTTP 服务器 > 文档 > 版本 2.4 > 模块

Apache 模块 mod_proxy_fcgi

可用语言:  en  |  fr 

描述用于 mod_proxy 的 FastCGI 支持模块
状态扩展
模块标识符proxy_fcgi_module
源文件mod_proxy_fcgi.c
兼容性在版本 2.3 及更高版本中可用

摘要

此模块需要 mod_proxy 的服务。它提供对 FastCGI 协议的支持。

因此,为了获得处理 FastCGI 协议的能力,mod_proxymod_proxy_fcgi 必须存在于服务器中。

mod_fcgidmod_fastcgi 不同,mod_proxy_fcgi 没有启动应用程序进程的规定;fcgistarter(在某些平台上)为此目的提供。或者,在使用的 FastCGI 应用程序框架中可能提供外部启动或进程管理。

警告

在您 保护您的服务器 之前,请勿启用代理。开放式代理服务器对您的网络和整个互联网都构成危险。

Support Apache!

主题

指令

错误修复清单

另请参阅

top

示例

请记住,为了使以下示例正常工作,您必须启用 mod_proxymod_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 年 2 月)使用预分叉模型,即其每个工作进程一次只能处理一个连接。
默认情况下,mod_proxy(使用 enablereuse=on 配置)允许每个 httpd 进程对后端建立一个连接池,该连接池包含 ThreadsPerChild 个连接,当使用线程化 mpm(如 workerevent)时,因此应考虑以下用例

  • 在 HTTP/1.1 负载下,它可能会导致最多创建 MaxRequestWorkers 个连接到 FCGI 后端。
  • 在 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:// 后的主机名和可选端口将被忽略。

使用 UDS 的 PHP-FPM

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 及更高版本中可用。出于性能原因,您需要定义一个 worker,它代表相同的 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>
top

环境变量

除了控制 mod_proxy 行为的配置指令外,还有许多 环境变量 控制 FCGI 协议提供程序

proxy-fcgi-pathinfo
通过 ProxyPassProxyPassMatch 配置时,mod_proxy_fcgi 不会设置 PATH_INFO 环境变量。这允许后端 FCGI 服务器正确确定 SCRIPT_NAMEScript-URI 并符合 RFC 3875 第 3.3 节。如果您需要 mod_proxy_fcgiPATH_INFO 生成“最佳猜测”,请设置此 env-var。这是针对某些 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 选项。
top

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 交互的能力。

top

ProxyFCGISetEnvIf 指令

描述允许修复发送到 FastCGI 服务器的变量
语法ProxyFCGISetEnvIf 条件表达式 [!]环境变量名称 [值表达式]
上下文服务器配置、虚拟主机、目录、.htaccess
状态扩展
模块mod_proxy_fcgi
兼容性在版本 2.4.26 及更高版本中可用

在将请求传递给配置的 FastCGI 服务器之前,Web 服务器的核心会根据当前请求的详细信息设置一些环境变量。FastCGI 程序通常使用这些环境变量作为输入,以确定它们将处理哪些底层脚本,或者它们直接生成什么输出。

值得注意的环境变量示例包括

此指令允许覆盖上述环境变量或任何其他感兴趣的变量。此指令在设置这些变量的初始值后进行评估,因此它们可以作为条件表达式和值表达式的输入。

参数语法

条件表达式
指定一个表达式,该表达式控制是否修改后面的环境变量。有关表达式语法的详细信息,请参阅以下示例或 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 实现区分(或允许脚本区分)两者。选择使用哪一个取决于您的实现和修改变量的原因。

可用语言:  en  |  fr 

top

评论

注意
这不是一个问答区。此处发布的评论应针对改进文档或服务器的建议,如果这些建议已被实施或被认为无效/偏离主题,可能会被我们的版主删除。有关如何管理 Apache HTTP Server 的问题,请咨询我们的 IRC 频道 #httpd(在 Libera.chat 上)或发送到我们的 邮件列表