Apache-2.4

mod_perl 似乎正在跨使用者帳戶共享模組

  • March 20, 2019

請詢問您是否需要更多資訊。我只是想弄清楚發生了什麼。所以我有一個以nginx為前端的伺服器,然後傳遞給 Apache (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 info@uk.site.com
   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 下執行良好。當我嘗試在另一個使用者帳戶上啟用 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 info@anothersite.co.uk
   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

我真的以為我在那裡有解決方案,但也許沒有:(

好的,所以這似乎有效。

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 多少次,它都無法解決問題。

無論如何-我認為這已經解決了!至少我似乎不再遇到衝突的模組了。

引用自:https://serverfault.com/questions/958937