freeeyes 发表于 2012-1-13 18:52:31

nginx下的lua模块的开发

本帖最后由 freeeyes 于 2012-1-13 18:56 编辑

这里首先得感谢agentzh的大力支持与协助。
之所以想写这篇文章,是因为最近测试python的Django,配合nginx的fastcgi效能并不很好。再加上最近对memcached测试的结果并不是很满意,于是想尝试一种新的思路。
看了agentzh的文章,对此有些想法,于是想实际测试一下,如果不用fastcgi模式,怎么处理?
先安装lua
去lua官网下载lua5.1.4(因为目前ngx_lua是基于5.1.4的)
然后在本地文件夹下解压
tar zxvf lua5.1.4.tar.gz

安装lua,在lua解压路径下输入:
yum install libtermcap-devel ncurses-devel libevent-devel readline-devel(lua的依赖库)
make linux
make linux install

然后去nginx上下载ngx_lua插件:
需要下载三个插件,分别是:
chaoslawful-lua-nginx-module-v0.4.0-0-g7bdd850.tar.gz
simple_kit.tar
agentzh-echo-nginx-module-df58882

分别解压,并重新进入nginx的文件夹(源代码):
进行配置
./configure --add-module=/home/soft/nginx_module/agentzh-echo-nginx-module-df58882/ --add-module=/home/soft/nginx_module/simpl-ngx_devel_kit-bc97eea/ --add-module=/home/soft/nginx_module/chaoslawful-lua-nginx-module-7bdd850/
make
make install

打开nginx.conf文件
添加:
         location /inline_concat {
         access_by_lua_file '/data/poker/ngxlua_test/TestPost.lua';
      }
启动nginx
./nginx -c /usr/local/nginx/conf/nginx.conf

好了,下一步,我想要lua能够支持我的json解析和使用。于是我选择使用了CJson。
第一次安装CJson还真是挺费力的,目前的版本是1.0.4
http://www.kyne.com.au/~mark/software/lua-cjson.php
据说1.0.4解决了locale的数字转换问题,但是不知道为什么总和我的locale冲突,编译的时候报错。
关键是找不到我的locale.h中的locale_t对象,导致Json的C结构体声明失败。
试了很多方法都不起作用,于是一气之下,修改了他的Makefile文件,
把添加的USE_POSIX_USELOCALE声明注释了,
#CFLAGS_EXTRA =      -DUSE_POSIX_USELOCALE
再重新make,终于听话了。
生成的json.so文件,拷贝到你要写lua的工程文件夹下,最好把它的test目录下common.lua一起带过去。这个东东封装了一些非常实用的方法。
好了,让我们来写一个lua脚本,检验一下我的CJson是否能正常工作吧。

#!/usr/bin/env lua

require "common"                                       --这里引用common.lua中的方法
local json = require "cjson"                           --这里指定加载cjson.so

--对传入的Json进行解析,解析后进行逻辑处理,返回指定的路径跳转
function GetURL(strJsonData)
      objData=json.decode(strJsonData);
      if(objData==nil) then
                print('error');
                return "http://127.0.0.1//"
      end
      
      if (objData.test==nil) then
                print('not find');
                return "http://127.0.0.1//";
      else
                print('is find');
                return "http://172.16.23.97:8080//poker-web//facade;";
      end
end

--获得当前的可读的POST数据
ngx.req.read_body()

--获得数据,并进行跳转
local method = ngx.var.request_method                              
local data   = ngx.req.get_body_data()
if data then
    ngx.redirect(GetURL(data))
else
    ngx.redirect('/post-error')
end


好了,大功告成,启动nginx -c
这样做的好处是,以后nginx就是一个门,不处理更多的业务逻辑。只做简单的判定,业务逻辑都转发到相应的服务器。

页: [1]
查看完整版本: nginx下的lua模块的开发