Описываются практические проблемы запуска проекта на Mojolicious на Apache на FreeBSD и даются примеры решений вопросов с конфигурацией Apache.
Описание проблемы
Проблемы при большом количестве сайтов на Mojolicious при работе через Nginx проявляются в виде «падения» процессов hypnotoad и появления ситуации долгого «просыпания», когда после длительного простоя сайт, при первом обращении, долгое время формирует страницу, а иногда сайт вообще не открывался, в браузере появлялось сообщение «Bad gateway».
В то же время, если повторного набрать адрес сайта в браузере – сайт отзывался и начинал работать нормально.
Причины и решение можно почитать тут Решение проблемы с «засыпанием» сайтов на Mojolicious
Решали этот вопос переносом сайтов на Mojolicious на Apache на FreeBSD, то есть получили связку на Mojolicious + Apache + Nginx.
Пример конфигурации Apache
<VirtualHost 127.0.0.1:81>
ServerName sdep.ru
DocumentRoot /usr/local/www/sdep.ru/public
DirectoryIndex index.html
<Directory /usr/local/www/sdep.ru/public >
Options All
AllowOverride All
Require all granted
SSILegacyExprParser on
</Directory>
ScriptAlias /cgi-bin/ /usr/local/www/sdep.ru/script/
<Directory /usr/local/www/sdep.ru/script >
Options ExecCGI
Require all granted
</Directory>
</VirtualHost>
Таким образом сконфигурирован виртуальных хост на Апач, при этом обратите внимание он работает на 81 порту.
Далее в конфигурации Nginx отключаем конфигурацию для данного домена (если она была).
Все запросы на 80й порт для данного домена перенаправляем в Апач на 81 порт.
Это делается вставкой в конфигурационный файл nginx.conf блока наподобии
Пример конфигурации Nginx для перенаправления запросов к Apache
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:81/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache my_cache;
}
}
Далее перезапускаем Нжинкс, затем перезапускаем Апач командой apachectl graceful
Заходим в браузер на сайт и видим…
Index of /
- css/
- fonts/
- images/
- img/
- js/
- photo/
страницу со списком папок в корневой папке сайта /usr/local/www/sdep.ru/public
Для того, чтобы запускался Mojolicious и формировал страницы нужно добавить в корневую папку нашего сайта файл .htaccess содержащий правила редиректов
Пример файла .htaccess для Mojolicious на Apache
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /cgi-bin/cms/$1 [L]
RewriteRule ^$ /cgi-bin/cms [L]
Обратите внимание – два правила RewriteRule должны идти именно в таком порядке.
После того, как создали файл .htaccess снова заходим на сайт и видим как все заработало.
Страницы формируются, картинки подгружаются, формы работают, шаблоны обрабатываются – все работает так как задумано.
Принцип работы Mojolicious под Apache в выполнении morbo при каждом запросе. После обработки запроса и отдачи контента скрипт morbo завершается и высвобождает ресурсы сервера.
Появление проблемы с url_for на Apache
Сервер работает, сайты на Mojolicious не «засыпают», стали чуточку медленнее открываться - но не принципиально, главное что открываются всегда.
Но считать проблему решенной до конца оказалось рано - появились вопросы с Mojolicious. При формировании страниц из template в тех местах, где в шаблонах страниц было прописано формирование ссылки в виде <%= url_for ‘func_name’ %> после вывода страницы в браузер ссылка принимала вид «/cgi-bin/cms/cart» вместо ожидаемой «/cart»
В то время, как при запуске сайта на Mojolicious без Apache, только на Nginx, просто запуском morbo или hypnotoad эта же самая ссылка формировалась «/cart» как и было задумано.
Но как оказалось это еще не все странности.
Вопрос оказался непростой, можно почитать как его решили.
Конфигурирование Apache для запуска в продакшн Mojolicious
Mojolicious framework – запуск в продакшн на Apache
Конфигурирование Apache для правильной работы Mojolicious
Решение проблемы с «засыпанием» сайтов на Mojolicious