Nginx 使用Lua指令碼
安裝 lua
wget http:
//luajit
.org
/download/LuaJIT-2
.0.5.
tar
.gz
tar
-zxvf LuaJIT-2.0.5.
tar
.gz
cd
LuaJIT-2.0.5
make
&&
make
install
PREFIX=
/usr/local/LuaJIT
etc/profile 加入並使之生效
# lua
export
LUAJIT_LIB=
/usr/local/LuaJIT/lib
export
LUAJIT_INC=
/usr/local/LuaJIT/include/luajit-2
.0
執行
#source etc/profile
下載 ngx_devel_kit 模組
wget https:
//github
.com
/simpl/ngx_devel_kit/archive/v0
.3.0.
tar
.gz
NDK (nginx development kit) 模組是一個拓展 nginx 伺服器核心功能的模組,第三方模組開發可以基於它來快速實現。 NDK 提供函式和巨集處理一些基本任務, 減輕第三方模組開發的程式碼量
下載 lua-nginx-module 模組
wget https:
//github
.com
/openresty/lua-nginx-module/archive/v0
.10.9rc7.
tar
.gz
lua-nginx-module 模組使 nginx 中能直接執行 lua
檢視原始編譯
/opt/nginx/sbin/nginx -V
如:
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_sub_module --with-http_v2_module
進入 nginx 原始目錄:
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_sub_module --with-http_v2_module --add-module=/root/lua-nginx-module-0.10.9rc7/ --add-module=/root/ngx_devel_kit-0.3.0
只 make,不執行 make install。
編譯報錯應該就是 lua 環境變數不對。
nginx -V 命令報錯
./nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory
解決:
echo "/usr/local/LuaJIT/lib" >> /etc/ld.so.conf
ldconfig
成功之後可以 nginx -V 檢視,無報錯即可。
把原來的 nginx 備份為 nginx_old
cp objs/nginx 到原來的 nginx 並覆蓋。
在編譯目錄執行 (在nginx是啟動狀態)
make
upgrade
Nginx 新增 lua 模組
測試:
server{
...
location
/lua
{
default_type
'text/html'
;
content_by_lua '
ngx.say(
"hello, lua!"
)
';
}
...
}
瀏覽器開啟:
http://blog.13sai.com/lua
可以看到 hello, lua!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援指令碼之家。
一些配置資訊
lua常用系統變數
方法 | 型別 | 說明 |
---|---|---|
ngx.var | 請求 | 如果要賦值如 ngx.var.b = 2,此變數必須提前宣告;另外對於 nginx location 中使用 正則捕獲的捕獲組可以使用 ngx.var [捕獲組數字]獲取; |
ngx.req.get_headers | 請求 | 獲取請求頭,預設只獲取前100,如果想要獲取所以可以呼叫ngx.req.get_header s(0);獲取帶中劃線的請求頭時請使用如 headers.user_agent 這種方式;如果一個請求頭有多個值,則返回的 是 table; |
ngx.req.get_uri_args | 請求 | 獲取 url 請求引數,其用法和 get_headers 類似; |
ngx.req.get_post_args | 請求 | 獲取 post 請求內容體,其用法和 get_headers 類似,但是必須提前呼叫 ngx.req.r ead_body() 來讀取 body 體(也可以選擇在 nginx 配置檔案使用lua_need_request_body on;開啟讀取 bod y 體,但是官方不推薦); |
ngx.req.raw_header | 請求 | 未解析的請求頭字串; |
ngx.req.get_body_data | 請求 | 為解析的請求 body 體內容字串。 |
ngx.req.get_method | 請求 | 獲取請求的大寫字母形式的請求方式 |
ngx.header | 響應 | 通過ngx.header.header_name的形式獲取或設定響應頭資訊。 |
ngx.exit | 響應 | 以某個狀態碼返回響應內容 |
ngx.redirect | 響應 | 重定向當前請求到新的 url |
ngx.log | 其他 | 輸出到log日誌 |
ngx.re.match | 其他 | 正則匹配 |
ngx.md5 | 其他 | md5編碼 |
ngx.encode_base64 | 其他 | base64解碼 |
ngx.decode_base64 | 其他 | base64編碼 |
模組指令
每個模組都有*_lua
(指令)、*_lua_block
(程式碼塊)、*_lua_file
(指令碼檔案)
指令 | 所在階段 | 使用範圍 | 說明 |
---|---|---|---|
init_by_lua | 載入配置檔案 | http | 可以用於初始化全域性配置 |
set_by_lua | rewrite | server location location if | 複雜邏輯的變數賦值,注意是阻塞的 |
rewrite_by_lua | rewrite | http server location location if | 實現複雜邏輯的轉發或重定向 |
content_by_lua | content | location location if | 處理請求並輸出響應 |
header_filter_by_lua | 響應頭資訊過濾 | http server location location if | 設定響應頭資訊 |
body_filter_by_lua | 輸出過濾 | http server location location if | 對輸出進行過濾或修改 |