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

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

  • Ivan

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

    Spritz 8 февраля 2012 г. 17: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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

    Сообщения: 1 Репутация: N Группа: Кто попало

    Spritz 30 марта 2021 г. 8:24, спустя 3505 дней 18 часов 54 минуты

    You Inner Passion in Your Heart.Everyone -every person in this world has a Dream: a passion, a vision in
    their life that pulls them and urges them to move forward in life. You, my friend have this vision within
    you, it "whispers" to you occasionally, but in some cases it cries out. It cries out to be listened to and
    acted upon because this vision comes from your soul.u have.

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