美文网首页
NGINX通过LUA实现LOG记录 POST数据Body(UBU

NGINX通过LUA实现LOG记录 POST数据Body(UBU

作者: Zokoo | 来源:发表于2020-04-13 00:22 被阅读0次

参考链接及遇到问题

参考一

链接:https://blog.csdn.net/kissxia/article/details/78063025
按步骤安装好后,会出现如下报错:

nginx: [alert] detected a LuaJIT version which is not OpenResty's; many optimizations will be disabled and performance will be compromised (see https://github.com/openresty/luajit2 for OpenResty's LuaJIT or, even better, consider using the OpenResty releases from https://openresty.org/en/download.html)
nginx: [alert] failed to load the 'resty.core' module (https://github.com/openresty/lua-resty-core); ensure you are using an OpenResty release from https://openresty.org/en/download.html (reason: module 'resty.core' not found:
        no field package.preload['resty.core']
        no file './resty/core.lua'
        no file '/usr/local/share/luajit-2.0.5/resty/core.lua'
        no file '/usr/local/share/lua/5.1/resty/core.lua'
        no file '/usr/local/share/lua/5.1/resty/core/init.lua'
        no file './resty/core.so'
        no file '/usr/local/lib/lua/5.1/resty/core.so'
        no file '/usr/local/lib/lua/5.1/loadall.so'
        no file './resty.so'
        no file '/usr/local/lib/lua/5.1/resty.so'
        no file '/usr/local/lib/lua/5.1/loadall.so') in /usr/local/nginx/conf/nginx.conf:139

然后找到解决问题的一个方案,如下

参考二

链接:https://blog.csdn.net/qq_27156945/article/details/104019069
把LuaJIT换成github中openresty的,解决掉Warning, 按照步骤重新编译。还是出现如下问题,加入“lua_load_resty_core off;”无帮助。

nginx: [alert] failed to load the 'resty.core' module (https://github.com/openresty/lua-resty-core); ensure you are using an OpenResty release from https://openresty.org/en/download.html (reason: module 'resty.core' not found:
        no field package.preload['resty.core']
        no file './resty/core.lua'
        no file '/usr/local/luajit/share/luajit-2.1.0-beta3/resty/core.lua'
        no file '/usr/local/share/lua/5.1/resty/core.lua'
        no file '/usr/local/share/lua/5.1/resty/core/init.lua'
        no file '/usr/local/luajit/share/lua/5.1/resty/core.lua'
        no file '/usr/local/luajit/share/lua/5.1/resty/core/init.lua'
        no file './resty/core.so'
        no file '/usr/local/lib/lua/5.1/resty/core.so'
        no file '/usr/local/luajit/lib/lua/5.1/resty/core.so'
        no file '/usr/local/lib/lua/5.1/loadall.so'
        no file './resty.so'
        no file '/usr/local/lib/lua/5.1/resty.so'
        no file '/usr/local/luajit/lib/lua/5.1/resty.so'
        no file '/usr/local/lib/lua/5.1/loadall.so') in /usr/local/nginx/conf/nginx.conf:139

问题解决

根据提示,从github中下载对应模块。

解决NO resty.core问题

下载resty.core最新版本:

git clone https://github.com/openresty/lua-resty-core.git

由于在ngnix conf文件中指定的地址是:

lua_package_path "/usr/local/nginx/lua-resty-core/lib/?.lua;;";

所以把文件拷贝到目录:/usr/local/nginx,但出现新问题,找不到resty.lrucache,如下:

nginx: [alert] failed to load the 'resty.core' module (https://github.com/openresty/lua-resty-core); ensure you are using an OpenResty release from https://openresty.org/en/download.html (reason: /usr/local/nginx/lua-resty-core/lib/resty/core/regex.lua:14: module 'resty.lrucache' not found:
        no field package.preload['resty.lrucache']
        no file '/usr/local/nginx/lua-resty-core/lib/resty/lrucache.lua'
        no file './resty/lrucache.lua'
        no file '/usr/local/luajit/share/luajit-2.1.0-beta3/resty/lrucache.lua'
        no file '/usr/local/share/lua/5.1/resty/lrucache.lua'
        no file '/usr/local/share/lua/5.1/resty/lrucache/init.lua'
        no file '/usr/local/luajit/share/lua/5.1/resty/lrucache.lua'
        no file '/usr/local/luajit/share/lua/5.1/resty/lrucache/init.lua'
        no file './resty/lrucache.so'
        no file '/usr/local/lib/lua/5.1/resty/lrucache.so'
        no file '/usr/local/luajit/lib/lua/5.1/resty/lrucache.so'
        no file '/usr/local/lib/lua/5.1/loadall.so'
        no file './resty.so'
        no file '/usr/local/lib/lua/5.1/resty.so'
        no file '/usr/local/luajit/lib/lua/ in /usr/local/nginx/conf/nginx.conf:146

解决NO resty.lrucache的问题

按提示从github中下载resty.lrucache:

git clone https://github.com/openresty/lua-resty-lrucache.git

下载完后,需要添加到目录: '/usr/local/nginx/lua-resty-core':

sudo cp -ru lua-resty-lrucache/* /usr/local/nginx/lua-resty-core/

重新启动nginx,自此问题得到了解决。
最终的conf的http部分配置如下:

http {
    include       mime.types;
    default_type  application/octet-stream;
 
        #一次POST Body最大值
    client_max_body_size 100M;
        #可以放在在$request_body中的最大值。超过这个值,$request_body会是空,log就无法记录了
    client_body_buffer_size 10M;
    lua_package_path "/usr/local/nginx/lua-resty-core/lib/?.lua;;";
    
    init_by_lua_block {
        require "resty.core"
        collectgarbage("collect")   -- just to collect any garbage
    }

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent $request_body "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';


    sendfile        on;
    keepalive_timeout  65;


    lua_need_request_body on;
    server {
        listen       80;
        server_name  localhost;

        access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        location /testlog {
            default_type 'text/html';
            content_by_lua '
                ngx.say("<html><body>Hello, LUA!!</body></html>")
                ngx.req.read_body()
                ';
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

测试效果

root@test:# curl -d "record log" localhost/testlog
<html><body>Hello, LUA!!</body></html>
root@test:# tail /usr/local/nginx/logs/host.access.log
127.0.0.1 - - [13/Apr/2020:00:18:42 +0800] "POST /testlog HTTP/1.1" 200 50 record log "-" "curl/7.58.0" "-"
root@test:#  

可以看到用curl POST 字符串:record log已经按照预定格式记录在log的最后。

相关文章

网友评论

      本文标题:NGINX通过LUA实现LOG记录 POST数据Body(UBU

      本文链接:https://www.haomeiwen.com/subject/dpibmhtx.html