1. 簡介 lua nginx module(ngx_lua module)把 Lua5.1 的解釋器 或 LuaJIT 2.0/2.1 的解釋器嵌入到 nginx 中,將強大的 Lua 線程(Lua threads)與 nginx 事務模型(Nginx event model)相結合,我們可以 ...
1. 簡介
lua-nginx-module(ngx_lua module)把 Lua5.1 的解釋器 或 LuaJIT 2.0/2.1 的解釋器嵌入到 nginx 中,將強大的 Lua 線程(Lua threads)與 nginx 事務模型(Nginx event model)相結合,我們可以更輕易的改變 子請求(subrequests)的處理過程。
與 Apache's mod_lua 和 Lighttpd's mod_magnet 不同,通過此模塊執行的 Lua 代碼是非阻塞的,同時此模塊提供的 Nginx API for Lua 可以處理上游服務,比如 MySQL, PostgreSQL, Memcached, Redis, upstream HTTP web services。
ngx_lua 可以與下麵的 Lua 庫、nginx 模塊結合:
- lua-resty-memcached
- lua-resty-mysql
- lua-resty-redis
- lua-resty-dns
- lua-resty-upload
- lua-resty-websocket
- lua-resty-lock
- lua-resty-logger-socket
- lua-resty-lrucache
- lua-resty-string
- ngx_memc
- ngx_postgres
- ngx_redis2
- ngx_redis
- ngx_proxy
- ngx_fastcgi
通過 ngx.location.capture 或 ngx.location.capture_multi 的方式, ngx_lua 可以使用幾乎所有的 nginx 模塊。推薦使用 lua-resty-*庫的方式訪問 nginx 的上游模塊,而不是創建子請求的方式,使用前者會更靈活、更有效的使用記憶體。
在 nginx 的一個 worker 里,所有請求共用一個Lua 解釋器或 LuaJIT 實例,即一個 nginx worker,一個 Lua 解釋器或 LuaJIT 實例。每個請求的上下文(context)是通過輕量級的 Lua 協程(coroutines)相互隔離的。
載入的 Lua 模塊駐留在 nginx worker 進程級別,這樣在負載很高的情況下,Lua 本身只是用了很低的記憶體。
由於此模塊是 nginx “http” 系統的插件,所以只能以 HTTP 協議族的方式(HTTP 0.9/1.0/1.1/2.0,WebSocket)與下游通信。如果想使用 TCP 通信,可以使用與 Lua API 相容的 ngx_stream_lua
2. 使用場景
- 使用 Lua 處理或混合 nginx 上游的各種輸出;
- 在請求到達 nginx 上游之前,使用 Lua 進行複雜的訪問控制,安全檢查;
- 使用 Lua 操作請求的響應頭;
- 從外部存儲(redis、memcached、mysql...)獲取信息來動態決定訪問哪一個上游;
- 以非阻塞的方式從存儲中獲取信息生成複雜的Web 應用內容
- 使用Lua 在 重定向階段(rewrite phase)進行複雜的 URL 路由
- 使用 Lua 實現 nginx 子請求或 location 模塊的高級緩存機制;
- ...
ngx_lua 即提供了腳本的靈活性,又有與 C 語言可比肩的性能(CPU ,記憶體)——需要啟用 LuaJIT2.x。
3. 與 nginx 的相容性
ngx_lua 模塊的最新版本相容以下的 nginx:
- 1.11.x (last tested: 1.11.2)
- 1.10.x
- 1.9.x (last tested: 1.9.15)
- 1.8.x
- 1.7.x (last tested: 1.7.10)
- 1.6.x
4. 安裝
推薦使用 OpenResty releases 的發行版(整合了 nginx,ngx_lua ,LuaJIT 2.1 還有其他強大的 nginx 模塊 和 Lua 庫)
4.1 Ubuntu 安裝 Openresty 的發行版
在 Ubuntu系統中添加 Openresty 的 APT 倉庫,以便於安裝或更新
# 導入 Openresty 的 GPG 密鑰:
wget -qO - https://openresty.org/package/pubkey.gpg | sudo apt-key add -
# 安裝 add-apt-repository 命令
# (之後可以刪除這個包以及對應的關聯包)
sudo apt-get -y install software-properties-common
# 添加官方 official APT 倉庫:
sudo add-apt-repository -y "deb http://openresty.org/package/ubuntu $(lsb_release -sc) main"
# 更新 APT 索引:
sudo apt-get update
# 安裝
sudo apt-get install openresty
#這個包同時也推薦安裝 openresty-opm 和 openresty-restydoc 包,所以後面兩個包會預設安裝上。 如果不想自動關聯安裝,可以用下麵方法關閉自動關聯安裝:
#sudo apt-get install --no-install-recommends openresty
4.2 Debian Jessie 及以上
與 Ubuntu相似,註意不同點 :
# 導入 GPG 密鑰:
wget -qO - https://openresty.org/package/pubkey.gpg | sudo apt-key add -
# 安裝 add-apt-repository 命令
# (之後你可以刪除這個包以及對應的關聯包)
sudo apt-get -y install software-properties-common
# 添加我們官方 official APT 倉庫: (與 Ubuntu 不同)
sudo add-apt-repository -y "deb http://openresty.org/package/debian $(lsb_release -sc) openresty"
# 更新 APT 索引:
sudo apt-get update
# 然後就可以像下麵這樣安裝軟體包,比如 openresty:
sudo apt-get install openresty
# 這個包同時也推薦安裝 openresty-opm 和 openresty-restydoc 包,所以後面兩個包會預設安裝上。 如果你不想自動關聯安裝,可以用下麵方法關閉自動關聯安裝:
sudo apt-get install --no-install-recommends openresty
4.3 Debian Wheezy
# 導入 GPG 密鑰:
wget -qO - https://openresty.org/package/pubkey.gpg | sudo apt-key add -
# 安裝 add-apt-repository 命令:(與其他版本不同)
# (之後你可以刪除這個包以及對應的關聯包)
sudo apt-get -y install python-software-properties
# 打開 wheezy-backports 倉庫:
sudo add-apt-repository -y "deb http://ftp.debian.org/debian wheezy-backports main"
# 添加官方 APT 倉庫
sudo add-apt-repository -y "deb http://openresty.org/package/debian $(lsb_release -sc) openresty"
# 更新 APT 索引:
sudo apt-get update
# 然後就可以像下麵這樣安裝包了,比如裝 openresty:
sudo apt-get install openresty
# 這個包同時也推薦安裝 openresty-opm 和 openresty-restydoc 包,所以後面兩個包會預設安裝上。 如果你不想自動關聯安裝,可以用下麵方法關閉自動關聯安裝:
sudo apt-get install --no-install-recommends openresty
4.4 Centos
# 下麵的命令就可以添加倉庫:
sudo yum install yum-utils
sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
# 然後就可以像下麵這樣安裝軟體包,比如 openresty:
sudo yum install openresty
# 如果你想安裝命令行工具 resty,那麼可以像下麵這樣安裝 openresty-resty 包:
sudo yum install openresty-resty
# 命令行工具 opm 在 openresty-opm 包里,而 restydoc 工具在 openresty-doc 包裡頭。
# 列出所有 openresty 倉庫裡頭的軟體包:
sudo yum --disablerepo="*" --enablerepo="openresty" list available