nginx + lua-nginx-module 編譯

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

nginx是一個高性能的反向代理服務器,lua是一個小巧的腳本語言,利用lua-nginx-module模塊能夠使用lua處理nginx請求,下面將一步步介紹如何編譯帶lua-nginx-module的nginx。nginx

1.下載源碼

編譯帶lua-nginx-module模塊的nginx,須要用到下面6個源碼包。git

  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,具體的要求能夠看下面官網的說明原文。github

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)

解壓、編譯並安裝LuaJITshell

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

這裏指定安裝的路徑爲/usr/local/LuaJIT,若是成功編譯將能夠看到以下結果:api

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

而後解壓須要的源碼包:app

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的時候,就會報下面這個錯誤:ui

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」 獲取。

HiIT青年
關注公衆號,閱讀更多文章。

相關文章
相關標籤/搜索