您好,欢迎访问一九零五行业门户网

nginx教程

nginx与lua
火云邪神语录:天下武功,无坚不破,唯快不破!nginx的看家本领就是速度,lua的拿手好戏亦是速度,这两者的结合在速度上无疑有基因上的优势。
最先将nginx,lua组合到一起的是openresty,它有一个ngx_lua模块,将lua嵌入到了nginx里面;随后tengine也包含了ngx_lua模块。至于二者的区别:openresty是nginx的bundle;而tengine则是nginx的fork。值得一提的是,openresty和tengine均是国人自己创建的项目,前者主要由春哥和晓哲开发,后者主要由淘宝打理。
至于openresty和tengine孰优孰劣,留给大家自己判断,如下资料可供参考:
ngx_openresty: an nginx ecosystem glued by lua淘宝网nginx应用、定制与开发实战推荐看看春哥在tech-club上关于『由lua粘合的nginx生态环境』的演讲实录,有料!
安装
需要最新版的nginx,luajit,ngx_devel_kit,ngx_lua等安装文件。
安装lua或者luajit都是可以的,但是出于效率的考虑,推荐安装luajit。
shell> wget http://luajit.org/download/luajit-.tar.gzshell> tar zxvf luajit-.tar.gzshell> cd luajit-shell> makeshell> make install因为安装在缺省路径,所以luajit对应的lib,include均在/usr/local目录里。
shell> export luajit_lib=/usr/local/libshell> export luajit_inc=/usr/local/include/luajit-下面就可以编译nginx了:
shell> wget http://nginx.org/download/nginx-.tar.gzshell> tar zxvf nginx-.tar.gzshell> cd nginx-shell> ./configure --add-module=/path/to/ngx_lua \ --add-module=/path/to/ngx_devel_kitshell> makeshell> make install试着启动一下nginx看看,如果你运气不好的话,可能会遇到如下错误:
cannot open shared object file: no such file or directory
这是神马情况?可以用ldd命令来看看:
shell> ldd /path/to/nginxlibluajit-.so => not found此类问题通常使用ldconfig命令就能解决:
shell> echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.confshell> 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: , 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);endinstance: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/locallua_include_dir = $(prefix)/include如果安装的是luajit的话,最好把头文件拷贝到相应目录:
cp /usr/local/include/luajit-/* /usr/local/include/…
我最近参与的一个项目,提供了一些用于web轮询的接口,都是用nginx+lua实现的,虽然总共只有十几台服务器,但是每天可以提供几十亿次的请求量,贼拉拉的强。
最后,让我引用某位屌丝的语录做结束语吧:lua,未婚男性程序员的最爱。
此条目由老王发表在technical分类目录,并贴了lua、nginx标签。将固定链接加入收藏夹。《nginx与lua》上有29条评论
以上就介绍了nginx教程,包括了方面的内容,希望对php教程有兴趣的朋友有所帮助。
其它类似信息

推荐信息