ФорумПрограммированиеБольше языковPerl → FAQ: Установка веб-фреймворка Perl Dancer на Nginx используя PSGI/Plack

FAQ: Установка веб-фреймворка Perl Dancer на Nginx используя PSGI/Plack

  • Ivan

    Сообщения: ? Репутация: N Группа: Адекваты

    Spritz 8 февраля 2012 г. 8:20, спустя 168 дней 2 часа 50 минут

    PerlDancer - веб-фреймворк на perl, косящий под веб-фреймворк RubyOnRails на ruby.
    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 и радуемся =)
  • Sinkler

    Сообщения: 9658 Репутация: N Группа: в ухо

    Spritz 24 августа 2011 г. 2:21, спустя 17 часов 56 секунд

    хоть бы марио пришел, через базу поменял группу Ване)))
  • md5

    Сообщения: 11951 Репутация: N Группа: в ухо

    Spritz 24 августа 2011 г. 2:42, спустя 21 минуту 23 секунды

    я въебал адеквата, оказывается, это через профиль в 2 щелчка делается :D
    все умрут, а я изумруд
  • AlexB

    Сообщения: 4288 Репутация: N Группа: в ухо

    Spritz 24 августа 2011 г. 2:54, спустя 11 минут 33 секунды

    Кстати, тут знакомые из одной очень крупной и известной интернет-компании ищут перл программиста. Говорят позарез нужен, готовы любые условия обсуждать. Так что если есть желающие …
  • Sinkler

    Сообщения: 9658 Репутация: N Группа: в ухо

    Spritz 24 августа 2011 г. 2:57, спустя 2 минуты 37 секунд


    я въебал адеквата, оказывается, это через профиль в 2 щелчка делается :D
    век живи век учись на пiха.ру
  • Ivan

    Сообщения: ? Репутация: N Группа: Адекваты

    Spritz 24 августа 2011 г. 6:29, спустя 3 часа 32 минуты 34 секунды

    Спасибо за доверие!

Пожалуйста, авторизуйтесь, чтобы написать комментарий!