Nginx編譯安裝Lua
lua-nginx-module
模組可以將Lua的強大功能嵌入NGINX伺服器。
下載Nginx原始碼
如果已安裝Nginx,需要檢視當前安裝版本的編譯引數:
$ /usr/local/nginx/sbin/nginx -V nginx version: nginx/1.12.2 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) built with OpenSSL 1.0.1e-fips 11 Feb 2013 TLS SNI support enabled configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_sub_module --with-http_gzip_static_module --with-pcre
其中configure arguments
這個引數是非常重要的,我們在後面安裝Lua模組的時候,需要以這個為基礎,增加新的引數。
如果還沒有安裝Nginx,上面可以忽略。
Nginx下載頁面:http://nginx.org/en/download.html
這裡我們以 nginx/1.12.2
為例。需要獲取原始碼:
$ cd /opt/
$ wget http://nginx.org/download/nginx-1.12.2.tar.gz
$ tar -zxvf nginx-1.12.2.tar.gz
安裝lua-nginx-module
需要先安裝LuaJIT,並依賴ngx_devel_kit。
安裝LuaJIT
LuaJIT官網:http://luajit.org/ 。
我們安裝最新穩定版(截止到2018-12-23):
$ wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
$ tar -zxvf LuaJIT-2.0.5.tar.gz
$ cd LuaJIT-2.0.5
$ make install PREFIX=/usr/local/LuaJIT
安裝成功最後一行輸出會提示:
==== Successfully installed LuaJIT 2.0.5 to /usr/local/LuaJIT ====
/etc/profile
檔案末尾加入環境變數:
export LUAJIT_LIB=/usr/local/LuaJIT/lib
export LUAJIT_INC=/usr/local/LuaJIT/include/luajit-2.0
然後:
$ source /etc/profile
安裝ngx_devel_kit
專案地址:https://github.com/simplresty/ngx_devel_kit
下載並解壓,不需要安裝:
$ cd /opt/
$ wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz
$ tar zxvf v0.3.0.tar.gz
$ ls | grep ngx_devel_kit
ngx_devel_kit-0.3.0
安裝lua-nginx-module
專案地址:https://github.com/openresty/lua-nginx-module
下載並解壓,不需要安裝:
$ cd /opt/
$ wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz
$ tar zxvf v0.10.13.tar.gz
$ ls | grep lua-nginx
lua-nginx-module-0.10.13
編譯Nginx
需要安裝pcre依賴庫
$ yum install readline-devel pcre-devel openssl-devel
Nginx編譯引數配置:
$ cd /opt/nginx-1.12.2/
$ ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_sub_module --with-http_gzip_static_module --with-pcre --with-ld-opt=-Wl,-rpath,/usr/local/LuaJIT/lib --add-module=/opt/ngx_devel_kit-0.3.0 --add-module=/opt/lua-nginx-module-0.10.13
這裡因為已經安裝了Nginx,所以這裡的引數是從Nginx -V的輸出裡獲取的,並追加了新的引數:
--with-ld-opt=-Wl,-rpath,/usr/local/LuaJIT/lib --add-module=/opt/ngx_devel_kit-0.3.0 --add-module=/opt/lua-nginx-module-0.10.13
執行上面的./configure
後進行編譯安裝:
$ make -j2
$ make install
make install
後,會覆蓋之前安裝的Nginx。
測試lua-nginx-module
在/usr/local/nginx/conf/nginx.conf
中server
程式碼塊里加入如下程式碼:
location /hello {
default_type 'text/plain';
return 200 'hello echo!';
}
location /hello_lua {
default_type 'text/plain';
content_by_lua 'ngx.say("hello, lua!")';
}
注意:重新編譯 Nginx
二進位制,Nginx
需要停止重啟。而普通配置更新則 reload
即可:
$ kill -QUIT `cat /usr/local/nginx/logs/nginx.pid` && /usr/local/nginx/sbin/nginx
如果支援service nginx restart
,則可以這樣重新啟動:
$ service nginx restart && /usr/local/nginx/sbin/nginx -s reload
然後curl測試:
$ curl http://127.0.0.1/hello
hello echo!
$ curl http://127.0.0.1/hello_lua
hello, lua!
防盜版宣告:本文系原創文章,釋出於公眾號飛鴻影的部落格
(fhyblog)及部落格園,轉載需作者同意。
編譯動態模組
lua-nginx-module
支援以動態模組方式載入,詳見:https://github.com/openresty/lua-nginx-module#building-as-a-dynamic-module 。Nginx版本需要 >=1.9.11
。
$ cd /opt/nginx-1.12.2/
$ ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_sub_module --with-http_gzip_static_module --with-pcre --with-ld-opt=-Wl,-rpath,/usr/local/LuaJIT/lib --add-dynamic-module=/opt/ngx_devel_kit-0.3.0 --add-dynamic-module=/opt/lua-nginx-module-0.10.13
$ make -j2
$ make install
相比靜態編譯,引數--add-module
改成了--add-dynamic-module
。
編譯成功後,會把模組安裝在nginx/modules/
目錄。檢視:
$ ls /usr/local/nginx/modules/
ndk_http_module.so ngx_http_lua_module.so
接下來我們需要在nginx.conf
配置中加入以下兩行,實現動態呼叫模組:
load_module /usr/local/nginx/modules/ndk_http_module.so;
load_module /usr/local/nginx/modules/ngx_http_lua_module.so;
注意:
load_module
指令不能放在http{}
裡面:
worker_processes 1;
load_module xxx;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
}
接下來可以按上面的 測試lua-nginx-module 小節測試。唯一不同的是無需使用kill -QUIT
退出Nginx,直接使用nginx -s reload
熱重啟就行了。
關於Nginx編譯動態模組
NGINX 從 1.9.11 版本起,引入了一個新的模組載入方式:動態載入。這意味著模組可以根據配置檔案,在 NGINX 執行時動態的載入。同樣,也可以通過修改配置檔案然後 Reload NGINX 來解除安裝模組。從此不再需要替換nginx檔案即可增加第三方擴充套件。
如果是相同機器,可以直接把已編譯好的so檔案複製到另外一臺機器,直接修改nginx.conf
即可載入相應模組,這樣可以節省編譯時間及可能產生的問題。
注意:不是所有模組都可以轉換成動態模組。目前官方只有幾個模組支援動態載入,第三方模組需要升級支援才可編譯成模組:
$ ./configure --help | grep dynamic
--with-http_xslt_module=dynamic enable dynamic ngx_http_xslt_module
--with-http_image_filter_module=dynamic
enable dynamic ngx_http_image_filter_module
--with-http_geoip_module=dynamic enable dynamic ngx_http_geoip_module
--with-http_perl_module=dynamic enable dynamic ngx_http_perl_module
--with-mail=dynamic enable dynamic POP3/IMAP4/SMTP proxy module
--with-stream=dynamic enable dynamic TCP/UDP proxy module
--with-stream_geoip_module=dynamic enable dynamic ngx_stream_geoip_module
--add-dynamic-module=PATH enable dynamic external module
--with-compat dynamic modules compatibility
模組API對於靜態模組和動態模組是一致的,但是 config 檔案和編譯方法略微不同。詳見:https://gist.github.com/undirectlookable/2a39cc85b16e2218f162#file-nginx_static_to_dynamic_modules-zh-cn-md
參考
1、Nginx編譯安裝Lua模組遇到的大坑 - 劉信堅的部落格 - CSDN部落格
https://blog.csdn.net/qq_38974634/article/details/81625075
2、Nginx安裝lua-nginx-module模組 - 微信-大資料從業者 - 部落格園
https://www.cnblogs.com/felixzh/p/8709201.html
3、nginx啟動、重啟、重新載入配置檔案和平滑升級 - 蟈蟈的部落格 - CSDN部落格
https://blog.csdn.net/gnail_oug/article/details/52754491
4、[譯] NGINX - 將靜態模組轉換為動態模組
https://gist.github.com/undirectlookable/2a39cc85b16e2218f162
5、How to Compile Dynamic Modules for NGINX Plus
https://www.nginx.com/blog/compiling-dynamic-modules-nginx-plus/
6、Nginx 新增nginx_lua_module模組 | 封塵網
https://www.58jb.com/html/182.html
7、NGINX 載入動態模組(NGINX 1.9.11開始增加載入動態模組支援) - Tinywan - 部落格園
https://www.cnblogs.com/tinywan/p/6965467.html