同样是5年开发,年薪50万和年薪15万的差距在哪里….>>>
本文主要介绍在原有nginx基础上安装Lua模块(lua-nginx-module),及安装OpenResty其他组件(以限流模块 lua-resty-limit-traffic 为例)的详细操作,并在此基础上介绍第三方Lua lib(以cjson为例)的安装方法。如读者需要全新安装nginx,可考虑使用OpenResty的组合安装包一次性完成安装,详见:
http://openresty.org/cn/installation.html
。
一、在原有nginx基础上编译安装Lua模块
1、首先需要一个Lua的解析器,官方推荐使用LuaJIT,据说其性能在某种程度上可以达到和C程序差不多的速度。
这里获取下载地址:
http://luajit.org/download.html
本例使用:LuaJIT-2.0.4
编译安装 LuaJIT:
# 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
2、下载nginx模块ngx_devel_kit。
这里获取下载地址:
https://github.com/simpl/ngx_devel_kit/releases
本例使用:ngx_devel_kit-0.2.19
解压 ngx_devel_kit:
# Bash
cd /data
# 只需要解压即可
tar -zxf ngx_devel_kit-0.2.19.tar.gz
# ls -l /data/ngx_devel_kit-0.2.19
3、下载nginx模块lua-nginx-module。
这里获取下载地址:
https://github.com/openresty/lua-nginx-module/releases
本例使用:lua-nginx-module-0.10.6
解压 lua-nginx-module:
# Bash
cd /data
# 只需要解压即可
tar -zxf lua-nginx-module-0.10.6.tar.gz
# ls -l /data/lua-nginx-module-0.10.6
4、重新编译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原本的编译参数:
# Bash
cd /data/nginx/sbin
./nginx -V
本例nginx原本的编译参数如下:
--prefix=/data/nginx
增加lua模块的编译参数后如下:
--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:
# 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模块安装完成。
5、测试。
在 /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”(没有报错)即为成功。
三、安装第三方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"}”即为成功。
四、互联网中有很多很好用的lua开源库,笔者在这里介绍几个比较好用的:
文件系统相关:
LuaFileSystem:http://keplerproject.github.io/luafilesystem/index.html
工具方法相关:
Penlight(依赖LuaFileSystem):https://github.com/stevedonovan/Penlight
socket、http相关:
luasocket:https://github.com/diegonehab/luasocket
json相关:
cjson:https://www.kyne.com.au/~mark/software/lua-cjson.php
另外,LuaRocks上面有更多lua库介绍:https://luarocks.org/
如果学会了,读者不妨自己安装一个luasocket试试。