Apache HTTP Server 版本 2.4
描述 | 用于 mod_proxy 的 FastCGI 支持模块 |
---|---|
状态 | 扩展 |
模块标识符 | 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 的并发连接,您可以选择加入连接重用,如以下示例所示
ProxyPass "/myapp/" "fcgi://localhost:4000/" enablereuse=on
请记住,PHP-FPM(在撰写本文时,2018 年 2 月)使用预分叉模型,即其每个工作进程一次只能处理一个连接。
默认情况下,mod_proxy(使用 enablereuse=on
配置)允许每个 httpd 进程对后端建立一个连接池,该连接池包含 ThreadsPerChild
个连接,当使用线程化 mpm(如 worker
或 event
)时,因此应考虑以下用例
MaxRequestWorkers
个连接到 FCGI 后端。mod_http2
的实现方式,存在额外的 h2 工作线程,这些线程可能会强制创建其他后端连接。池中连接的总数量可能会超过 MaxRequestWorkers
。需要明智地配置 PHP-FPM 工作进程的最大数量,因为它们可能会全部处于“繁忙”状态,处理空闲的持久连接,而没有空间建立新的连接,最终用户的体验将是一堆 HTTP 请求超时。
以下示例将请求 URI 作为文件系统路径传递给 PHP-FPM 守护进程运行。请求 URL 会隐式添加到第二个参数中。fcgi:// 后的主机名和端口是 PHP-FPM 监听的位置。连接池/重用已启用。
ProxyPassMatch "^/myapp/.*\.php(/.*)?$" "fcgi://localhost:9000/var/www/" enablereuse=on
以下示例将请求 URI 作为文件系统路径传递给 PHP-FPM 守护进程运行。在这种情况下,PHP-FPM 监听的是一个 Unix 域套接字 (UDS)。需要 2.4.9 或更高版本。使用此语法,fcgi:// 后的主机名和可选端口将被忽略。
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>
除了控制 mod_proxy
行为的配置指令外,还有许多 环境变量 控制 FCGI 协议提供程序
ProxyPass
或 ProxyPassMatch
配置时,mod_proxy_fcgi
不会设置 PATH_INFO 环境变量。这允许后端 FCGI 服务器正确确定 SCRIPT_NAME 和 Script-URI 并符合 RFC 3875 第 3.3 节。如果您需要 mod_proxy_fcgi
为 PATH_INFO 生成“最佳猜测”,请设置此 env-var。这是针对某些 FCGI 实现中错误的解决方法。此变量可以设置为多个值,以调整如何选择最佳猜测(仅在 2.4.11 及更高版本中)描述 | 指定后端 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 交互的能力。
描述 | 允许修复发送到 FastCGI 服务器的变量 |
---|---|
语法 | ProxyFCGISetEnvIf 条件表达式 [!]环境变量名称 [值表达式] |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
状态 | 扩展 |
模块 | mod_proxy_fcgi |
兼容性 | 在版本 2.4.26 及更高版本中可用 |
在将请求传递给配置的 FastCGI 服务器之前,Web 服务器的核心会根据当前请求的详细信息设置一些环境变量。FastCGI 程序通常使用这些环境变量作为输入,以确定它们将处理哪些底层脚本,或者它们直接生成什么输出。
值得注意的环境变量示例包括
此指令允许覆盖上述环境变量或任何其他感兴趣的变量。此指令在设置这些变量的初始值后进行评估,因此它们可以作为条件表达式和值表达式的输入。
参数语法
# 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 VARIABLECGI/1.1 规范 不区分具有空值的变量和不存在的变量。但是,许多 CGI 和 FastCGI 实现区分(或允许脚本区分)两者。选择使用哪一个取决于您的实现和修改变量的原因。