本文主要介紹在原有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試試。