Nginx与Lua

今天安装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等安装文件。

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

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

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

摘自:http://huoding.com/2012/08/31/156

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

时间: 2024-08-04 06:36:39

Nginx与Lua的相关文章

nginx与Lua执行顺序

Nginx顺序 Nginx 处理每一个用户请求时,都是按照若干个不同阶段(phase)依次处理的,而不是根据配置文件上的顺序. Nginx 处理请求的过程一共划分为 11 个阶段,按照执行顺序依次是 post-read.server-rewrite.find-config.rewrite.post-rewrite. preaccess.access.post-access.try-files.content.log. post-read: 读取请求内容阶段 Nginx读取并解析完请求头之后就立即

[nginx] 由Lua 粘合的Nginx生态环境-- agentzh tech-club.org

[nginx] 由Lua 粘合的Nginx生态环境-- agentzh tech-club.org 演讲听录 [复制链接] kindle LT管理团队 Rank: 9Rank: 9Rank: 9 未绑定新浪微博 签到222 注册时间1970-1-1最后登录2015-6-5在线时间168 小时阅读权限200积分19025帖子119主题35精华2UID9223 LT总司令 LT元老 LT教授 串个门加好友打招呼发消息 电梯直达跳转到指定楼层 1# 发表于 2013-1-12 12:43:47 |只看

nginx中lua脚本输出

在nginx中嵌入lua模块,能够使得nginx服务端的开发大大地方便,尤其是在实现一些额外的统计等小功能的时候.在nginx模块中直接lua嵌入脚本文件,可以直接使用nginx中lua模块的一些函数直接返回数据.可以调用的函数如下:ngx.say(),ngx.print(),return ,ngx.exit()等等,下面介绍一下这些函数的区别: (1)ngx.say()函数是返回该函数的参数加换行的数据,例如ngx.say("hello"),则返回数据hello/r/n, (2)ng

LAMP架构演进到LAMPGC,再演进到LNMLGC(linux+nginx+mysql+lua+gearman+C)

LAMP是一个大众的架构了,linux+apache+mysql+php 在我们系统的架构中,做了进一步的演进,linux+apahce+mysql+php+gearman+C php作页面的展示 核心业务逻辑由C语言实现,php通过gearman中间件调用C任务 由于apache在高并发方面不太给力,因此在需要高并发的场景中,我们进一步演进,linux+nginx+mysql+php+lua+gearman+C 页面部分由nginx+fastcgi+php-fpm来展示 高并发的业务调用由ng

动态扩展Nginx支持Lua功能

一.Lua说明: Lua 是一个简洁.轻量.可扩展的脚本语言,也是号称性能最高的脚本语言,用在很多需要性能的地方,比如:游戏脚本,nginx,wireshark的脚本,当你把他的源码下下来编译后,你会发现解释器居然不到200k,非常变态.很多应用程序使用Lua作为自己的嵌入式脚本语言,以此来实现可配置性.可扩展性. 二.实验环境: 192.168.1.194服务器(centos 6.5 final版本) nginx版本:nginx-1.6.1 三.安装配置: 这里假定已经安装好了nginx(安装

nginx 与 lua 开发环境搭建

首先下载最新版的 相关软件 的安装文件. nginx: http://nginx.org/en/download.html LuaJIT: http://luajit.org/download.html lua-nginx-module: https://github.com/openresty/lua-nginx-module/releases/tag/v0.9.16 ngx_devel_kit: https://github.com/simpl/ngx_devel_kit/releases/

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 http://luajit.org/download/LuaJIT-2.0.4.tar.gz tar xzvf LuaJIT-2.0.4.tar.gz cd LuaJIT-2.0.4 make install PREFIX=/usr/local/luajit #注意环境变量! export LUAJ

openresty(nginx)、lua、drizzle调研

一.概述: 1.研究目标:nginx中使用lua脚本,及nginx直接访问mysql,redis 2.需要安装的内容: openresty,mysql,redis 3.OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项.http://openresty.org/cn/index.html     二.安装说明   0.环境准备 $yum install -y gcc gcc

Nginx利用lua剪辑FastDFS图片

Nginx利用lua剪辑FastDFS中的图片 我们经常用FastDFS来做图片服务器,通过nginx来上传或者获取图片.本文要实现的功能是,当客户点要获取不同尺寸的图片是,lua根据url中的尺寸大小调用GraphicsMagick 的gm命令来剪辑图片. 1.软件准备: GraphicsMagick-1.3.21.tar.gz LuaJIT-2.0.2.tar.gz nginx-1.4.2.tar.gz ngx_devel_kit-0.2.18.tar.gz v0.8.6.tar.gz(lu

nginx与lua的组合

火云邪神语录:天下武功,无坚不破,唯快不破!Nginx的看家本领就是速度,Lua的拿手好戏亦是速度,这两者的结合在速度上无疑有基因上的优势. 最先将Nginx,Lua组合到一起的是OpenResty,它有一个ngx_lua模块,将Lua嵌入到了Nginx里面:随后Tengine也包含了ngx_lua模块.至于二者的区别:OpenResty是Nginx的Bundle:而Tengine则是Nginx的Fork.值得一提的是,OpenResty和Tengine均是国人自己创建的项目,前者主要由春哥和晓