MVC Catalyst + Apache 2 + mod_perl [quick and simple hint]
Столкнулся с вопросом: «нужно Perl-приложение на MVC Catalyst Framework. Я использую Apache. Что мне делать?» :) Поgoogleил немного и нашёл решение (предполагается, что mod_perl на сервере уже поставлен).
1. Создаём своё приложение, в директории lib/ будут лежать все модули рассортированные по фолдерам (включая класс приложения, допустим, это TEST.pm)
2. В конфиге Virtual Host’а пишем
<IfModule mod_perl.c>
PerlSwitches -I/srv/www/vhosts/test/cgi-bin/lib # указали где брать обработчик
PerlModule TEST # указали какой модуль будем использовать<Location /test> # сказали, что использовать этот модуль только для пути /test*
SetHandler perl-script
PerlResponseHandler TEST # установили обработчик событий
</Location><Location /static> # сказали, что статический контент из /static модулем не обрабатывать :)
SetHandler none
</Location>
</IfModule>
3. Перезапускаем Apache. Делаем tail -n10 /var/log/apache/error_log и если видим строчку «[error] Can’t locate Catalyst/Engine/Apache2/MP20.pm in @INC», то еще ставим модуль Catalyst::Engine::Apache2::MP20.
4. Далее, в .htaccess пишем
RewriteEngine On
RewriteCond %{REQUEST_URI} !^.*test[/].*$ [NC] # и обращение не на прямую (чтобы не зациклить следующим условием)
RewriteRule ^(.*)$ /test/$1 [L,QSA] # тихо и мирно переводим всё на Perl-обработчик, который мы описали выше
5. В итоге имеем:
- пользователь идет в кореть вашего сайта и попадает в /test/
- если обращение идёт, например, к /static/images/logo.png, то легко и непринуждённо пользователь видит логотип :)
Просто и без заморочек. Но стоит помнить, что использование mod_perl накладывает свои ограничения, и приложение использующее специфичные для mod_perl модули не будет работать в режиме CGI.
Ссылки:
ЗЫ: на проф. документацию не претендует, но быструю подсказку дать попытался ;)


Я бы еще добавил, что вместо использования рерайта (в данном случае не совсем по назначению), лучше использоватть
SetHandler None
Чорт, парсер съел теги — SetHandler None надо поместить внутрь секции Location «/static/»
Спасибо, поправил