天天看點

nginx和lua

lua作為嵌入式腳本,在目前所有的腳本引擎中速度是最快的。它由标準C編寫而成,幾乎在所有作業系統和平台都可以編譯運作。

我們為什麼要用nginx+lua呢?

我們來比較下nginx+lua和nginx+php:

nginx+php之間是要有程序通信的,是以性能開銷很大;而lua是嵌在nginx程序内部的,它不需要有兩套程序獨立工作,是以從接口上就有決定性的優勢;再加上線程之間通訊的時候需要大量的反序列化和序列化的工作,讓後兩套程序帶來的額外情況是更多的程序和更多的切換開銷,是以nginx+lua性能要比nginx+php要好很多。

但是nginx+lua也有劣勢,那就是nginx+lua的周邊子產品相當不健全,如果對并發性能的要求并不是很高時,php比較适合。

我們應用nginx+lua的目的就是通過lua來開發基于nginx的業務邏輯,因為我們需要的是高并發,它作為接口層比較适合。

環境搭建:

1.安裝luajit

luajit是一個利用jit編譯把lua腳本直接編譯成機器碼由cpu運作

wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
tar -zxvf LuaJIT-2.0.4.tar.gz
cd LuaJIT-2.0.4
make install PREFIX=/usr/local/luajit
           

添加環境變量:

export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0
           

加載類庫

echo "/usr/local/luajit/lib" > /etc/ld.so.conf.d/usr_local_luajit_lib.conf
ldconfig
           

否則,在營運nginx時會出現以下錯誤:

[root@ nginx]# ./nginx -V
./nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory
           

2.安裝ngx_devel_kit和lua-nginx-module

nginx_devel_kit子產品是一個拓展nginx伺服器核心功能的子產品,提供函數和宏處理一些基本任務,減輕第三方子產品開發的代碼量。

lua-nginx-module子產品将lua語言嵌入到nginx配置中,使用亂增強了nginx的能力。

#下載下傳ngx_devel_kit和lua-nginx-module
wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz
wget https://github.com/openresty/lua-nginx-module/archive/v0.9.16rc1.tar.gz
tar -zxvf v0.2.19.tar.gz
tar -zxvf v0.9.16rc1.tar.gz
#編譯安裝nginx
cd /usr/local/nginx
./configure  --prefix=/usr/local/nginx  --add-module=/usr/local/src/lua/lua-nginx-module-0.9.16rc1 --add-module=/usr/local/src/lua/ngx_devel_kit-0.2.19
make
make install
           

3.測試

在nginx配置檔案中加入以下:

location /test {
                content_by_lua '
                        
                        if jit then
                                ngx.say(jit.version)
                        else
                                ngx.say(_VERSION)
                        end

                ';
        }
           

./nginx -s reload後檢視:

curl 192.168.3.126/test
LuaJIT 2.0.4
           

出現以上說明nginx+lua環境安裝成功。

注:若要在浏覽器中檢視,需要在content_by_lua中加入ngx.header.content_type = "text/plain";否則不會顯示頁面。

若是編譯添加子產品,nginx需要先stop再start,才能使lua代碼運作。

另,為友善nginx調用相關lua子產品,我們需要在nginx配置檔案中自定義lua子產品路徑,如:

package.path = "/usr/local/nginx/lualib/?.lua;/usr/local/nginx/lualib/captcha/?.lua;"
package.cpath = "/usr/local/nginx/lualib/?.so;/usr/local/nginx/lualib/captcha/?.so;"
           

好了,初步的環境搭建就先說到這裡,後續會介紹nginx+lua的相關應用。

nginx和lua的相關api請參考:

http://wiki.nginx.org/HttpLuaModule