据说lua的效率高,公司要求,路过学习下。哎

安装

需要最新版的NginxLuaJITngx_devel_kitngx_lua等安装文件。

安装Lua或者LuaJIT都是可以的,但是出于效率的考虑,推荐安装LuaJIT。

shell> wget http://luajit.org/download/LuaJIT-<VERSION>.tar.gz
shell> tar zxvf LuaJIT-<VERSION>.tar.gz
shell> cd LuaJIT-<VERSION>
shell> make
shell> make install

因为安装在缺省路径,所以LuaJIT对应的lib,include均在/usr/local目录里。

shell> export LUAJIT_LIB=/usr/local/lib
shell> export LUAJIT_INC=/usr/local/include/luajit-<VERSION>

下面就可以编译Nginx了:

shell> wget http://nginx.org/download/nginx-<VERSION>.tar.gz
shell> tar zxvf nginx-<VERSION>.tar.gz
shell> cd nginx-<VERSION>
shell> ./configure
--add-module=/path/to/ngx_lua \
--add-module=/path/to/ngx_devel_kit
shell> make
shell> make install

试着启动一下Nginx看看,如果你运气不好的话,可能会遇到如下错误:

cannot open shared object file: No such file or directory

这是神马情况?可以用ldd命令来看看:

shell> ldd /path/to/nginx
libluajit-<VERSION>.so => not found

此类问题通常使用ldconfig命令就能解决:

shell> echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
shell> ldconfig

再试着启动Nginx看看,应该就OK了。

应用

我们先用一个简单的程序来暖暖场:把下面的代码加入到Nginx的配置文件nginx.conf,并重启Nginx,然后浏览,就能看到效果了。

location /lua {
set $test "hello, world.";
content_by_lua '
ngx.header.content_type = "text/plain";
ngx.say(ngx.var.test);
';
}

在深入学习ngx_lua之前,建议大家仔细阅读一遍春哥写的Nginx教程

这里我就说关键的:Nginx配置文件所使用的语言本质上是『声明性的』,而非『过程性的』。Nginx处理请求的时候,指令的执行并不是由定义指令时的物理顺序来决定的,而是取决于指令所属的阶段,Nginx常用的阶段按先后顺序有:rewrite阶段,access阶段,content阶段等等。演示代码中的set指令属于rewrite阶段,content_by_lua指令属于content阶段,如果试着把两条指令的顺序交换一下,会发现程序依然能够正常运行。

下面我们尝试结合Redis写个更实战一点的例子。

首先,我们需要创建一个Redis配置文件config.json,内容如下:

{
"host": "<HOST>",
"port": "<PORT>"
}

然后,我们创建一个解析配置文件的脚本init.lua,其中用到了Lua CJSON模块:

local cjson = require "cjson";

local config = ngx.shared.config;

local file = io.open("config.json", "r");
local content = cjson.decode(file:read("*all"));
file:close(); for name, value in pairs(content) do
config:set(name, value);
end

说明:代码里用到了共享内存,这样就不必每次请求都解析一遍配置文件了。

接着,我们创建一个渲染内容的脚本content.lua,用到了Resty Redis模块:

ngx.header.content_type = "text/plain";

local redis = require "resty.redis";

local config = ngx.shared.config;

local instance = redis:new();

local host = config:get("host");
local port = config:get("port"); local ok, err = instance:connect(host, port);
if not ok then
ngx.log(ngx.ERR, err);
ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE);
end instance:set("name", "laowang"); local name = instance:get("name") instance:close(); ngx.say("name: ", name);

说明:建议把Resty Redis模块放到vendor目录下,稍后在Nginx中统一设置。

最后,我们需要在Nginx配置文件里设置一下:

lua_shared_dict config 1m;
lua_package_path "/path/to/vendor/?.lua;;"; init_by_lua_file /path/to/init.lua; server {
lua_code_cache off; location /lua {
content_by_lua_file /path/to/content.lua;
} ...
}

说明:为了方便调试,我关闭了lua_code_cache,如果是生产环境,应该开启它。

另外,安装CJSON的时候,需要注意Makefile文件里头文件的路径,缺省是:

PREFIX = /usr/local
LUA_INCLUDE_DIR = $(PREFIX)/include

如果安装的是LuaJIT的话,最好把头文件拷贝到相应目录:

cp /usr/local/include/luajit-<VERSION>/* /usr/local/include/

转载自:http://huoding.com/2012/08/31/156

nginx 的其他配置可以参考:http://www.cnblogs.com/liushannet/archive/2013/01/07/2849585.html

nginx 搭配 lua的更多相关文章

  1. nginx 与 lua 开发环境搭建

    首先下载最新版的 相关软件 的安装文件. nginx: http://nginx.org/en/download.html LuaJIT: http://luajit.org/download.htm ...

  2. openresty(nginx)、lua、drizzle调研

    一.概述: 1.研究目标:nginx中使用lua脚本,及nginx直接访问mysql,redis 2.需要安装的内容: openresty,mysql,redis 3.OpenResty (也称为 n ...

  3. Nginx安装lua支持

    Nginx安装lua支持 需要LuaJIT-2.0.4.tar.gz,ngx_devel_kit,lua-nginx-module 1.下载安装LuaJIT-2.0.4.tar.gz wget -c ...

  4. Nginx与Lua

    http://www.cnblogs.com/xd502djj/archive/2012/11/20/2779598.html 今天安装lua试试,这个从开始装的,发现一篇文字,字数虽少,但是却讲的很 ...

  5. nginx安装lua模块实现高并发

    nginx安装lua扩展模块 1.下载安装LuaJIT-2.0.4.tar.gz wget -c http://luajit.org/download/LuaJIT-2.0.4.tar.gz tar ...

  6. 11: Nginx安装lua支持

    1.1 Nginx 使用lua脚本 注:需要LuaJIT-2.0.4.tar.gz,ngx_devel_kit,lua-nginx-module 1.Nginx安装lua支持 wget -c http ...

  7. nginx 增加 lua模块

    Nginx中的stub_status模块主要用于查看Nginx的一些状态信息. 本模块默认是不会编译进Nginx的,如果你要使用该模块,则要在编译安装Nginx时指定: ./configure –wi ...

  8. Nginx利用lua剪辑FastDFS图片

    Nginx利用lua剪辑FastDFS中的图片 我们经常用FastDFS来做图片服务器,通过nginx来上传或者获取图片.本文要实现的功能是,当客户端要获取不同尺寸的图片是,lua根据url中的尺寸大 ...

  9. nginx与Lua执行顺序

    Nginx顺序 Nginx 处理每一个用户请求时,都是按照若干个不同阶段(phase)依次处理的,而不是根据配置文件上的顺序. Nginx 处理请求的过程一共划分为 11 个阶段,按照执行顺序依次是 ...

随机推荐

  1. BOM DOM

    http://www.cnblogs.com/yexiaochai/archive/2013/05/28/3102674.html DOM Document Object Model 文档对象模型 一 ...

  2. VBA中自定义类和事件的(伪)注册

    想了解一下VBA中自定义类和事件,以及注册事件处理程序的方法. 折腾了大半天,觉得这样的方式实在称不上“注册”,所以加一个“伪”字.纯粹是瞎试,原理也还没有摸透.先留着,有时间再接着摸. 做以下尝试: ...

  3. STM32的I2C通信

    I2C总线是由NXP(原PHILIPS)公司设计,有十分简洁的物理层定义,其特性如下: 只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL: 每个连接到总线的器件都可以通过唯一的地址和一直 ...

  4. 清除SVN获取文件的所有.svn文件夹

    Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\清除SVN信息] @=&qu ...

  5. 部署PDA程序的时候存储不足的解决办法

    通常Windows Mobile的存储空间分为程序内存和存储内存,默认都比较小,当程序比较大的时候可能无法正常部署到设备上面,针对此问题可采用如下办法解决:1.通过VS修改,工具--选项--设备--选 ...

  6. Android 测试工具

    有时候会发现给手机烧入的信息里少了某一些文件,比如一个图标,或者一个mp3文件之类的等等,为此做了一个小工具检查指定手机里面是否包含相应的文件. 通过程序执行手机的命令来操作手机,感觉还挺有意思的. ...

  7. 发布《Linux工具快速教程》

    发布<Linux工具快速教程> 阶段性的完成了这本书开源书籍,发布出来给有需要的朋友,同时也欢迎更多的朋友加入进来,完善这本书: 本书Github地址:https://github.com ...

  8. hdu 5643 King's Game 约瑟夫变形

    首先约瑟夫问题的数学推理过程:我们知道第一个人(编号一定是(m-1) mod n) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m mod n的人开始):k k+1 k+2 ... ...

  9. win8和ubuntu双系统安装

    做了一个windows和Ubuntu双系统,参考了一些文章.网上资料不少,我就不重复了. 虽然没什么难度,但是有些细节在装的时候需要注意.不然造成资料丢失,系统崩溃,你就得不偿失,需要折腾花费较长的时 ...

  10. cocos2d-x 3.X(一)环境搭建问题

    在按照官网上的教程(http://cn.cocos2d-x.org/tutorial/show?id=1478)步骤一步一步安装完成同时也添加了各项环境变量,运行cocos命令也没有任何问题,但就是在 ...