Pull to refresh

nginx+FastCGI(over spawn-fcgi)+lua

Reading time4 min
Views9.1K
И так у нас есть задача. Заставить работать вместе легкий веб-сервер 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
заходим браузером и проверяем работает ли.

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

Tags:
Hubs:
+2
Comments8

Articles

Change theme settings