Apache-2.4
mod_perl 似乎正在跨使用者帳戶共享模組
請詢問您是否需要更多資訊。我只是想弄清楚發生了什麼。所以我有一個以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,因為它給另一個站點造成了太多問題:(
我剛剛發現了一些關於使用
+Parent
和PerlSwitches
配置的資訊:<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 多少次,它都無法解決問題。
無論如何-我認為這已經解決了!至少我似乎不再遇到衝突的模組了。