nginx安装Lua模块

  本文主要介绍在原有nginx基础上安装Lua模块(lua-nginx-module),及安装OpenResty其余组件(以限流模块 lua-resty-limit-traffic 为例)的详细操做,并在此基础上介绍第三方Lua lib(以cjson为例)的安装方法。如读者须要全新安装nginx,可考虑使用OpenResty的组合安装包一次性完成安装,详见:http://openresty.org/cn/installation.htmlphp

1、在原有nginx基础上编译安装Lua模块

一、首先须要一个Lua的解析器,官方推荐使用LuaJIT,听说其性能在某种程度上能够达到和C程序差很少的速度。
  这里获取下载地址:http://luajit.org/download.html
  本例使用:LuaJIT-2.0.4
编译安装 LuaJIT:html

# Bash
cd /data
# 解压
tar -zxf LuaJIT-2.0.4.tar.gz
cd LuaJIT-2.0.4
# 查看Makefile源码得知,PREFIX能够指定安装目录,不指定会默认安装到/usr/local
make && make install PREFIX=/data/LuaJIT
# ls -l /data/LuaJIT

二、下载nginx模块ngx_devel_kit。
  这里获取下载地址:https://github.com/simpl/ngx_devel_kit/releases
  本例使用:ngx_devel_kit-0.2.19
解压 ngx_devel_kit:nginx

# Bash
cd /data
# 只须要解压便可
tar -zxf ngx_devel_kit-0.2.19.tar.gz
# ls -l /data/ngx_devel_kit-0.2.19

三、下载nginx模块lua-nginx-module。
  这里获取下载地址:https://github.com/openresty/lua-nginx-module/releases
  本例使用:lua-nginx-module-0.10.6
解压 lua-nginx-module:git

# Bash
cd /data
# 只须要解压便可
tar -zxf lua-nginx-module-0.10.6.tar.gz
# ls -l /data/lua-nginx-module-0.10.6

四、从新编译nginx,增长lua模块。
  本例nginx使用:nginx-1.10.2
  因为是在原有nginx上增长lua模块,所以首先须要知道nginx本来的编译参数,并在其基础上增长lua模块的编译参数(--with-ld-opt="-Wl,-rpath,/data/LuaJIT/lib" --add-module=/data/ngx_devel_kit-0.2.19 --add-module=/data/lua-nginx-module-0.10.6)。其中,/data/LuaJIT/lib 为LuaJIT安装目录下的lib目录,/data/ngx_devel_kit-0.2.19 为 ngx_devel_kit 的解压目录,/data/lua-nginx-module-0.10.6 为 lua-nginx-module 的解压目录。
获取nginx本来的编译参数:github

# Bash
cd /data/nginx/sbin
./nginx -V

本例nginx本来的编译参数以下:json

--prefix=/data/nginx

增长lua模块的编译参数后以下:bash

--prefix=/data/nginx \
  --with-ld-opt="-Wl,-rpath,/data/LuaJIT/lib" \
  --add-module=/data/ngx_devel_kit-0.2.19 \
  --add-module=/data/lua-nginx-module-0.10.6

开始编译nginx:socket

# Bash
# 进入nginx源码目录
cd /data/nginx-1.10.2
# LUAJIT_LIB和LUAJIT_INC变量用来告诉nginx你的LuaJIT安装到哪了
export LUAJIT_LIB=/data/LuaJIT/lib
export LUAJIT_INC=/data/LuaJIT/include/luajit-2.0
# 生成Makefile,加入编译参数
./configure --prefix=/data/nginx \
  --with-ld-opt="-Wl,-rpath,/data/LuaJIT/lib" \
  --add-module=/data/ngx_devel_kit-0.2.19 \
  --add-module=/data/lua-nginx-module-0.10.6
# 编译安装nginx
make && make install

  完成后,/data/nginx/sbin/nginx 便是新编译出来包含lua模块的nginx,/data/nginx/sbin/nginx.old 则是以前安装的nginx备份。
  至此,nginx lua模块安装完成。工具

五、测试。
在 /data/nginx/conf/nginx.conf 的server块里加入:性能

location /hello_world {
	default_type "text/plain";
	content_by_lua_block {
		ngx.say("hello world");
	}
}

重启nginx:

# Bash
cd /data/nginx/sbin
./nginx -t && ./nginx -s reload

  访问 http://127.0.0.1/hello_world 显示出“hello world”即为成功。

 

二,安装OpenResty的其余组件

  因为没有使用OpenResty提供的组合安装包,所以若是想使用OpenResty的组件还须要额外安装。
OpenResty提供了不少好用的组件,能够在其官网页面找到:https://openresty.org/cn/components.html
  本例以限流模块 lua-resty-limit-traffic 为例,介绍安装方法。
  这里获取下载地址:https://github.com/openresty/lua-resty-limit-traffic/releases
  本例使用:lua-resty-limit-traffic-0.01
解压 lua-resty-limit-traffic:

# Bash
cd /data
tar -zxf lua-resty-limit-traffic-0.01.tar.gz
cd lua-resty-limit-traffic-0.01

  查看Makefile源码得知,install指令是将lib目录下的全部文件拷贝到${LUA_LIB_DIR}目录下。lib目录下的文件为.lua后缀的lua源码,咱们知道lua源码须要放在package.path指定的路径下才能被加载到,所以咱们须要知道LuaJIT的package.path指定的路径都包含了哪些。
查看LuaJIT的package.path:

# Bash
/data/LuaJIT/bin/luajit -e "print(package.path)" | sed -n 's/;/;\n/gp'

笔者的package.path以下:

./?.lua;
/data/LuaJIT/share/luajit-2.0.4/?.lua;
/usr/local/share/lua/5.1/?.lua;
/usr/local/share/lua/5.1/?/init.lua;
/data/LuaJIT/share/lua/5.1/?.lua;
/data/LuaJIT/share/lua/5.1/?/init.lua

  读者根据自身环境的须要,选择合适的路径,本例使用/usr/local/share/lua/5.1做为公共库存放路径,所以 LUA_LIB_DIR=/usr/local/share/lua/5.1。
开始安装:

# Bash
make install LUA_LIB_DIR=/usr/local/share/lua/5.1

  至此,lua-resty-limit-traffic 组件安装完成。

测试:
在 /data/nginx/conf/nginx.conf 的server块里加入:

location /hello_world {
	default_type "text/plain";
	content_by_lua_block {
		local resty_limit_req = require("resty.limit.req");
		ngx.say("hello world");
	}
}

重启nginx:

# Bash
cd /data/nginx/sbin
./nginx -t && ./nginx -s reload

  访问 http://127.0.0.1/hello_world 显示出“hello world”(没有报错)即为成功。

 

3、安装第三方Lua lib(C库)

  本教程以cjson为例,介绍安装方法。
  这里获取下载地址:https://www.kyne.com.au/~mark/software/lua-cjson.php
  本例使用:lua-cjson-2.1.0
解压 lua-cjson:

# Bash
cd /data
tar -zxf lua-cjson-2.1.0.tar.gz
cd lua-cjson-2.1.0

  查看Makefile源码得知,install指令先编译 lua_cjson.o strbuf.o fpconv.o 3个目标文件,链接成一个cjson.so动态库,而后把动态库拷贝到${LUA_CMODULE_DIR}目录下,${LUA_CMODULE_DIR}默认为 /usr/local/lib/lua/5.1。咱们知道动态库须要放在package.cpath指定的路径下才能被加载到,所以咱们须要看一下LuaJIT的package.cpath指定的路径都包含了哪些。
查看LuaJIT的package.cpath:

# Bash
/data/LuaJIT/bin/luajit -e "print(package.cpath)" | sed -n 's/;/;\n/gp'

笔者的package.cpath以下:

./?.so;
/usr/local/lib/lua/5.1/?.so;
/data/LuaJIT/lib/lua/5.1/?.so;
/usr/local/lib/lua/5.1/loadall.so

OK,咱们尝试一下直接执行安装:

# Bash
# 若不指定LUA_CMODULE_DIR,默认即为/usr/local/lib/lua/5.1,笔者为读者清晰理解故明确指定
make install LUA_CMODULE_DIR=/usr/local/lib/lua/5.1

输出:

cc -c -O3 -Wall -pedantic -DNDEBUG  -I/usr/local/include -fpic -o lua_cjson.o lua_cjson.c
lua_cjson.c:43:17: error: lua.h: No such file or directory
lua_cjson.c:44:21: error: lauxlib.h: No such file or directory
...

  报错,错误提示咱们须要提供lua.h和lauxlib.h两个头文件,咱们能够从LuaJIT的安装目录下的include/luajit-2.0中找到它们,仔细观察Makefile,发现能够用${LUA_INCLUDE_DIR}来指定头文件位置。
再一次执行安装,指定头文件位置:

# Bash
make install LUA_CMODULE_DIR=/usr/local/lib/lua/5.1 LUA_INCLUDE_DIR=/data/LuaJIT/include/luajit-2.0

  编译成功,至此cjson安装完成。

测试:
在 /data/nginx/conf/nginx.conf 的server块里加入:

location /hello_world {
	default_type "text/plain";
	content_by_lua_block {
		local cjson = require("cjson");
		ngx.say(cjson.encode({hello="world"}));
	}
}

重启nginx:

# Bash
./nginx -t && ./nginx -s reload

  访问 http://127.0.0.1/hello_world 显示出“{"hello":"world"}”即为成功。

 

4、互联网中有不少很好用的lua开源库,笔者在这里介绍几个比较好用的:

文件系统相关:

工具方法相关:

socket、http相关:

json相关:

  另外,LuaRocks上面有更多lua库介绍:https://luarocks.org/   若是学会了,读者不妨本身安装一个luasocket试试。

相关文章
相关标签/搜索