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

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

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

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

4 ответов


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

  • 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.
  • Starman: веб-сервер на основе perl, совместимый с протоколом PSGI. Одна путаница у меня была, почему я хотел использовать и Starman и Nginx одновременно, но, к счастью, этот вопрос был ответил довольно хорошо здесь, на Stackoverflow. Суть в том, что может быть лучше позволить nginx обслуживать статические файлы, не требуя процесса perl для этого, а также позволяя серверу приложений perl работать на более высоком порту.
  • танцор: платформа веб-приложений для 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

ваш ответ до сих пор правильный, но было бы лучше настроить 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:)


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

лучше настроить:

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/;
        }
}

исправление для ответа от ы.Магри:

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

мне пришлось удалить косую черту в последней директиве proxy_pass. Моя версия nginx (1.10.3) не запускается с косой чертой.