1. 程式人生 > 實用技巧 >nginx + lua-nginx-module 編譯

nginx + lua-nginx-module 編譯

摘要:本文主要介紹如何將lua-nginx-module 編譯到nginx主程式中。

nginx是一個高效能的反向代理伺服器,lua是一個小巧的指令碼語言,利用lua-nginx-module模組可以使用lua處理nginx請求,下面將一步步介紹如何編譯帶lua-nginx-module的nginx。

1.下載原始碼

編譯帶lua-nginx-module模組的nginx,需要用到下面6個原始碼包。

  1. luajit2-2.1-20201027.tar.gz
  2. lua-nginx-module-0.10.19.tar.gz
  3. lua-resty-core-0.1.21.tar.gz [非必須]
  4. lua-resty-lrucache-0.10.tar.gz [非必須]
  5. nginx-1.19.5.tar.gz
  6. ngx_devel_kit-0.3.1.tar.gz
2. 編譯LuaJIT

lua-nginx-module 依賴LuaJIT 2.x,ngx_devel_kit,所以編譯帶lua-nignx-module模組的nginx之前必須先編譯LuaJIT,具體的要求可以看下面官網的說明原文。

1. LuaJIT can be downloaded from the latest release of OpenResty's LuaJIT fork. The official LuaJIT 2.x releases are also supported, although performance will be significantly lower for reasons elaborated above
2. Download the latest version of the ngx_devel_kit (NDK) module HERE
3. Download the latest version of ngx_lua HERE
4. Download the latest supported version of Nginx HERE (See Nginx Compatibility)

解壓、編譯並安裝LuaJIT

sudo tar zxvf luajit2-2.1-20201027.tar.gz
sudo make install PREFIX=/usr/local/LuaJIT

這裡指定安裝的路徑為/usr/local/LuaJIT,如果成功編譯將可以看到如下結果:

3. 編譯nginx

首先安裝nginx必要的依賴pcre pcre-devel zlib zlib-devel openssl-devel:

sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install zlib1g-dev
sudo apt-get install openssl libssl-dev 
# 如果是Centos系統,則使用下面的命令
# yum install pcre pcre-devel
# yum install zlib zlib-devel
# yum install openssl-devel

然後解壓需要的原始碼包:

sudo tar zxvf nginx-1.19.5.tar.gz
sudo tar zxvf ngx_devel_kit-0.3.1.tar.gz
sudo tar zxvf lua-nginx-module-0.10.19.tar.gz

編譯nginx這裡有個坑,官網的說明文件是設定LUAJIT_LIBLUAJIT_INC這兩個變數即可,即下面的命令:

 export LUAJIT_LIB=/path/to/luajit/lib
 export LUAJIT_INC=/path/to/luajit/include/luajit-2.1

但是實測發現,這個方案並不行,lua-nginx-module的config還是走了auto-discovery的流程,由於上面自己指定了LuaJIT的安裝路徑,auto-discovery並不能發現LuaJIT,在nginx configure的時候,就會報下面這個錯誤:

checking for LuaJIT 2.x ... not found
    ./configure: error: unsupported LuaJIT version; ngx_http_lua_module requires LuaJIT 2.x.

最後無奈,我將這兩個變數直接寫死在lua-nginx-module的config中,即:

# 直接宣告這兩個變數
LUAJIT_INC=/usr/local/LuaJIT/include/luajit-2.1
LUAJIT_LIB=/usr/local/LuaJIT/lib

ngx_lua_opt_I=
ngx_lua_opt_L=
luajit_ld_opt=

ngx_feature_name=
ngx_feature_run=no
ngx_feature_incs=
ngx_feature_test=

# 使得config走if流程
if [ -n "$LUAJIT_INC" -o -n "$LUAJIT_LIB" ]; then
....

配置nginx編譯選項:

sudo ./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--error-log-path=/usr/local/nginx/logs/error.log \
--with-http_ssl_module \
--with-ld-opt="-Wl,-rpath,/usr/local/LuaJIT/lib" \
--add-module=/usr/local/src/ngx_devel_kit-0.3.1 \
--add-module=/usr/local/src/lua-nginx-module-0.10.19

如果配置成功,將可以看到如下資訊:

執行編譯:

sudo make

編譯成功的話,可以看到如下資訊:

安裝nginx,配置指定的nginx安裝路徑為:/usr/local/nginx。

4. 編譯lua-resty-core

lua-resty-core 提供了很多api,在使用nginx + lua 開發時用的最多,所以將以這個為例編譯nginx lua依賴庫,lua-resty-core依賴lua-resty-lrucache模組,所以這兩個模組要一起安裝:

sudo tar zxvf lua-resty-core-0.1.21.tar.gz
sudo tar zxvf lua-resty-lrucache-0.10.tar.gz

cd lua-resty-core-0.1.21
sudo make install PREFIX=/usr/local/LuaLIB
cd ../lua-resty-lrucache-0.10
sudo make install PREFIX=/usr/local/LuaLIB

這裡將這兩個模組都安裝在/usr/local/LuaLIB。

5. 編寫lua指令處理nginx請求

nginx編譯完成之後就可以使用lua指令碼來處理nginx請求了,先上一個Hello World示例,調整nginx.conf:

http {
    # 指定lua模組路徑,多個之間";"分隔,其中";;"表示預設搜尋路徑,預設到nginx的根目錄下找
    lua_package_path "/usr/local/LuaLIB/lib/lua/?.lua;;";
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        # 使用lua-resty-core輸出一個字串
        location /lua {
            default_type 'text/html';
            content_by_lua 'ngx.say("Hi Lua")';
        }
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
}

請求/lua可以看到如下效果,就說明nginx + lua-nginx-module編譯成功了。

關於更多的 lua-resty-core api可以檢視下面官網的文件:

https://github.com/openresty/lua-resty-core

=========================================================
文中用到的原始碼包可關注公眾號 “HiIT青年” 傳送 “nginx-lua” 獲取。


關注公眾號,閱讀更多文章。