如何在PerPostConfigRequire执行的代码中获取"my" VHOST?



我使用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 ],

哈希裁判的结构取决于实际配置,因此我猜它可能包含其他孩子的哈希裁判。任何更好的想法欢迎...

相关内容

  • 没有找到相关文章

最新更新