Описывается обычный способ запуска проекта на Mojolicious через Nginx и даются примеры решений вопросов с конфигурацией. Приводятся проблемы и их решение проблемы запуска проекта на Mojolicious на Nginx и Apache на FreeBSD.
Как обычно запускают Mojolicious
Как правило, проект на Perl-фреймворке Mojolicious делаем доступным в инет через Nginx.
Пример минимальной конфигурации
server {
server_name sdep.ru ;
location / {
proxy_pass http://127.0.0.1:3001/ ;
}
}
Этой конфигурации достаточно чтобы при обращении по адресу sdep.ru все запросы были переданы в Mojolicious и все ответы от него переданы обратно в браузер пользователю.
Но это минимальная конфигурация, на практике используется чуть другая.
Пример рекомендуемой минимальной конфигурации
Пример рекомендуемой минимальной конфигурации
server {
server_name sdep.ru ;
location / {
proxy_pass http://127.0.0.1:3001/ ;
client_max_body_size 1m;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Здесь добавлена директива client_max_body_size для того, чтобы на сайт нельзя было внести файл более 1мб, это сделано для экономии места на хостинге.
Директивы proxy_set_header передают в Mojolicious данные по имени хоста (Host) который отрабатывает Nginx в текущей конфигурации, IP адресу пользователя (X-Real-IP) и IP адресу пользователя за прокси-сервером (X-Forwarded-For).
Эти строки рекомендуем вносить в конфигурацию, тогда в Mojolicious вы сможете оперировать данными по имени хоста и IP адресу и корректировать данные или протоколировать работу пользователя.
my $host_name=$self->req->url->to_abs->host;
my $ip = $self->tx->remote_address;
Сразу отмечу, что Mojolicious позволяет слушать 80й порт и сделать это напрямую, прописав в конфигурации порт 80, а не 3001, как показано в примере конфигурации.
Такой вариант крайне не рекомендуется, хотя бы потому, что будут сложности с запуском на 80 порту других проектов на других доменах, тогда как через Nginx смогут работать множеству сайтов с разными доменами на стандартном 80 порту.
Кроме того, можно значительно ускорить работу сайта на Mojolicious добавив строки в конфигурацию Nginx и возложив часть работы по отдачи контента прямо на Nginx.
Пример конфигурации с ускорением сайта на Mojolicious
server {
server_name sdep.ru ;
location / {
proxy_pass http://127.0.0.1:3001/ ;
client_max_body_size 1m;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# все статичные файлы из папок css,images,img,js,photo
# отдаются пользователю напрямую Нжинкс-ом минуя Моджолишос
location /( css|images|img|js|photo) {
root /usr/local/www/sdep.ru/public/;
}
# включам кеш Nginx (кеш должен быть сконфигурирован в файле nginx.conf)
# отдача страниц идет в первую очередь из кеша (это быстро)
# если в кеше нету свежей – тогда страницу генерирует Mojo
proxy_cache my_cache;
}
}
Сконфигурировав таким образом каждый сайт на Mojo и добавив все эти конфигурации в Nginx обеспечиваем раздельную работу каждого на своем отдельном порту (например 3001, 3002, 3003 и тд).
В Nginx в файле nginx.conf создается несколько конфигураций, по одной для каждого домена и ко всем сайтам можно обращаться по стандартном 80 порту к каждому по отдельному имени.
Работа Mojolicious на сервере
И вот казалось бы и решение проблемы, и Apache можно неиспользовать, но это - только казалось.
Выяснилось, что если сайтов на Моджо работает немного, например 5 или 10, то вариант связки Mojolicious + Nginx действительно работает нормально.
На практике получилось так, что пока на Моджолишос было немного сайтов, все действительно работало нормально. Когда сайтов под управлением Mojolicious стало много, появились проблемы. Причем проблемы с работой сайтов то появлялись, то нет.
Как проявлялись проблемы с сайтами в варианте Mojolicious + Nginx
Проблемы в варианте Mojolicious + Nginx стали проявляться в виде частого «падения» hypnotoad и появления эффекта «просыпания от сна», когда после долгого простоя сайта при первом обращении к нему приходилось ждать открытия веб-страницы длительное время. Иногда страница вообще не открывалась, выдавая надпись «Bad gateway». После повторного захода на эту же страницу – страница открывалась и весь сайт начинал работать.
Почему такое происходило и как решить вопросы с «засыпанием» Mojolicious можно почитать тут - Решение проблемы с «засыпанием» сайтов на Mojolicious
Как решали этот вопрос?
Решение вопроса получилось сделать связкой Mojolicious + Apache + Nginx читать далее
Конфигурирование Apache для запуска в продакшн Mojolicious
Mojolicious framework – запуск в продакшн на Apache
Конфигурирование Apache для правильной работы Mojolicious