nginx+FastCGI(over spawn-fcgi)+lua

    И так у нас есть задача. Заставить работать вместе легкий веб-сервер nginx и lua(в данном случае lua через wsapi(lua web server API)-fastcgi).
    Что нам потребуется? Ну для начала голова на плечах. Ну то есть не то, что бы она особо нужна, но пригодится.
    А далее… А далее сервер в нашем случае с GNU/Linux на борту(но думаю что сойдет и, скажем FreeBSD), мы будем рассматривать на примере Ubuntu GNU/Linux, так сложилось исторически.

    Ставим nginx.
    # apt-get install nginx

    и собственно nginx с нами, это понятно, тут все просто.
    Далее начинаются чудеса.
    Как говорят наши программисты работающие с lua в Ubuntu luarocks покорежен так, что мама родная не узнает, плюс к тому luarocks зарелизил версию 2.0 за несколько дней до релиза Ubuntu 9.10 и версия не вошла в релиз, а программисты хотят именно его. Значит luarocks временно будем ставим из сырцов, а чуть позже сделаем свой репозиторий и будем собирать пакетик.

    ну а пока…
       1. $ sudo apt-get install unzip lua5.1 liblua5.1-dev libreadline-dev
       2. $ mkdir -p ~/build && cd ~/build
       3. $ wget http://luarocks.org/releases/luarocks-2.0.tar.gz (взять самую свежую версию с http://luarocks.org)
       4. $ tar -zxf luarocks-2.0.tar.gz && cd luarocks-2.0
       5. $ ./configure --with-lua-include=/usr/include/lua5.1
       6. $ make
       7. $ sudo make install
    

    Да, таким образом мы конечно разведем некоторую помойку в системе, но пока это мы оставим так, до поры, до времени.

    luarocks мы поставили, молодцы.
    ставим wsapi-fcgi
    # luarocks install wsapi-fcgi
    

    ага, молодцы, поставили.

    теперь нам пожалуй пригодится spawn-cgi, что бы наш wsapi-fcgi нас где-нибудь поджидал :)
    # apt-get install spawn-cgi
    

    следующей проблемой является отсутствие стартового скрипта для spawn-fcgi в Ubuntu. решается использованием примерно такого скрипта:

    #! /bin/sh<br/>
     <br/>
    ### BEGIN INIT INFO<br/>
    # Provides: spawn-fcgi<br/>
    # Required-Start: $all<br/>
    # Required-Stop: $all<br/>
    # Default-Start: 2 3 4 5<br/>
    # Default-Stop: 0 1 6<br/>
    # Short-Description: starts FastCGI<br/>
    # Description: starts FastCGI with spawn-fcgi<br/>
    ### END INIT INFO<br/>
     <br/>
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br/>
    NAME=spawn-fcgi<br/>
    PID=/var/run/spawn-fcgi.pid<br/>
    DAEMON=/usr/bin/spawn-fcgi<br/>
    DAEMON_OPTS="-f /usr/local/lib/luarocks/bin/wsapi.fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -P $PID"<br/>
    /lib/lsb/init-functions<br/>
     <br/>
    test -x $DAEMON || exit 0<br/>
     <br/>
    set -e<br/>
     <br/>
    case "$1" in<br/>
    start)<br/>
    log_daemon_msg "spawn-fcgi starting"<br/>
    start-stop-daemon --start --pidfile $PID --exec $DAEMON -- $DAEMON_OPTS<br/>
    echo "done."<br/>
    ;;<br/>
    stop)<br/>
    log_daemon_msg "spawn-fcgi stopping"<br/>
    start-stop-daemon --stop --pidfile $PID --retry 5<br/>
    rm -f $PID<br/>
    echo "done."<br/>
    ;;<br/>
    restart)<br/>
    echo "Stopping $NAME: "<br/>
    start-stop-daemon --stop --pidfile $PID --retry 5<br/>
    rm -f $PID<br/>
    echo "done..."<br/>
    sleep 1<br/>
    echo "Starting $NAME: "<br/>
    start-stop-daemon --start --pidfile $PID --exec $DAEMON -- $DAEMON_OPTS<br/>
    echo "done."<br/>
    ;;<br/>
    *)<br/>
    echo "Usage: /etc/init.d/$NAME {start|stop|restart}" >&2<br/>
    exit 1<br/>
    ;;<br/>
    esac<br/>
     <br/>
    exit 0


    укладываем скрипт на место в /etc/init.d/spawn-fcgi, добавляем на уровени загрузки, вуаля! с запуском как fcgi wsapi вопрос решен.
    # update-rc.d spawn-fcgi defaults 21 
    


    конфигурируем nginx, что бы отдавал все что приходит на наш хост который нужно дальше для обработки wsapi-fcgi
    мой пример не является особо правильным, просто под те нужды под которые писалось было достаточно.

    в /etc/nginx/sites-available создаем файлик fcgi следующего содержания:
     server {
            listen   наш-сервер-wsapi.cxm:80;
            server_name  наш-сервер-wsapi.cxm;
            access_log  /var/log/nginx/наш-сервер-wsapi.cxm.access.log;
    
            location / {
                              fastcgi_pass   localhost:9000;
                              fastcgi_index  index.lua;
    
                              fastcgi_param  SCRIPT_FILENAME  /srv/www/nginx/fcgi/lua$fastcgi_script_name;
                              fastcgi_param  QUERY_STRING     $query_string;
                              fastcgi_param  REQUEST_METHOD   $request_method;
                              fastcgi_param  CONTENT_TYPE     $content_type;
                              fastcgi_param  CONTENT_LENGTH   $content_length;
                             }
    }
    


    создаем с него симлинку в /etc/nginx/sites-enabled, перезапускаем nginx

    по адресу /srv/www/nginx/fcgi/lua размещаем наш тестовый index.lua
    заходим браузером и проверяем работает ли.

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

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 8

      0
      А что, правда кто-то использует lua в веб? В чем фишка?
        +1
        Правда кто-то использует. Фишка в скорости и удобстве. Удобство, правда, создаёшь себе сам — но это уже детали. :-)
        0
        когда-то ковырял луа
        а почему б не использовать лайти, у него поддержка луа модулем, как перл в нгиксе?
          +1
          Луа в лайти НЕ предназначена для использования в качестве генератора страниц.

          mod_magnet is a module to control the request handling in lighty. It allows you to do more complex URL rewrites and caching than you would otherwise be able to do.

          While the lua language the mod_magnet uses is very powerful, mod_magnet is not meant to be a general replacement for your regular scripting environment. This is because mod_magnet is executed in the core of Lighty and EVERY long-running operation is blocking ALL connections in the server. You are warned. For time-consuming or blocking scripts use mod_fastcgi and friends.

          redmine.lighttpd.net/wiki/lighttpd/Docs:ModMagnet
            +1
            Кстати, ходят слухи, что mod_lua будет включён в apache в следующем релизе.

          0
          jan.kneschke.de/projects/lua/ вот такая вещь еще есть ;)
            0
            комент
              0
              комент

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое