【问题标题】:How to get "my" VHOST in code executed by PerPostConfigRequire?如何在 PerPostConfigRequire 执行的代码中获取“我的”VHOST?
【发布时间】:2019-12-13 06:03:13
【问题描述】:

我正在使用相同的 HTTPd 实例托管不同版本的同一 Web 应用程序的多个实例,并且当前每个 Web 应用程序的实例/版本有一个 VHOST。我想使用 mod_perl 的 PostConfigRequire 来实现一个处理程序,在服务器启动期间预加载所有这些实例,而不是像目前所做的那样依赖于每个请求的 mod_perl 的注册表设施。后者breaks 在并发请求过多的情况下,并且根据一些测试,如果事情被预加载,则不会再出现该问题。

由于我的 Web 应用程序版本不同,我需要使用 PerlOptions +Parent 为每个 VHOST 提供其单独的 Perl 解释器池。此外,我可以根据VHOST 轻松配置PerlPostConfigRequire,但预加载需要考虑当前在哪个VHOST 中执行该处理程序。在该处理程序中,我只需要加载与某些具体VHOST 关联的那些文件.

问题是我无法找到当前正在执行该处理程序的VHOST。在过去,我通过查看当前请求的 URL 并将其与 VHOST 配置进行比较,为每个请求实现了类似的功能,但我现在没有请求。 Apache2::ServerUtil->server() 没有提供我的VHOST,但它完全可用,例如使用Apache2::Directive::conftree()->lookup('VirtualHost')。只是我不知道哪个是当前执行的包含PerlPostConfigRequire 的那个。我很确定PerlPostConfigRequire 确实会按照VHOST 执行,因为我还可以使用配置的VHOSTs 的数量来调试输出缩放。

有什么想法吗?谢谢!

【问题讨论】:

    标签: apache perl mod-perl2


    【解决方案1】:

    我唯一想到的是使用每个 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 ],
    

    哈希引用的结构取决于实际的配置,所以我猜它可能包含额外的子哈希引用。欢迎任何更好的想法...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-06
      • 2014-02-25
      • 2016-05-12
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多