Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Apache не даёт доступ CGI скриптам к IPC объектам


Автор: vminko 9.9.2007, 00:14
Задача: есть демон под win32, нужно в него передать событие (просто индикация, 1 бит т.е.) из CGI скрипта.

Поначалу пытался решить через сигналы, потом понял что под win32 они почти не работают.
Нашёл модуль Win32::Event - то что надо. Реализовал так: в демоне создаётся объект Event, в cgi скрипте он открывается и выстанавливается, демон ловит событие и сбрасывает его. Всё работает, никаких проблем.
Поставил на клиентскую машину - обнаружилась проблема: cgi скрипт не может найти объект Event, созданный демоном.

Для тестирования написал два скрипта:
демон:
Код

#!c:/Perl/bin/perl.exe -w
use Win32::Event;

my $event = Win32::Event->new(1, 0, 'evt');

sleep(1) while (1);
cgi скрипт:
Код

#!c:/Perl/bin/perl.exe -w
use Win32::Event;
use CGI qw/:standard/;

my $event = Win32::Event->open('evt');

print header();

if ($event) {
    print "success\n"
}
else {
    print "can't open abort event object\n";
}


Если запускать скрипт как и демона из cmd.exe - то он находит объект. Отсюда сразу подозрение на неверный конфиг Apache.
Заменил полностью директорию Apache на ту которая на локальной машине лежит, только в конфиге поменял ip - не помогает.
Версии Perl, Apache одинаковые, отличались только дистрибутивы WinXP. Переставил на ту которая локально стоит - не помогает.

Если запускать и демона и cgi под Apache (чисто для эксперимента) - то событие находится. Пришёл к выводу что почему-то Apache блокирует доступ из CGI скриптов к событиям, созданным внешне. Реализовал тоже самое на семафорах - аналогичная картина, не работает. Пришёл к выводу, что это общая проблема для IPC объектов.

Сверил службы запущенные локально и на клиентской машине - ничего подозрительного не нашёл.
Сверил переменные окружения которые получают cgi скрипты - отличий не нашёл.
Perl, Apache никаких warning не пишут в логи.

Идеи кончались  smile 

Клиентскую машину сменить не могу, поэтому необходимо понять отличия в средах, почему работает локально.

Спасибо

Автор: nitr 9.9.2007, 09:52
vminko, вполне рабочие скрипты... и у меня работает (WinXP, Apache2, Perl 5.8.8).
Тогда точно не в скриптах, если хотите, киньте сюда ваш конфиг Apache, а если они "дефолтовые", то и не в нем проблема. Какая ваша конфигурация системы?

Автор: vminko 9.9.2007, 12:18
Конфиг приложил, он почти не изменялся.

Конфигурация системы:
Windows XP SP2
Perl 5.8.6 811build
Apache 2.2.4
Установлена Visual Studio 2003 .NET, если это как-то может повлиять.

Автор: nitr 9.9.2007, 12:27
vminko, что-то интересное smile
У вас практически все настройки для запуска cgi-скриптов (perl) закомментированы smile
Раскомментируйте 
AddHandler cgi-script .cgi .pl

Автор: vminko 9.9.2007, 13:06
Пробовал, не помогает. Также пробовал раскомментировать это:
ScriptInterpreterSource registry

Автор: nitr 9.9.2007, 13:35
vminko, я не понимаю как у вас работают скрипты, и как вы их запускали с таким конфигом, но вот что мне пришлось сделать:

Изменил
Цитата

ServerName localhost:80


Apache не воспринимает
Цитата
<IfModule alias_module>

так что закомментируйте 
Цитата
#<IfModule alias_module>
...
#</IfModule>


В общем надо вынести за этот блок строку
Цитата
ScriptAlias /cgi-bin/ "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/"

А то она не воспринимается Apache'ем
Ну и перезагрузил Apache, чтобы все изменения вступили в силу ;)


После этого запустил daemon.pl (демон)
и в браузере
http://localhost/cgi-bin/test_event.cgi

вывод:
Цитата
success

Автор: vminko 9.9.2007, 13:52
Всё исправил согласно вашему описанию, поведение скриптов не изменилось.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)