Apache 如何获得;我的";PerPostConfigure执行的代码中的VHOST?

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解释

我正在使用同一个HTTPd实例在不同版本中托管同一个web应用的多个实例,并且当前每个实例/版本的web应用都有一个
VHOST
。我想使用mod_perl的
PostConfigRequire
来实现一个处理程序,在服务器启动期间预加载所有这些实例,而不是像目前那样依赖mod_perl的每个请求的注册表功能。后者是在并发请求太多的情况下,并且根据一些测试,在预加载的情况下,该问题不再发生

由于web应用程序的版本不同,我需要使用
PerlOptions+Parent
为每个
VHOST
提供各自的Perl解释器池。此外,我可以很容易地按照
VHOST
配置
perlpostconfigurequire
,但预加载需要考虑处理程序当前在哪个
VHOST
中执行。在该处理程序中,我只需要加载与某个具体的
VHOST
相关联的文件

问题是我在如何找到当前执行该处理程序的
VHOST
时遇到了问题。在过去,我通过查看当前请求的URL并将其与
VHOST
configs进行比较,实现了类似的每个请求,但我现在没有请求
Apache2::ServerUtil->server()
未提供my
VHOST
,但它完全可用,例如使用
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。欢迎有更好的主意