找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5525|回复: 0

nginx下的lua模块的开发

[复制链接]
发表于 2012-1-13 18:52:31 | 显示全部楼层 |阅读模式
本帖最后由 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是否能正常工作吧。
  1. #!/usr/bin/env lua
  2. require "common"                                       --这里引用common.lua中的方法
  3. local json = require "cjson"                           --这里指定加载cjson.so
  4. --对传入的Json进行解析,解析后进行逻辑处理,返回指定的路径跳转
  5. function GetURL(strJsonData)
  6.         objData=json.decode(strJsonData);
  7.         if(objData==nil) then
  8.                 print('error');
  9.                 return "http://127.0.0.1//"
  10.         end
  11.         
  12.         if (objData.test==nil) then
  13.                 print('not find');
  14.                 return "http://127.0.0.1//";
  15.         else
  16.                 print('is find');
  17.                 return "http://172.16.23.97:8080//poker-web//facade;";
  18.         end
  19. end
  20. --获得当前的可读的POST数据
  21. ngx.req.read_body()
  22. --获得数据,并进行跳转
  23. local method = ngx.var.request_method                              
  24. local data   = ngx.req.get_body_data()
  25. if data then
  26.     ngx.redirect(GetURL(data))
  27. else
  28.     ngx.redirect('/post-error')
  29. end
复制代码

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

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-3 21:18 , Processed in 0.011214 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表