Nginx編譯安裝lua-nginx-module

lua-nginx-module 模塊能夠將Lua的強大功能嵌入NGINX服務器。html

下載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模塊的時候,須要以這個爲基礎,增長新的參數。git

若是尚未安裝Nginx,上面能夠忽略。github

Nginx下載頁面:http://nginx.org/en/download.htmlbash

這裏咱們以 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/curl

咱們安裝最新穩定版(截止到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.confserver代碼塊里加入以下代碼:

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

參考

一、Nginx編譯安裝Lua模塊遇到的大坑 - 劉信堅的博客 - CSDN博客
https://blog.csdn.net/qq_38974634/article/details/81625075
二、Nginx安裝lua-nginx-module模塊 - 微信-大數據從業者 - 博客園
http://www.javashuo.com/article/p-tjtssmln-cx.html
三、nginx啓動、重啓、從新加載配置文件和平滑升級 - 蟈蟈的博客 - CSDN博客
http://www.javashuo.com/article/p-mxdzolnj-kh.html
四、[譯] NGINX - 將靜態模塊轉換爲動態模塊
https://gist.github.com/undirectlookable/2a39cc85b16e2218f162
五、How to Compile Dynamic Modules for NGINX Plus
https://www.nginx.com/blog/compiling-dynamic-modules-nginx-plus/
六、Nginx 添加nginx_lua_module模塊 | 封塵網
https://www.58jb.com/html/182.html
七、NGINX 加載動態模塊(NGINX 1.9.11開始增長加載動態模塊支持) - Tinywan - 博客園
http://www.javashuo.com/article/p-tqagzxjk-cn.html

相關文章
相關標籤/搜索