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