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試試。

相關文章
相關標籤/搜索