Подтвердить что ты не робот

Объяснение веб-стека nginx/starman/dancer

Я занимаюсь веб-программированием некоторое время и хорошо знаком со стеком LAMP. Я решил попробовать поиграть со стеком nginx/starman/dancer, и я немного смущен тем, как понять, с самого высокого уровня, как все части связаны друг с другом. Настройка стека не кажется такой же прямой, как настройка стека LAMP, но, вероятно, потому, что я действительно не понимаю, как соотносятся эти фрагменты.

Я понимаю, что играет nginx - легкий веб-сервер/прокси - но я смущен тем, как starman относится к pgsi, plack и dancer.

Я был бы признателен за высокоуровневую разбивку того, как эти части соотносятся друг с другом и почему каждый из них необходим (или не обязательно), чтобы получить настройку стека. Спасибо!

4b9b3361

Ответ 1

Я потратил последний день на чтение различных компонентов, и я думаю, что у меня достаточно понимания, чтобы ответить на мой собственный вопрос. Большинство моих ответов можно найти в разных местах в Интернете, но, надеюсь, будет некоторая ценность для размещения всех частей в одном месте:

  • Nginx: первая и самая очевидная часть стека для понимания - nginx. Nginx - это легкий веб-сервер, который может выступать в качестве замены для вездесущего веб-сервера Apache. Nginx также может выступать в качестве прокси-сервера. Он быстро растет в своем использовании и в настоящее время обслуживает 10% всех веб-доменов. Одним из важных преимуществ nginx является то, что он асинхронен и управляется событиями, а не создает поток процессов для обработки каждого соединения. Теоретически это означает, что nginx способен обрабатывать большое количество соединений, не используя много системных ресурсов.
  • PSGI: PSGI - это протокол (чтобы отличить его от конкретной реализации протокола, такого как Plack). Главной мотивацией для создания PSGI, насколько я могу судить, является то, что когда Apache был впервые создан, не было встроенной поддержки обработки запросов со сценариями, написанными, например, Perl. Возможность сделать это была привязана к Apache с помощью mod_cgi. Чтобы протестировать ваше приложение Perl, вам придется запускать весь веб-сервер, поскольку приложение запускается на веб-сервере. Напротив, PSGI предоставляет протокол, с которым веб-сервер может связываться с сервером, написанным, например, Perl. Одно из преимуществ этого заключается в том, что гораздо проще протестировать сервер Perl независимо от веб-сервера. Еще одно преимущество заключается в том, что после создания сервера приложений очень легко переключиться на различные совместимые с PSGI веб-серверы для тестирования, который обеспечивает лучшую производительность.
  • Plack: Это конкретная реализация протокола PSGI, который обеспечивает клей между веб-сервером, совместимым с PSGI, и сервером приложений perl. Plack - эквивалент Perl Ruby Rack.
  • Starman: веб-сервер на основе perl, совместимый с протоколом PSGI. Одна путаница у меня была то, что я хотел бы использовать как Starman, так и Nginx в то же время, но, к счастью, этот вопрос был довольно хорошо ответил на Stackoverflow. Суть в том, что было бы лучше позволить nginx обслуживать статические файлы, не требуя для этого процесса perl, а также позволяя серверу приложений Perl работать на более высоком порту.
  • Dancer: Рамка веб-приложений для Perl. Вид эквивалента Ruby on Rails. Или, точнее, эквивалент Sinatra для Ruby (разница в том, что Sinatra - минималистская структура, тогда как Ruby on Rails - это более полная веб-структура). Как кто-то, кто занимался PHP и раньше не использовал веб-фреймворк, я немного смутился о том, как это связано с обслуживающим стеком. Точка веб-фреймворков - это абстрактные общие задачи, которые очень часто выполняются в веб-приложениях, такие как преобразование запросов базы данных в объекты/структуры данных в веб-приложении.

  • Установка (на ubuntu):

    sudo apt-get install nginx
    sudo apt-get install build-essential curl
    sudo cpan App::cpanminus
    sudo cpanm Starman
    sudo cpanm Task::Plack
    sudo apt-get install libdancer-perl
  • Как начать работу:
cd
dancer -a mywebapp
sudo plackup -s Starman -p 5001 -E deployment --workers=10 -a mywebapp/bin/app.pl

Теперь у вас будет сервер starman, на котором запущено приложение Dancer на порту 5001. Чтобы nginx отправил трафик на сервер, вам нужно изменить

/etc/nginx/nginx.conf
и добавить в него что-то вроде этого в раздел http:
        server {
               server_name permanentinvesting.com
               listen 80;

                location /css/ {
                  alias /home/ubuntu/mywebapp/public/css/;
                  expires 30d;
                  access_log off;
                }



               location / {
                  proxy_pass        http://localhost:5001;
                  proxy_set_header  X-Real-IP  $remote_addr;
                }

        }

Первое правило местоположения указывает, что nginx должен обрабатывать статический контент в каталоге /css, получая его из

/home/ubuntu/mywebapp/public/css/
. В правиле второго местоположения указано, что трафик на веб-сервер на порту 80 должен быть отправлен на сервер Starman для обработки. Теперь нам просто нужно запустить nginx:
sudo service nginx start

Ответ 2

Ваш ответ до сих пор правильный, но лучше было бы настроить nginx следующим образом:

server {
    listen 80;
    server_name foo.example.com;

    location / {
        # Serve static files directly:
        if (-f $request_filename) {
            expires 30d;
            break;
        }

        # Pass on other requests to Dancer app
        proxy_pass_header Server;
        proxy_pass http://localhost:5001/;
    }
}

Это делает nginx обслуживать все статические файлы (JavaScript и изображения), а не только css.

Этот пример взят из 2011 Perl Dancer Advent:)

Ответ 3

Из nginx wiki:
"IfIsEvil... Директива if имеет проблемы при использовании в контексте местоположения, в некоторых случаях она не делает то, что вы ожидаете, а что-то совершенно другое. В некоторых случаях это даже segfaults. Как правило, рекомендуется избегать, если это возможно...."

Лучшая настройка:

server {
    listen 80;
    server_name foo.example.com;

    location / {  
    # Checks the existence of files and uses the first match
                try_files $uri $uri/ @dancer;
          } 

    location @dancer {
    # Pass on other requests to Dancer app
            proxy_pass_header Server;
            proxy_pass http://localhost:5001/;
        }
}