IIS/FastCGI

Материал из Eludia
Перейти к: навигация, поиск

7-я версия IIS включает в качестве неотъемлемой части довольно толковую поддержку FastCGI. К сожалению, практически всё, что можно найти в Сети по поводу соответствующей настройки собственных приложений, относится к PHP. Имеется куча доходчивых руководств по поводу того "как настроить PHP через FastCGI под IIS", однако большинство форумных вопросов "А как же Perl?" получают совершенно неадекватные ответы, а их авторам, похоже, остаётся только погружаться во фрустрацию. Или в изучение материальной части.

Немного теории

Надо понимать один важный момент по поводу PHP: там есть специально скомпилированный бинарник, который при запуске сразу начинает вести себя как FastCGI-демон, то есть входит в бесконечный цикл ожидания stdin. У Perl такой специальной сборки нет. FastCGI-сервер, написанный на Perl -- это скрипт, имя которого передаётся perl в качестве параметра командной строки. Или модуль, имя которого задаётся аналогично: через -M. В общем, Perl/FastCGI обработчик -- это perl.exe с параметрами.

А в IIS в маппинге обработчики указываются вот так:

<путь к exe> | <параметры командной строки>

Да, через символ "|" (труба).

И, разумеется, надо понимать, что если вы указываете в качестве параметра путь к скрипту, то он не имеет никакого отношения к скрипту, соответствующему тому или иному HTTP-запросу (вроде docroot/index.pl). Он будет, как сказано выше, обрабатывать FastCGI-запросы (получаемые при помощи FCGI.pm) и не должен быть привязан к директории приложения: все пути он узнает из %ENV. Так что логично оформить его в качестве модуля, входящего в вечный цикл при загрузке. Что для Eludia.pm сделано в виде Eludia::Content::HTTP::FastCGI::IIS.

Итак, установка

Как всегда в случае FastCGI, нам понадобится трюк с фальшивым скриптом. Нельзя напрямую назначить обработчик для URI="/", но можно:

  • уложить в корневую директорию ненужный файл с неиспользуемым расширением (например, "0.eludia");
  • объявить его файлом по умолчанию (наряду с default.asp, default.htm и т. д., но с наибольшим приоритетом);
  • назначить для этого расширения (*.eludia) FastCGI-обработчик:
C:\...\Perl\bin\perl.exe|-I c:\...\projects\eludia_perl\core -MEludia::Content::HTTP::FCGI::IIS

Ну и, собственно, назначить ваш docroot в качестве "домашнего каталога" сайта IIS. Всё, можно открывать браузер.

Проблема с MySQL/TCP

Проделав все вышеописанные шаги под Windows 7, я столкнулся с досадной проблемой: приложение-то загружалось как положено, но оно не могло дозвониться до местного MySQL по 127.0.0.1:3306:

Can't create TCP/IP socket (10041)

Источник проблемы в том что пути до некоторых DLL-файлов, используемых интерпретатором, располагаются в реестре, и эти пути основываются на переменной окружения %SystemRoot%. По каким-то причинам, IIS не передаёт переменные окружения при запуске интерпретатора, и вам необходимо выставить их вручную в <perl> секции httpd.conf:

BEGIN {
    $ENV {SYSTEMROOT} = "C:\\Windows";
};

Если же соединение вам нужно лишь для общения с базой данных, используйте named pipes. Для этого надо сделать две вещи:

1. прописать в my.ini

enable-named-pipe

2. указать точку в качестве host'а при доступе к БД:

db_dsn => "DBI:mysql:database=my_database;host=.",
Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Разработчику
Администратору
Инструменты