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,具體的要求可以看下面官網的說明原文。 ```shell 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 ```shell sudo tar zxvf luajit2-2.1-20201027.tar.gz sudo make install PREFIX=/usr/local/LuaJIT ``` 這裡指定安裝的路徑為`/usr/local/LuaJIT`,如果成功編譯將可以看到如下結果: ![](https://img2020.cnblogs.com/blog/2083963/202011/2083963-20201128210702531-1990669958.png) ###### 3. 編譯nginx 首先安裝nginx必要的依賴pcre pcre-devel zlib zlib-devel openssl-devel: ```shell 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 ``` 然後解壓需要的原始碼包: ```shell 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_LIB`和`LUAJIT_INC`這兩個變數即可,即下面的命令: ```shell 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的時候,就會報下面這個錯誤: ```shell checking for LuaJIT 2.x ... not found ./configure: error: unsupported LuaJIT version; ngx_http_lua_module requires LuaJIT 2.x. ``` 最後無奈,我將這兩個變數直接寫死在lua-nginx-module的config中,即: ```shell # 直接宣告這兩個變數 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編譯選項: ```shell 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 ``` 如果配置成功,將可以看到如下資訊: ![](https://img2020.cnblogs.com/blog/2083963/202011/2083963-20201128211659454-151583089.png) 執行編譯: ```shell sudo make ``` 編譯成功的話,可以看到如下資訊: ![](https://img2020.cnblogs.com/blog/2083963/202011/2083963-20201128211801336-1319794046.png) 安裝nginx,配置指定的nginx安裝路徑為:/usr/local/nginx。 ###### 4. 編譯lua-resty-core lua-resty-core 提供了很多api,在使用nginx + lua 開發時用的最多,所以將以這個為例編譯nginx lua依賴庫,lua-resty-core依賴lua-resty-lrucache模組,所以這兩個模組要一起安裝: ```shell 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: ```shell 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編譯成功了。 ![](https://img2020.cnblogs.com/blog/2083963/202011/2083963-20201128212945491-229833484.png) 關於更多的 lua-resty-core api可以檢視下面官網的文件: ```shell https://github.com/openresty/lua-resty-core ``` ========================================================= 文中用到的原始碼包可**關注**公眾號 “HiIT青年” 傳送 “nginx-lua” 獲取。 ![HiIT青年](https://images.cnblogs.com/cnblogs_com/itqn/1797476/o_200702010008qrcode.jpg) **關注公眾號**,閱讀更多