LINUX.ORG.RU

mod_perl не различает пути *.pl


0

0

Используется Apache 2.2.8/mod_perl.
DocumentRoot «/var/www»

Приложения в своих каталогах: /var/www/app1, /var/www/app2.
Есть файлы с совпадающими именами, но с разным содержанием:
- /var/www/app1/perl/Server.pm (работает с LDAP);
- /var/www/app2/perl/Server.pm (работает с SQL).

Может работать только приложение, к которому первым обратился
пользователь. Второе сыпет не существующими ошибками.
Такое ощущение, что mod_perl не различает пути.
Было да виртуальных хоста на разных портах и вот решил их слить,
есть общие файлы (js, html, ...) и порт должен быть один.

Пытался также указать в файле Package Ldap::Server,
вызывать Ldap::Server.
Как разделить эти файлы без именования в стиле App1_модуль.pm?



app1.pl:

use lib '/var/www/app1/perl/';
use Server;
…

app2.pl:

use lib '/var/www/app2/perl/';
use Server;
…
и убрать добавление /var/www/app*/perl/ в @INC из апачевских конфигов.

arsi ★★★★★
()
Ответ на: комментарий от arsi

>use lib '/var/www/app1/perl/';

use Server;


use lib '/var/www/app2/perl/';

use Server;



Такие строки есть.

и убрать добавление /var/www/app*/perl/ в @INC из апачевских конфигов.

Где смотреть?

WinLin
() автор топика
Ответ на: комментарий от WinLin

В описании VirtualHost еще осталось:
PerlOptions +Clone
PerlInterpStart 4
PerlInterpMax 10


WinLin
() автор топика
Ответ на: комментарий от r_asian

   <Location /app1/perl>
      <LimitExcept POST GET>
       Deny from all
      </LimitExcept>

      Options -Indexes +ExecCGI
      SetHandler perl-script
      PerlResponseHandler ModPerl::Registry
      PerlOptions +ParseHeaders
      Order deny,allow
      Allow from all

      AuthName «app1»
...
   </Location>

Если убрать <Location /app1/perl>, то как вызывать /app1/perl/file.pl ?
Или что-то другое имеется ввиду?

WinLin
() автор топика
Ответ на: комментарий от name_no

Скопировал из /var/log/apache2/error.log:
@INC contains: /var/www/ldap_www/perl /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl . /etc/apache2

Здесь нет /var/www/ldap_www/perl и /var/www/otchet/perl,
а есть '.', который и является одним из них.

ldap.pl
use lib '/var/www/ldap_www/perl';

otchet.pl
use lib '/var/www/otchet/perl';

Apache запоминает оба пути и пытается вызывать файлы из случайно
выбранного каталога '/var/www/ldap_www/perl' или '/var/www/otchet/perl'.

Также запоминает все вызванные модули:
в ldap.pl есть 'use Encode', а в otchet.pl пытается также его применить и происходит перекодирование в нечитаемый текст.

Нужно создать каталоги по названию приложений и использовать
package App::File и use App::File.

Как говорили выше:
use app1::perl::Server;
use app2::perl::Server;
и полностью убрать - use lib.







WinLin
() автор топика
Ответ на: комментарий от WinLin

use lib 'xxxx' - все равно нужен.

После таких раскопок решил, что нужно делать VirtualHost
или *.pl сливать в один каталог.

Фигня какая-то...

WinLin
() автор топика
Ответ на: комментарий от WinLin

я правильно понял, что в «/var/www/ldap_www/perl» находятся файлы «ldap.pl» и «Server.pm», а в «/var/www/otchet/perl» — «otchet.pl» со своим «Server.pm»? если да, то:

ldap.pl:

use lib '/var/www';
use ldap_www::perl::Server;
my $server = Server->new();
…
otchet.pl:
use lib '/var/www';
use otchet::perl::Server;
my $server = Server->new();
…

arsi ★★★★★
()
Ответ на: комментарий от arsi

>use lib '/var/www';

use ldap_www::perl::Server;

my $server = Server->new();



Server->new() смешается с другим похожим.
my $server = Ldap_www::Server->new() ???

Apache ругался без «use lib».

Сделал вот так:
/var/www/ldap_www/perl/*.pl
/var/www/ldap_www/perl/Ldap_www/*.pm

ldap.pl:
use lib '/var/www/ldap_www/perl';
use Ldap_www::Server;
my $server = Ldap_www::Server->new();

Server.pm:
Package Ldap_www::Server;

Это извращение с лишним каталогом /var/www/app/perl/app.
Везде нужно App::File.

Какая-то логика непонятная у Apache, можете объяснить про пути?

WinLin
() автор топика
Ответ на: комментарий от WinLin

Server->new() смешается с другим похожим.

my $server = Ldap_www::Server->new() ???

нет.

use Ldap_www::Server;

my $server = Ldap_www::Server->new();

нет, разве что…

Server.pm:

Package Ldap_www::Server;

Какая-то логика непонятная у Apache, можете объяснить про пути?

индеец здесь ни при чём :) всё гораздо проще: «use Some::Thing;» включает файл «Some/Ting.pm». всё. тоесть: все двойные двоеточия превращаются в слэш и в конце дописывается «.pm». проще некуда :) сам файл ищется в @INC по порядку, т.е. сначала «./Some/Ting.pm» и дальше по списку. НО! в самом исходнике запись вида Some::Thing->new() уже может быть некорректна. причина: последнее целиком и полностью зависит от «package My::Package;», которое и «интродюсит» заданный «класс»/пакет. а вот use понятия не имеет о содержимом пакетов до тех пор, пока их не подключит. поэтому, дабы избежать путаницы, во всех доках рекомендуют называть пакеты по месту их расположения. если проще: в «use» отталкиваетесь от пути, а в «new» и т.п. в сорсе — от «package». … … плохой из меня учитель %)

arsi ★★★★★
()
Ответ на: комментарий от arsi

mod_perl и просто perl - две большие разницы.

mod_perl запоминает имена Package независимо от их расположения,
поэтому поможет только:

1) правильное имя Package
*.pl:
use Otchet::Server

Server.pm:
Package Otchet::Server

2) создать соответствующий каталог Otchet для классов (Package).

Прикольно когда запускаешь два разных приложения (LDAP и SQL)
и при обращении к SQL в логе Apache
«Не могу подключится к LDAP» :)

Это только мои заключения, можете опровергнуть.
Возможно нужно крутить настройки Apache
http://perl.apache.org/docs/2.0/user/config/config.html

WinLin
() автор топика
Ответ на: комментарий от WinLin

хм… если mod_perl запускает все скрипты в едином контексте и пространстве имен, тогда да, именно так и будет (методы из другого модуля с тем же именем пакета просто дополнят или заменят методы из предыдущего). но мне слабо верится, что так и есть, ведь это огромная дыра в безопасности получается (в случае с виртуальными хостами или подобным на одном апаче для разных пользователей)… во всяком случае, это поведение, скорее всего, отключается.

arsi ★★★★★
()
Ответ на: комментарий от arsi

Если убрать эти строки:
PerlOptions +Clone
PerlInterpStart 2
PerlInterpMax 2

то mod_perl ведет себя также и у разных VirtualHost.
Сейчас объединил два VirtualHost в один и получаю ошибки.

Все на личном опыте.

WinLin
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.