Apache 如何获得;我的";PerPostConfigure执行的代码中的VHOST?
我正在使用同一个HTTPd实例在不同版本中托管同一个web应用的多个实例,并且当前每个实例/版本的web应用都有一个Apache 如何获得;我的";PerPostConfigure执行的代码中的VHOST?,apache,perl,mod-perl2,Apache,Perl,Mod Perl2,我正在使用同一个HTTPd实例在不同版本中托管同一个web应用的多个实例,并且当前每个实例/版本的web应用都有一个VHOST。我想使用mod_perl的PostConfigRequire来实现一个处理程序,在服务器启动期间预加载所有这些实例,而不是像目前那样依赖mod_perl的每个请求的注册表功能。后者是在并发请求太多的情况下,并且根据一些测试,在预加载的情况下,该问题不再发生 由于web应用程序的版本不同,我需要使用PerlOptions+Parent为每个VHOST提供各自的Perl解释
VHOST
。我想使用mod_perl的PostConfigRequire
来实现一个处理程序,在服务器启动期间预加载所有这些实例,而不是像目前那样依赖mod_perl的每个请求的注册表功能。后者是在并发请求太多的情况下,并且根据一些测试,在预加载的情况下,该问题不再发生
由于web应用程序的版本不同,我需要使用PerlOptions+Parent
为每个VHOST
提供各自的Perl解释器池。此外,我可以很容易地按照VHOST
配置perlpostconfigurequire
,但预加载需要考虑处理程序当前在哪个VHOST
中执行。在该处理程序中,我只需要加载与某个具体的VHOST
相关联的文件
问题是我在如何找到当前执行该处理程序的VHOST
时遇到了问题。在过去,我通过查看当前请求的URL并将其与VHOST
configs进行比较,实现了类似的每个请求,但我现在没有请求Apache2::ServerUtil->server()
未提供myVHOST
,但它完全可用,例如使用Apache2::Directive::conftree()->查找('VirtualHost')
。只是我不知道哪一个是包含当前执行的PerlPostConfigRequire
的。我非常确定perlpostconfigurequire
确实是按照VHOST
执行的,因为我还可以根据配置的VHOST
的数量进行调试输出缩放
有什么想法吗?谢谢 我想到的唯一一件事就是按照VHOST使用环境变量,如下面的示例所示
PerlSetVar
不起作用,因为它仅针对每个请求,在web服务器启动期间不可用
PerlSetEnv SOME_ID "0c8c1236-86de-4483-9d4b-999e2cfd17c1"
PerlPostConfigRequire "Some.pm"
每个VHOST都有自己的ID,并且在执行配置包期间,该环境变量似乎是唯一可用的:
[Mon Aug 05 20:50:32.181559 2019] [:warn] [pid 17736:tid 704] [...]: 0c8c1236-86de-4483-9d4b-999e2cfd17c1: 1
[Mon Aug 05 20:50:32.836195 2019] [:warn] [pid 17736:tid 704] [...]: 9dc691d6-794a-4095-852e-e596cabf43d5: 1
[Mon Aug 05 20:50:34.180453 2019] [:warn] [pid 17736:tid 704] [...]: 0c8c1236-86de-4483-9d4b-999e2cfd17c1: 2
[Mon Aug 05 20:50:34.830098 2019] [:warn] [pid 17736:tid 704] [...]: 9dc691d6-794a-4095-852e-e596cabf43d5: 2
日志记录代码:
my $server = Apache2::ServerUtil->server();
$server->warn(__PACKAGE__ . ": $ENV{'SOME_ID'}: " . Apache2::ServerUtil::restart_count());
记住这一点,就可以获取所有vhost并搜索它们定义的ID。需要注意的是,lookup
在这里没有多大帮助,它似乎不支持直接搜索PerlSetEnv
,但需要在为vhost手动返回的哈希引用上实现这一点:
my $confTree = Apache2::Directive::conftree();
my @vhosts = $confTree->lookup('VirtualHost');
每个结果都是一个哈希引用,包含如下键和值:
$VAR1 = {\n 'PerlSetEnv' => 'AMS_MOD_PERL_PRE_LOADING_ID "9dc691d6-794a-4095-852e-e596cabf43d5"',\n[...]
'PerlSetEnv' => [\n '"AMS_MOD_PERL_PRE_LOADING_ID" "9dc691d6-794a-4095-852e-e596cabf43d5"',\n '"murks" "test"'\n ],
hash-ref的结构取决于实际的配置,因此我猜它可能包含额外的子hash-ref。欢迎任何更好的想法…我唯一想到的是,按照VHOST使用环境变量,如下面的示例所示
PerlSetVar
不起作用,因为它仅针对每个请求,在web服务器启动期间不可用
PerlSetEnv SOME_ID "0c8c1236-86de-4483-9d4b-999e2cfd17c1"
PerlPostConfigRequire "Some.pm"
每个VHOST都有自己的ID,并且在执行配置包期间,该环境变量似乎是唯一可用的:
[Mon Aug 05 20:50:32.181559 2019] [:warn] [pid 17736:tid 704] [...]: 0c8c1236-86de-4483-9d4b-999e2cfd17c1: 1
[Mon Aug 05 20:50:32.836195 2019] [:warn] [pid 17736:tid 704] [...]: 9dc691d6-794a-4095-852e-e596cabf43d5: 1
[Mon Aug 05 20:50:34.180453 2019] [:warn] [pid 17736:tid 704] [...]: 0c8c1236-86de-4483-9d4b-999e2cfd17c1: 2
[Mon Aug 05 20:50:34.830098 2019] [:warn] [pid 17736:tid 704] [...]: 9dc691d6-794a-4095-852e-e596cabf43d5: 2
日志记录代码:
my $server = Apache2::ServerUtil->server();
$server->warn(__PACKAGE__ . ": $ENV{'SOME_ID'}: " . Apache2::ServerUtil::restart_count());
记住这一点,就可以获取所有vhost并搜索它们定义的ID。需要注意的是,lookup
在这里没有多大帮助,它似乎不支持直接搜索PerlSetEnv
,但需要在为vhost手动返回的哈希引用上实现这一点:
my $confTree = Apache2::Directive::conftree();
my @vhosts = $confTree->lookup('VirtualHost');
每个结果都是一个哈希引用,包含如下键和值:
$VAR1 = {\n 'PerlSetEnv' => 'AMS_MOD_PERL_PRE_LOADING_ID "9dc691d6-794a-4095-852e-e596cabf43d5"',\n[...]
'PerlSetEnv' => [\n '"AMS_MOD_PERL_PRE_LOADING_ID" "9dc691d6-794a-4095-852e-e596cabf43d5"',\n '"murks" "test"'\n ],
hash-ref的结构取决于实际的配置,因此我猜它可能包含额外的子hash-ref。欢迎有更好的主意