描述: | FastCGI支持模块
mod_proxy |
---|---|
状态: | 延期 |
模块标识符: | 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应用程序框架中使用外部启动或过程管理。
在确保服务器安全之前,请勿启用代理。开放式代理服务器对您的网络和整个Internet都是危险的。
请记住,为了使以下示例正常工作,必须启用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月)使用了一个prefork模型,即其每个工作进程可以同时处理一个连接。
默认情况下,使用线程mpm(如或)时,mod_proxy(配置为enablereuse=on
)允许ThreadsPerChild
每个httpd进程连接到后端
的连接池
,因此应考虑以下用例: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和更高版本中提供了此功能。由于性能原因,你将要定义一个工人 代表相同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 conditional-expression
[!]environment-variable-name
[value-expression] |
内容: | 服务器配置,虚拟主机,目录,.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实现在两者之间进行区分(或允许脚本进行区分)。使用哪种选择取决于您的实现和修改变量的原因。