本文主要介绍在原有nginx基础上安装Lua模块(lua-nginx-module),及安装OpenResty其余组件(以限流模块 lua-resty-limit-traffic 为例)的详细操做,并在此基础上介绍第三方Lua lib(以cjson为例)的安装方法。如读者须要全新安装nginx,可考虑使用OpenResty的组合安装包一次性完成安装,详见:http://openresty.org/cn/installation.html。php
一、首先须要一个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提供了不少好用的组件,能够在其官网页面找到: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”(没有报错)即为成功。
本教程以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"}”即为成功。
文件系统相关:
工具方法相关:
socket、http相关:
json相关:
另外,LuaRocks上面有更多lua库介绍:https://luarocks.org/ 若是学会了,读者不妨本身安装一个luasocket试试。