博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nginx与Lua
阅读量:6455 次
发布时间:2019-06-23

本文共 3289 字,大约阅读时间需要 10 分钟。

今天安装lua试试,这个从开始装的,发现一篇文字,字数虽少,但是却讲的很清楚。如下:

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

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

推荐看看春哥在上关于『』的演讲实录,有料!

安装

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

安装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常用的阶段按先后顺序有:rewrite阶段,access阶段,content阶段等等。演示代码中的set指令属于rewrite阶段,content_by_lua指令属于content阶段,如果试着把两条指令的顺序交换一下,会发现程序依然能够正常运行。

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

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

{    "host": "
", "port": "
"}

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

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,用到了模块:

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,如果是生产环境,应该开启它。

我最近参与的一个项目,提供了一些用于Web轮询的接口,都是用Nginx+Lua实现的,虽然总共只有十几台服务器,但是每天可以提供几十亿次的请求量,贼拉拉的强。

最后,让我引用某位屌丝的语录做结束语吧:Lua,未婚男性程序员的最爱。

摘自:

另外也可以直接安装 ngx_OpenResty  地址  其实他就是nginx,里面还有很多有用的Nginx模块,还有很多有用Lua库的软件集合。这个需要提前装下依赖库。具体安装方式很简单,上面地址上也有。

 

本文转自茄子_2008博客园博客,原文链接:http://www.cnblogs.com/xd502djj/archive/2012/11/20/2779598.html,如需转载请自行联系原作者。

你可能感兴趣的文章
编写自己的代码库(javascript常用实例的实现与封装)
查看>>
大道至简之产品设计
查看>>
如果有多项紧急任务同时给你,你会如何处理? ― Top 10 行为面试题解析
查看>>
BATJ都爱问的多线程面试题
查看>>
Hybrid App技术解析 -- 实战篇
查看>>
Android绘图最终篇之大战贝塞尔三次曲线
查看>>
线性代数与数据学习:MIT教授Gilbert Strang帮你打下坚实的数学基础
查看>>
从一个骗局谈生活中的基础算法
查看>>
前端存贮全家桶--cookie、sessionStorage、localStorage、和indexedDB重点合集
查看>>
互联网"凛冬",看大厂HR怎么说~
查看>>
学习new和instanceof知识小结
查看>>
面试必备:LinkedHashMap源码解析(JDK8)
查看>>
【深度学习之美】第一篇:Understanding LSTM Networks
查看>>
快速理解 设计模式六大原则
查看>>
Spring Cloud 微服务实战详细笔记
查看>>
Java面试通关要点汇总集答案(六)——JDBC 流程 MVC 设计思想
查看>>
Web核心-Servlet
查看>>
ElasticSearch 远程代码执行漏洞分析(CVE-2015-1427)&高级利用方法
查看>>
URL重定向/跳转漏洞
查看>>
Android进程启动与Activity显示
查看>>