Nginx添加Lua擴展模塊


Nginx添加Lua擴展模塊

編譯安裝LuaJIT

wget  http://luajit.org/download/LuaJIT-2.0.4.tar.gz
tar xf LuaJIT-2.0.4.tar.gz
cd LuaJIT-2.0.4
make PREFIX=/usr/local/luajit
make install PREFIX=/usr/local/luajit

 

下載擴展模塊

cd /usr/local/src/
wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz
tar -xf v0.3.0.tar.gz

wget https://github.com/openresty/lua-nginx-module/archive/v0.10.8.tar.gz
tar xf v0.10.8.tar.gz

 

 編輯安裝nginx

yum groupinstall -y "Development Tools"
yum install -y libxml2-devel curl-devel pcre-devel openssl-devel siege traceroute vim openssl
cd /usr/local/src
wget http://nginx.org/download/nginx-1.10.3.tar.gz
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0
tar xf nginx-1.10.3.tar.gz && cd nginx-1.10.3
./configure  \
--prefix=/usr/local/nginx-1.10.2 \         # nginx安裝目錄
--with-http_ssl_module      \              #  支持 SSL
--with-http_stub_status_module    \         # nginx狀態模塊
--add-module=/usr/local/src/ngx_devel_kit-0.3.0     \   # lua模塊
--add-module=/usr/local/src/lua-nginx-module-0.10.8     # lua擴展模塊
make && make install
mkdir /usr/local/nginx-1.10.2/conf/vhost
ln -s /usr/local/nginx-1.10.3/sbin/nginx   /bin/nginx
編譯安裝nginx

 

 

重新編譯nginx

# 查看之前的編譯參數
nginx -V

# 設置環境變量
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0

# 進入源碼包目錄
cd /opt/software/nginx-1.10.2/
./configure  \
--prefix=/usr/local/nginx-1.10.2 \         # nginx安裝目錄
--with-http_ssl_module      \              #  支持 SSL
--with-http_stub_status_module    \         # nginx狀態模塊
--add-module=/usr/local/src/ngx_devel_kit-0.3.0     \   # lua模塊
--add-module=/usr/local/src/lua-nginx-module-0.10.8     # lua擴展模塊
make
make install

 

遇到的報錯:

# nginx -t
nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory

# 解決: 查找文件,創建軟連接
find / -name "libluajit-5.1.so.2" ln
-s /usr/local/lib/libluajit-5.1.so.2 /lib64/

 

第一個lua腳本

在server塊中添加
    location /lua {

        default_type 'text/html';

        content_by_lua_file conf/lua/test.lua;    # 相對於nginx安裝目錄

  }

# 編寫lua腳本 [root@yunwei
-test conf]# pwd [root@yunwei-test conf]# /usr/local/nginx-1.10.2/conf [root@yunwei-test conf]# mkdir lua && cd lua [root@yunwei-test conf]# vim test.lua ngx.say("hello world"); # 啟動nginx [root@yunwei-test conf]# nginx -t [root@yunwei-test conf]# nginx 瀏覽器訪問:10.0.3.56/lua 顯示 hello world,表示正常

 

nginx + lua獲取url請求參數

    有個需求就是獲取 url 中 clientId 參數的值,根據clientid中的參數upstream到不同服務器,url有GET和POST請求。

 

代碼如下:

upstream sdk_proxy {
    server    127.0.0.1:188;
    keepalive 64;
}

upstream default_sdk {
    server    127.0.0.1:288;
    keepalive 64;
}


server {
    listen 6443;
    server_name 127.0.0.1;
   
    proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;


    location / {
        default_type text/plain;
        access_by_lua ' 
                local request_method = ngx.var.request_method
                
                local clientids = {"112","113","114"}
                
                if (request_method == "GET") then
                       local arg = ngx.req.get_uri_args()["clientId"] or 0
                       for i,clientid in ipairs(clientids) do
                           if (arg == clientid) then
                               ngx.exec("@sdk")
                           end
                       end
                elseif (request_method == "POST") then
                        ngx.req.read_body()
                        local arg = ngx.req.get_post_args()["clientId"] or 0
                        for i,clientid in ipairs(clientids) do
                            if (arg == clientid) then
                                ngx.exec("@sdk")
                            end
                        end
                end
        ';
 
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://default_sdk;
    }

    location  @sdk {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://sdk_proxy;
    }
}

 

 

參考:

https://segmentfault.com/q/1010000011130967


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM