我正在努力动态确定的 Unix 套接字用于不同的 PHP “应用程序”(不同的套接字导致不同的PHP-FPM在我的 Apache (2.4.18) 服务器上使用修改代理服务器):
<DirectoryMatch "/home/apps/app_(?<appname>[a-zA-Z]+)">
<FilesMatch \.php$>
SetHandler "proxy:unix://var/run/app_%{env:MATCH_APPNAME}.sock|fcgi://localhost:42001"
</FilesMatch>
</DirectoryMatch>
很遗憾Apache 似乎无法识别/评估该变量由正则表达式匹配定义<DirectoryMatch>
指令与设置处理程序指示。
其error.log
内容如下:
[proxy:error] (2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/app_%{MATCH_APPNAME}e.sock (*) failed
如何将变量传递给设置处理程序指示?当我使用到 UDS 的“固定”路径时,我的 PHP-FPM 工作正常(例如"proxy:unix://var/run/app_someappname.sock|fcgi://localhost:42001"
,但在其中使用变量时似乎出现问题。
我还尝试使用连接在一起的几个变量来构建路径:
<FilesMatch \.php$>
Define one "proxy:unix://var/run/app_"
Define two ".sock|fcgi://localhost:42001"
Define final ${one}%{MATCH_APPNAME}e${two}
Header set HANDLER_PATH ${final}
</FilesMatch>
在这种情况下,PHP 源代码是不是由 PHP 处理,但 URL 的 HTTP 响应标头http://127.0.0.1/apps/someappname/index.php
(正确)包含:HANDLER_PATH: proxy:unix://var/run/app_someappname.sock|fcgi://localhost:42001
但是当我将${final}
变量传递给设置处理程序,服务器返回503 Service Unavailable
并error.log
说:
*: using default reverse proxy worker for unix://var/run/app_%{MATCH_APPNAME}e.sock|fcgi://localhost:42001/home/apps/app_someappname/www/index.php (no keepalive)
*: rewrite of url due to UDS(/run/app_%{MATCH_APPNAME}e.sock): fcgi://localhost:42001/home/apps/app_someappname/www/index.php (proxy:fcgi://localhost:42001/home/apps/app_someappname/www/index.php)
AH01143: Running scheme unix handler (attempt 0)
AH01076: url: fcgi://localhost:42001/home/apps/app_someappname/www/index.php proxyname: (null) proxyport: 0
AH01078: serving URL fcgi://localhost:42001/home/apps/app_someappname/www/index.php
AH00942: FCGI: has acquired connection for (*)
AH00944: connecting fcgi://localhost:42001/home/apps/app_someappname/www/index.php to localhost:42001
AH02545: fcgi: has determined UDS as /run/app_%{MATCH_APPNAME}e.sock
AH00947: connected /home/apps/app_someappname/www/index.php to httpd-UDS:0
(2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/app_%{MATCH_APPNAME}e.sock (*) failed
AH01079: failed to make connection to backend: httpd-UDS
proxy_util.c(2175): AH00943: FCGI: has released connection for (*)
令我印象深刻的是,当将 sock 的路径放入 HTTP 标头时,它被正确解析为
proxy:unix://var/run/app_someappname.sock
,但当将变量传递给设置处理程序,它突然变成了unix://var/run/app_%{MATCH_APPNAME}e.sock
一个文字%{MATCH_APPNAME}e
,就像变量被解析了一样设置处理程序本身(并且不正确)......
我们怎样才能做到这一点?这有可能吗?我认为一定有可能。
答案1
您是否尝试过用[H=
而不是RewriteRule SetHandler
?
RewriteRule 的优点在于它在执行时而不是在启动时评估参数(典型的指令在实际执行时不会插入每个请求的变量)