Пожалуйста, спросите, нужна ли вам дополнительная информация. Я просто пытаюсь понять, что происходит. Итак, у меня есть сервер с 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
config:
<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, это не решало проблему.
Тем не менее, я считать это отсортировано! По крайней мере, у меня больше нет конфликтующих модулей.