• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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 和修改变量的原因。