我使用httpd的同一实例在不同版本中托管了同一Web应用程序的多个实例,当前每个实例/版本的一个 VHOST
当前。我想使用MOD_PERL的PostConfigRequire
来实现服务器启动期间所有这些实例的处理程序,而不是像当前完成的每个请求一样依赖MOD_PERL的注册表 - 权能。如果同步请求太多,后者会断裂,并且根据某些测试,如果事件预加载,该问题不再发生。
由于我的Web应用程序的不同版本,我需要使用PerlOptions +Parent
向每个VHOST
提供其单独的Perl解释器池。此外,我可以轻松地每个VHOST
配置PerlPostConfigRequire
,但是预载需要考虑到该处理程序当前执行的VHOST
。在该处理程序中,我只需要加载与某些混凝土VHOST
相关的那些文件。
问题在于,我很难找到当前执行该处理程序的VHOST
。在过去,我通过查看当前请求的URL并将其与VHOST
配置进行比较,从而实现了类似的内容,但我现在没有请求。Apache2::ServerUtil->server()
没有提供我的VHOST
,但完全可以使用,例如使用Apache2::Directive::conftree()->lookup('VirtualHost')
。只是我不知道哪一个是当前执行的PerlPostConfigRequire
。我很确定PerlPostConfigRequire
确实每VHOST
执行,因为我也配备了VHOST
s的数量来调试输出缩放。
有什么想法吗?谢谢!
我唯一想到的是使用每个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
,但是需要在Hash Refs手动返回的Hash Refs上实现它:
my $confTree = Apache2::Directive::conftree();
my @vhosts = $confTree->lookup('VirtualHost');
每个结果都是hash ref包含键和值,如以下内容:
$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 ],
哈希裁判的结构取决于实际配置,因此我猜它可能包含其他孩子的哈希裁判。任何更好的想法欢迎...