Mojolicious framework – запуск в продакшн на Apache


Mojolicious  framework – запуск в продакшн на Apache

Описывается обычный способ запуска проекта на 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