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]