Nginx与Lua

摘要:
Nginx和Lua首先将Nginx与Lua结合在一起是OpenResty,它有一个ngx_Lua模块,将Lua嵌入Nginx中;后来,Tengine还包括了ngx_Lua模块。至于OpenResty和Tengine的优点和缺点,让你来判断。以下信息可供参考:ngx_ Openresty:由Lua淘宝Nginx应用程序、定制和开发实战推荐发布的Nginxecsyssted。看看Chungge在Tech Club上关于“Lua绑定的Nginx生态环境”的演讲记录,有材料!安装需要最新版本的Nginx、LuaJIT、ngx_devel_kit、ngx_Luapcre和其他安装文件。最后,我们需要在Nginx配置文件shared_dictconfig1m中设置lua;lua_package_path“/path/to/vendor/?
Nginx与Lua
 

最先将Nginx,Lua组合到一起的是OpenResty,它有一个ngx_lua模块,将Lua嵌入到了Nginx里面;随后Tengine也包含了ngx_lua模块。至于二者的区别:OpenResty是Nginx的Bundle;而Tengine则是Nginx的Fork。值得一提的是,OpenResty和Tengine均是国人自己创建的项目,前者主要由春哥晓哲开发,后者主要由淘宝打理。

至于OpenResty和Tengine孰优孰劣,留给大家自己判断,如下资料可供参考:

推荐看看春哥在Tech-Club上关于『由Lua粘合的Nginx生态环境』的演讲实录,有料!

安装

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

安装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=/usr/local/lua-nginx-module --add-module=/usr/local/ngx_devel_kit --with-pcre=/usr/local/pcre
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与Lua》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[转载]GDAL附带工具Beanshell vs JSR223 vs Java JMeter脚本:性能关闭你一直在等待!下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用goaccess对Nginx日志简单分析

接上篇使用 Linux命 令来分析。使用命令太麻烦,既不快捷又不直观,市面上有不少现成的工具可以使用,比如 ELK。但 ELK 太重了,这里使用的是比较轻量的 goaccess。 接收日志 goaccess 是直接对日志文件进行分析,首先要获得日志文件。nginx 原生支持将日志发送到远程 syslog , 参见官方文档。 1 access_log sy...

使用cwRsync实现windows下文件定时同步

1.参考文献: 使用cwRsync实现windows下文件定时同步(备份) 文件同步工具CwRsync的使用方法及常用命令详解 2.背景: 当前的SCADA架构中,有1台Server,5台FE,还有1台Client。其架构如下图所示: 虽然叫法不同,但是他们的安装文件和配置文件是完全一样的。并且大多数情况下,也建议这些服务器上面的配置文件保持一致,这样只...

tf.Session()函数的参数应用(tensorflow中使用tf.ConfigProto()配置Session运行参数&amp;amp;&amp;amp;GPU设备指定)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/dcrmg/article/details/79091941 tf.ConfigProto()函数用在创建session的时候,用来对session进行参数配置: config = tf.Config...

golang包快速生成base64验证码

base64Captcha快速生成base64编码图片验证码字符串 支持多种样式,算术,数字,字母,混合模式,语音模式. Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。Base64编码可用于在HTTP环境下传递较长的标识信息, 直接把base64当成是字符串方式的数据就好了 减少了http请求;数据就是图片; 为APIs微服务而设计...

Lua保留指定小数位数

默认会四舍五入 比如:%0.2f 会四舍五入后,保留小数点后2位 print(string.format("%.1f",0.26)) ---会输出0.3,而不是0.2 Lua保留一位小数 --- nNum 源数字 --- n 小数位数 function Tool. GetPreciseDecimal(nNum, n) if type(nNum)...

git config配置快捷命令

二、基本面 git的alias是通过配置文件进行定制的,这个配置文件能做的事情还有很多,远远超过这篇文档的主题。 git的全局配置文件一般叫做.gitconfig,当前仓库的配置文件是.git目录下的config文件。很明显,这俩配置文件的作用范围是不同的。 三、使用git alias 首先要修改配置文件 3.1 linux 我用的是ubuntu 12....