Nginx配置Lua模塊
前言
Nginx與Lua編寫腳本的基本構(gòu)建塊是指令。指令用于指定何時運行用戶Lua代碼以及如何使用結(jié)果。下面是顯示指令執(zhí)行順序的圖。
原理:
ngx_lua將Lua嵌入Nginx,可以讓Nginx執(zhí)行Lua腳本,并且高并發(fā)、非阻塞的處理各種請求。Lua內(nèi)建協(xié)程,這樣就可以很好的將異步回調(diào)轉(zhuǎn)換成順序調(diào)用的形式。
ngx_lua在Lua中進行的IO操作都會委托給Nginx的事件模型,從而實現(xiàn)非阻塞調(diào)用。開發(fā)者可以采用串行的方式編寫程序,ngx_lua會自動的在進行阻塞的IO操作時中斷,保存上下文;然后將IO操作委托給Nginx事件處理機制,在IO操作完成后,ngx_lua會恢復上下文,程序繼續(xù)執(zhí)行,這些操作都是對用戶程序透明的。
每個NginxWorker進程持有一個Lua解釋器或者LuaJIT實例,被這個Worker處理的所有請求共享這個實例。每個請求的Context會被Lua輕量級的協(xié)程分割,從而保證各個請求是獨立的。
ngx_lua采用“one-coroutine-per-request”的處理模型,對于每個用戶請求,ngx_lua會喚醒一個協(xié)程用于執(zhí)行用戶代碼處理請求,當請求處理完成這個協(xié)程會被銷毀。每個協(xié)程都有一個獨立的全局環(huán)境(變量空間),繼承于全局共享的、只讀的“comman data”。
所以,被用戶代碼注入全局空間的任何變量都不會影響其他請求的處理,并且這些變量在請求處理完成后會被釋放,這樣就保證所有的用戶代碼都運行在一個“sandbox”(沙箱),這個沙箱與請求具有相同的生命周期。
得益于Lua協(xié)程的支持,ngx_lua在處理10000個并發(fā)請求時只需要很少的內(nèi)存。根據(jù)測試,ngx_lua處理每個請求只需要2KB的內(nèi)存,如果使用LuaJIT則會更少。所以ngx_lua非常適合用于實現(xiàn)可擴展的、高并發(fā)的服務。
1. 安裝解壓lua
#安裝至/usr/local
wget http://luajit.org/download/LuaJIT-2.0.5.tar.gztar -zxvf LuaJIT-2.0.5.tar.gz

2.進入該目錄執(zhí)行安裝命令
cd LuaJIT-2.0.5make && make install PREFIX=/usr/local/LuaJIT

3. /etc/profile 文件中加入環(huán)境變量
#vi /etc/profile 在最后面加入下面兩行配置
export LUAJIT_LIB=/usr/local/LuaJIT/libexport LUAJIT_INC=/usr/local/LuaJIT
#保存執(zhí)行命令
source /etc/profile#路徑是上面luajit實際安裝路徑,路徑錯誤安裝nginx的lua模塊時會報錯找不到luajit庫
# source /etc/profile 立刻生效,如果ngixn安裝的時候不生效需要重啟服務

4.下載ngx_devel_kit模塊
wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gztar -zxvf v0.3.0.tar.gz
#NDK(nginx development kit)模塊是一個拓展nginx服務器核心功能的模塊,第三方模塊開發(fā)
#可以基于它來快速實現(xiàn)。 NDK提供函數(shù)和宏處理一些基本任務,減輕第三方模塊開發(fā)的代碼
#量。

5.下載lua-nginx-module模塊
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gztar -zxvf v0.10.9rc7.tar.gz
#lua-nginx-module 模塊使nginx中能直接運行lua

6.再次編譯nginx
#增加這兩個模塊
--add-module=/usr/local/LuaJIT-2.0.5/lua-nginx-module-0.10.9rc7--add-module=/usr/local/LuaJIT-2.0.5/ngx_devel_kit-0.3.0
通過nginx -V查看之前安裝的信息

切換到nginx安裝目錄下執(zhí)行編譯添加需要安裝的模塊
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --add-module=/usr/local/LuaJIT-2.0.5/lua-nginx-module-0.10.9rc7 --add-module=/usr/local/LuaJIT-2.0.5/ngx_devel_kit-0.3.0 --with-stream 
如果執(zhí)行出現(xiàn)以下錯誤

解決辦法:
yum install lua-devel
執(zhí)行make && make install安裝
make && make install
7.安裝完成后再次執(zhí)行查看是否安裝成功
nginx -V如果出現(xiàn)以下錯誤:

一般是由于編譯時沒有生成動態(tài)鏈接庫,只能手動鏈接
#查找安裝的libluajit-5.1.so.2
find / -name libluajit-5.1.so.2
cat /etc/ld.so.conf#""里面的路徑即時上圖動態(tài)鏈接庫的路徑echo "/usr/local/LuaJIT/lib" >> /etc/ld.so.confldconfig

如果沒有出錯,則如下

8. nginx配置文件進行l(wèi)ua的實際使用配置
在對應攔截請求處,新增驗證
access_by_lua_block {local argToken = ngx.var.arg_token;local headerToken = ngx.var.http_token;--先驗證請求參數(shù)中是否含有tokenif argToken ~= nil thenif argToken ~= "eyJ0eXAiOicYMJFOlA3qpn0vXjXJD0XWDQ" thenngx.status = ngx.HTTP_FORBIDDENngx.say("Token失效")ngx.exit(ngx.HTTP_FORBIDDEN)end--如果參數(shù)中沒有,驗證請求頭里面是否含有elseif headerToken ~= nil thenif headerToken ~= "eyJ0eXAiOicYMJFOlA3qpn0vXjXJD0XWDQ" thenngx.status = ngx.HTTP_FORBIDDENngx.say("Token失效")ngx.exit(ngx.HTTP_FORBIDDEN)endelseprint("都沒有");ngx.status = ngx.HTTP_FORBIDDENngx.say("Token不能為空")ngx.exit(ngx.HTTP_FORBIDDEN)end}

重啟nginx使得配置文件生效,再去訪問頁面

就會發(fā)現(xiàn)如果不攜帶token訪問頁面是訪問不了的
攜帶token才可訪問

