ngx_lua_module 是一个nginx http模块,它把 lua 解析器内嵌到 nginx,用来解析并执行lua 语言编写的网页后台脚本。
特性:
所需要的模块如下:
LuaJIT-2.0.2.tar.gzngx_devel_kit(v0.2.18.tar.gz)
JIT
通常,程序有两种运行方式:静态编译与动态直译。
静态编译的程序在执行前全部被翻译为机器码,而动态直译执行的则是一句一句边运行边翻译。
即时编译(Just-In-Time Compiler)则混合了这二者,一句一句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。
JAVA、.NET 实现都使用即时编译以提供高速的代码执行。
注意:
在nginx.conf中添加”lua_code_cache on/off”,来开启是否将代码缓存,所以每次变更”*.lua”文件时,必须reload nginx才可生效。仅针对”set_by_lua_file, content_by_lua_file, rewrite_by_lua_file, and access_by_lua_file”有效, 因为其他为写在配置文件中,更改代码也必须reload nginx。在生产环境下,不能禁用cache。同时在lua代码中使用”dofile” 或 “loadfie” 来加载外部lua脚本将不会对它进行缓存,应该使用”require”来代替。禁用cache,当且仅当在调式代码下。
LuaJIT
是一个利用JIT编译技术把Lua脚本直接编译成机器码由CPU运行
版本:2.0 与 2.1
当前稳定版本为 2.0。
2.1为版本与ngx_lua将有较大性能提升,主要是CloudFlare公司对luajit的捐赠。
FFI库,是LuaJIT中最重要的一个扩展库。
1. 它允许从纯Lua代码调用外部C函数,使用C数据结构;
2. 就不用再像Lua标准math库一样,编写Lua扩展库;
3. 把开发者从开发Lua扩展C库(语言/功能绑定库)的繁重工作中释放出来;
wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz tar -xzvf LuaJIT-2.0.2.tar.gz cd LuaJIT-2.0.2 make && make install
-- luajit --
# tell nginx's build system where to find LuaJIT: export LUAJIT_LIB=/usr/local/lib export LUAJIT_INC=/usr/local/include/luajit-2.0-- lua --
# or tell where to find Lua if using Lua instead: export LUA_LIB=/path/to/lua/lib export LUA_INC=/path/to/lua/include
cd /data0/source_code wget https://github.com/chaoslawful/lua-nginx-module/archive/v0.8.6.tar.gz tar -zxvf v0.8.6.tar.gz
<span style="font-family: Arial, Helvetica, sans-serif;">wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.33/pcre-8.33.tar.gz</span>
tar -zxvf pcre-8.33.tar.gz cd pcre-8.33 ./configure make && make install
下载echo-nginx-module,解压
wget https://github.com/openresty/echo-nginx-module/archive/v0.57.tar.gz tar -zxvf v0.57.tar.gz
wget -c https://github.com/simpl/ngx_devel_kit/archive/v0.2.18.tar.gz tar -zxvf v0.2.18.tar.gz
wget http://nginx.org/download/nginx-1.4.2.tar.gz cd nginx-1.4.2 ./configure --user=www --group=www --prefix=/data0/nginx-1.4.2 \ --add-module=/data0/source_code/ngx_devel_kit-0.2.18 \ --add-module=/data0/source_code/echo-nginx-module-0.57 \ --add-module=/data0/source_code/lua-nginx-module-0.8.6 \ --with-http_stub_status_module \ --with-pcre=/data0/source_code/pcre-8.33/
+ using system zlib library
make -j2 make install ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2
启动nginx:
/data0/nginx/sbin/nginx -c /data0/nginx/conf/nginx.conf
启动nginx时遇到的问题:报错nginx: [emerg] getpwnam(“www”) failed 错误:
nginx: [emerg] getpwnam(“www”) failed/usr/sbin/groupadd -f www /usr/sbin/useradd -g www www
curl 'http://localhost/hello',
出现:hello,lua 证明OK了
(1)在Nginx根目录下,新建lua文件夹,并创建test_lua.lua脚本,脚本内容如下:
ngx.say("hello, lua")
lua_package_path "/data0/nginx-1.4.2/lua/?.lua;;"; (注意引号里面有两个分号)
为了使得 lua 脚本的修改能及时生效,需要在nginx配置文件的server block里面加入一行代码:
lua_code_cache off; #如果没有加入这一行,或者设置为on的话,则需要重启nginx
注意修改完配置文件需要重新加载一下才回生效:/data0/nginx-1.4.2/sbin/nginx -s reload
1、如何给一个已经装好的nginx再装其他模块?
例如如果之前我没有装echo-nginx-module这个模块,现在我想装上怎么办呢?下载下来这个模块的tar.gz包,解压,到nginx安装包所在目录,重新解压nginx安装包(原来原来已经有解压的文件夹,删除),然后切到解压后的nginx目录,注意这里需要将之前已经编译的模块重新加入再编译,再执行make,最后将编译后生成的新的nginx文件覆盖原来的nginx文件即可。具体说明:
nginx文件非常小但是性能非常的高效,这方面完胜apache,nginx文件小的一个原因之一是nginx自带的功能相对较少,好在nginx允许第三方模块,第三方模块使得nginx越发的强大. 在安装模块方面,nginx显得没有apache安装模块方便,当然也没有php安装扩展方便.在原生的nginx,他不可以动态加载模块,所以当你安装第三方模块的时候需要覆盖nginx文件.接下来看看如何安装nginx第三模块吧.
nginx第三方模块安装方法:
./configure --prefix=/你的安装目录 --add-module=/第三方模块目录
在未安装nginx的情况下安装nginx第三方模块
./configure --prefix=/usr/local/nginx-1.4.1 \ --with-http_stub_status_module \ --with-http_ssl_module --with-http_realip_module \ --with-http_image_filter_module \ --add-module=../ngx_pagespeed-master --add-module=/第三方模块目录 make make install
./configure --prefix=/usr/local/nginx-1.4.1 \ --with-http_stub_status_module \ --with-http_ssl_module --with-http_realip_module \ --with-http_image_filter_module \ --add-module=../ngx_pagespeed-master make && make install
/usr/local/nginx-1.4.1/sbin/nginx -s stop cp objs/nginx /usr/local/nginx/sbin/nginx相比之下仅仅多了一步覆盖nginx文件.
总结,安装nginx安装第三方模块实际上是使用–add-module重新安装一次nginx,不要make install而是直接把编译目录下objs/nginx文件直接覆盖老的nginx文件.如果你需要安装多个nginx第三方模块,你只需要多指定几个相应的–add-module即可.
备注:重新编译的时候,记得一定要把以前编译过的模块一同加到configure参数里面.(如何查看原来装了哪些模块: nginx -V)
nginx提供了非常多的nginx第三方模块提供安装,地址http://wiki.nginx.org/3rdPartyModules
原因:在 Nginx 编译时,需要指定 RPATH,
解决方法,加入下面选项即可:
./configure --with-ld-opt="-Wl,-rpath,$LUAJIT_LIB"http://wiki.nginx.org/HttpLuaModule