mod_perl 似乎在跨用户帐户共享模块

mod_perl 似乎在跨用户帐户共享模块

如果您需要更多信息,请随时询问。我只是想弄清楚发生了什么。所以我有一台服务器nginx作为前端,然后传递给 阿帕奇 (2.4.18)。在我的 Apache 域配置文件中,我有:

<VirtualHost *:8181>

    CustomLog /home/steampunkcom/web/uk.site.com/logs/uk.site.com.apache.log combined
    ErrorLog /home/steampunkcom/web/uk.site.com/logs/uk.site.com.apache.error.log

    LogLevel error

    RemoteIPHeader X-Forwarded-For

    # MOD_PERL
    LoadModule perl_module /usr/lib/apache2/modules/mod_perl.so

    ServerName uk.site.com
    ServerAlias www.uk.site.com
    ServerAdmin [email protected]
    DocumentRoot /home/steampunkcom/web/uk.site.com/public_html

    # MOD_PERL
    PerlRequire  /home/steampunkcom/web/uk.site.com/startup.pl

    ScriptAlias /cgi-bin/ /home/steampunkcom/web/uk.site.com/public_html/cgi-bin/

    Alias /vstats/ /home/steampunkcom/web/uk.site.com/stats/
    Alias /error/ /home/steampunkcom/web/uk.site.com/document_errors/


    # Uncomment this part to make run as mod_perl - comment out above as well!
    <Directory "/home/steampunkcom/web/uk.site.com/*">

        Options +ExecCGI +FollowSymLinks +MultiViews
        AllowOverride AuthConfig

        PerlResponseHandler ModPerl::Registry
        AddHandler perl-script .cgi .pl
        Options +ExecCGI
        PerlOptions +ParseHeaders
        AllowOverride All
        Require all granted

    </Directory>

    <Directory /home/steampunkcom/web/uk.site.com/stats>
       AllowOverride All
       Require all granted
    </Directory>


    <IfModule mod_ruid2.c>
        RMode config
        RUidGid steampunkcom steampunkcom
        RGroups www-data
    </IfModule>
    <IfModule itk.c>
        AssignUserID steampunkcom steampunkcom
    </IfModule>

    IncludeOptional /home/steampunkcom/conf/web/apache2.uk.site.com.conf*

</VirtualHost>

这很好。它在 mod_perl 下运行良好。当我尝试在其他用户帐号:

<VirtualHost *:8181>

    CustomLog /home/willr/web/anothersite.co.uk/logs/anothersite.co.uk.apache.log combined
    ErrorLog /home/willr/web/anothersite.co.uk/logs/anothersite.co.uk.apache.error.log

    LogLevel error

    RemoteIPHeader X-Forwarded-For

    LoadModule perl_module /usr/lib/apache2/modules/mod_perl.so

    PerlRequire  /home/willr/web/anothersite.co.uk/startup.pl

    ServerName anothersite.co.uk
    ServerAlias www.anothersite.co.uk
    ServerAdmin [email protected]
    DocumentRoot /home/willr/web/anothersite.co.uk/public_html


    #####
    ScriptAlias /cgi-bin/ /home/willr/web/anothersite.co.uk/public_html/cgi-bin/
    #####

    Alias /vstats/ /home/willr/web/anothersite.co.uk/stats/
    Alias /error/ /home/willr/web/anothersite.co.uk/document_errors/

    <Directory "/home/willr/web/anothersite.co.uk/*">
        Options +ExecCGI +FollowSymLinks +MultiViews
        AllowOverride AuthConfig

        PerlResponseHandler ModPerl::Registry
        AddHandler perl-script .cgi .pl
        Options +ExecCGI
        PerlOptions +ParseHeaders
        AllowOverride All
        Require all granted

    </Directory>


    <IfModule mod_ruid2.c>
        RMode config
        RUidGid willr willr
        RGroups www-data
    </IfModule>
    <IfModule itk.c>
        AssignUserID willr willr
    </IfModule>

</VirtualHost>

起初我以为一切都运行正常,但后来我开始收到人们的电子邮件,告诉我他们无法登录网站。经过调查,我发现它在用户帐户之间共享一个模块。我正在试图找出原因,以及我能做些什么。我知道 mod_perl 可以在多个用户帐户之间运行而无需共享模块(因为我在其他为我管理的服务器上这样做过),但我不确定它在这里是如何/为什么这样做的。

任何想法都非常感谢!与此同时,我不得不禁用其中一个网站的 mod_perl,因为它给另一个网站带来了太多问题 :(

我刚刚发现一些有关使用+ParentPerlSwitches配置的信息:

 <VirtualHost ...>
      ServerName dev1
      PerlOptions +Parent
      PerlSwitches -I/home/dev1/lib/perl
  </VirtualHost>

https://perl.apache.org/docs/2.0/user/config/config.html#C_Parent_

但问题是,它似乎仍然会导致模块在其他用户帐户之间“共享”。所以我有:

PerlOptions +ParseHeaders +Parent
PerlSwitches -Mlib=/home/steampunkcom/web/foo.co.uk/lib

当我查看@INC 的内容时,我可以看到:

@INC = 
    /home/steampunkcom/web/foo.com/public_html/cgi-bin/admin
    /home/steampunkcom/web/foo.com/lib
    /etc/perl
    /usr/local/lib/x86_64-linux-gnu/perl/5.22.1
    /usr/local/share/perl/5.22.1
    /usr/lib/x86_64-linux-gnu/perl5/5.22
    /usr/share/perl5
    /usr/lib/x86_64-linux-gnu/perl/5.22
    /usr/share/perl/5.22
    /usr/local/lib/site_perl
    .
    /etc/apache2

我真的以为我有一个解决方案,但可能不是:(

答案1

好的,这似乎可行。

PerlOptions +Parent
PerlInterpStart 2
PerlInterpMax 2
PerlSwitches -Mlib=/home/steampunkcom/web/uk.domain.com/lib
PerlRequire  /home/steampunkcom/web/uk.domain.com/startup.pl # my script to auto load modules

顺序似乎也很重要。我不确定这是否也是解决方案的一部分,但我重新启动了服务器。我想知道当我调整设置时是否有东西“卡住了”,无论我重新启动 Apache 多少次都无法解决问题。

无论如何 - 我思考这样就解决了!至少我似乎不再遇到冲突的模块了。

相关内容