PSGI - является мощнейшим шлюзом между скриптом и веб-сервером для perl, аналогичен WSGI для питона. Варианты серверов/шлюзов смотрите на http://plackperl.org/
Данный FAQ подразумевает уже установленный NGINX!
Устанавливаем PerlDancer:
curl -L http://cpanmin.us | perl - –sudo Dancer
Устанавливаем PSGI/Plack:
curl -L http://cpanmin.us | perl - –sudo Task::Plack
Создаём новый Dancer-Site для нашего домена site.ru:
cd /srv/www
dancer -a site_ru
Сайт готов:
+ site_ru
+ site_ru/bin
+ site_ru/bin/app.pl
+ site_ru/config.yml
+ site_ru/environments
+ site_ru/environments/development.yml
+ site_ru/environments/production.yml
+ site_ru/views
+ site_ru/views/index.tt
+ site_ru/views/layouts
+ site_ru/views/layouts/main.tt
+ site_ru/MANIFEST.SKIP
+ site_ru/lib
site_ru/lib/
+ site_ru/lib/site_ru.pm
+ site_ru/public
+ site_ru/public/css
+ site_ru/public/css/style.css
+ site_ru/public/css/error.css
+ site_ru/public/images
+ site_ru/public/500.html
+ site_ru/public/404.html
+ site_ru/public/dispatch.fcgi
+ site_ru/public/dispatch.cgi
+ site_ru/public/javascripts
+ site_ru/public/javascripts/jquery.js
+ site_ru/t
+ site_ru/t/002_index_route.t
+ site_ru/t/001_base.t
+ site_ru/Makefile.PL
В Dancer есть свой встроенный сервер прямо как и в ROR, вешающийся на 3000 порт. Данный сервер служит лишь для тестирования и не рекомендован к употреблению в публичных целях. В данном случае запустить его не грех - нужно проверить работоспособность фреймворка на текущей версии perl:
cd site_ru
./bin/app.pl
Открываем в браузере страничку http://ваш_ип:3000 и лицезреем дефолтную страничку. Если всё хорошо - продолжаем:
Нажмите CTRL+C, это остановит сервер и вернет вам управление shell. Использовать в качестве сервера мы будем высокопроизводительный Starman. Его дополнительная установка не требуется - при установке Task::Plack вы уже автоматически установили в систему все возможные PSGI-сервера.
Строка запуска которая нам нужна, выглядит таким образом:
plackup –env deployment –server Starman –workers=10 –port 5001 –app /srv/www/site_ru/bin/app.pl
Сделаем из неё демон (переменные в баш загоним для удобства создания init daemon):
STARMAN_WWW_DIR="/srv/www"
STARMAN_WORKERS="10"
STARMAN_PORT="5001"
printf "#! /bin/sh\n\nPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nDAEMON=/usr/local/bin/plackup\nNAME=\"starman\"\nCWD=${STARMAN_WWW_DIR}/\$2\n# Defaults\nRUN=\"no\"\nOPTIONS=\"–env \$3 –server Starman –workers=${STARMAN_WORKERS} –port ${STARMAN_PORT} –app \$CWD/bin/app.pl\"\nPIDFILE=\"\$NAME.pid\"\n\ntest -x \$DAEMON || exit 0\n\nlog_daemon_msg() {\n echo -n \"\$1: \$2\"\n}\n\nlog_end_msg() {\n if [ \$1 -ne 0 ]; then\necho \" failed\"\n else\necho \".\"\n fi\n}\n\n[ -f /lib/lsb/init-functions ] && . /lib/lsb/init-functions\n\nstart()\n{\n log_daemon_msg \"Starting plack server\" \"\$NAME\"\n start-stop-daemon -b -m –start –quiet –pidfile \"\$PIDFILE\" –exec \$DAEMON – \$OPTIONS\n if [ \$? != 0 ]; then\nlog_end_msg 1\n exit 1\n else\nlog_end_msg 0\n fi\n}\n\nsignal()\n{\n\n if [ \"\$1\" = \"stop\" ]; then\nSIGNAL=\"TERM\"\n log_daemon_msg \"Stopping plack server\" \"\$NAME\"\n else\nif [ \"\$1\" = \"reload\" ]; then\nSIGNAL=\"HUP\"\n log_daemon_msg \"Reloading plack server\" \"\$NAME\"\n else\necho \"ERR: wrong parameter given to signal()\"\n exit 1\n fi\nfi\nif [ -f \"\$PIDFILE\" ]; then\nstart-stop-daemon –stop –signal \$SIGNAL –quiet –pidfile \"\$PIDFILE\"\n if [ \$? = 0 ]; then\nlog_end_msg 0\n else\nSIGNAL=\"KILL\"\n start-stop-daemon –stop –signal \$SIGNAL –quiet –pidfile \"\$PIDFILE\"\n if [ \$? != 0 ]; then\nlog_end_msg 1\n [ \$2 != 0 ] || exit 0\n else\nrm \"\$PIDFILE\"\n log_end_msg 0\n fi\nfi\nif [ \"\$SIGNAL\" = \"KILL\" ]; then\nrm -f \"\$PIDFILE\"\n fi\nelse\nlog_end_msg 0\n fi\n}\n\ncase \"\$1\" in\n start)\n start\n ;;\n\n force-start)\n start\n ;;\n\n stop)\n signal stop 0\n ;;\n\n force-stop)\n signal stop 0\n ;;\n\n reload)\n signal reload 0\n ;;\n\n force-reload|restart)\n signal stop 1\n sleep 2\n start\n ;;\n\n *)\n echo \"Usage: /etc/init.d/\$NAME {start|force-start|stop|force-stop|reload|restart|force-reload}\"\n exit 1\n ;;\nesac\n\nexit 0" > /etc/init.d/starman
chmod +x /etc/init.d/starman
update-rc.d starman defaults
Если вы не хотите каждый раз при перезагрузке сервера запускать starman - просто не пишите последнюю команду
Проверяем наш демон:
service starman start site_ru deployment
starman [Команда] [Dancer-Site] [Environment]
Доступные команды:
start, stop, restart, force-start, force-stop, reload, force-reload
При остановке достаточно указать лишь команду stop, Dancer-Site и прочее указывать не нужно
При запуске htop можно наблюдать такую картину, если всё работает успешно:
Не стоит путать starman с каким-нибудь spawn-fcgi - starman является самостоятельным веб-сервером и весьма устойчив к хакерским атакам (по крайней мере относительно других PSGI-серверов)
Проверяем результат: http://ваш_ип:указанный_порт (5001)
Perl is dancing
You’ve joined the dance floor!
Значит все хорошо, продолжаем - наша задача теперь перебросить это дело на NGINX:
Придется руками подредактировать конфигурацию nginx (не люблю редактировать руками, обычно всё загоняю в команды)
upstream starman {
server 127.0.0.1:5001;
}
server {
server_name site.ru;
location ^~ (/images/|/css/|/javascripts/) {
root /srv/www/site_ru/public;
expires 30d;
}
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://starman;
}
}
Обратите внимание что порт указан 5001, укажите ваш порт если он у вас отличается.
Рестартим сервер nginx:
service nginx restart
Переходим на http://site.ru и радуемся =)