<-
Apache HTTP 服务器 2.4 > Apache模块mod_proxy_fcgi

Apache模块mod_proxy_fcgi

描述:FastCGI支持模块 mod_proxy
状态:延期
模块标识符: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应用程序框架中使用外部启动或过程管理。

警告

确保服务器安全之前,请勿启用代理。开放式代理服务器对您的网络和整个Internet都是危险的。

支持Apache!

主题

指令

错误修正清单

也可以看看

最佳

例子

请记住,为了使以下示例正常工作,必须启用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

启用与PHP-FPM之类的FCGI后端的连接重用

请记住,PHP-FPM(在撰写本文时,2018年2月)使用了一个prefork模型,即其每个工作进程可以同时处理一个连接。
默认情况下,使用线程mpm(如或)时,mod_proxy(配置为enablereuse=on)允许ThreadsPerChild每个httpd进程连接到后端 的连接池 ,因此应考虑以下用例: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_byrequestsmod_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或 配置时ProxyPassMatchmod_proxy_fcgi将不会设置PATH_INFO环境变量。这允许后端FCGI服务器正确确定SCRIPT_NAMEScript-URI并符合RFC 3875第3.3节。如果相反,您需要mod_proxy_fcgiPATH_INFO生成“最佳猜测” ,请设置此env-var。这是某些FCGI实现中的错误的解决方法。可以将此变量设置为多个值,以调整如何选择最佳猜测(仅在2.4.11及更高版本中):
第一点
PATH_INFO从第一个 “。” 之后的斜杠中分离出来 。在网址中。
最后一点
PATH_INFO从最后一个 “。” 后面的斜杠中分离出来 。在网址中。
充分
PATH_INFO是通过尝试将URL映射到本地文件系统来计算的。
逃生
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)使用环境变量的历史古怪来标识所使用的代理服务器的类型。如果您的非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并与之互操作的能力。

最佳

ProxyFCGISetEnvIf 指令

描述:允许修复发送给FastCGI服务器的变量
句法:ProxyFCGISetEnvIf conditional-expression [!]environment-variable-name [value-expression]
内容:服务器配置,虚拟主机,目录,.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实现在两者之间进行区分(或允许脚本进行区分)。使用哪种选择取决于您的实现和修改变量的原因。

可用语言: zh  |  fr 

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。