nginx日志采集系列(二)-记录遇到的问题

使用lua-nginx-module遇到的一些问题

  1. 配置在http里面,是全局生效吗?

  2. lua_shared_dict 内存满了后,进行lpush/rpush操作会怎么样?进行lpop和rpop呢?还有内存满了的话,会按照lru清理掉最远未被使用的值吗?ua_shared_dict 内存什么时候会清理掉呢?支持的最小最大内存是多少呢?

  3. 除了init_worker_by_lua_block, 其他的阶段可以启动定时任务吗?

  4. log_by_lua_file可以指定多个lua文件吗?

实践

问题一:配置在http下面,会全局server生效

在http下配置两个server,监听不同的端口,都生效;

分别访问localhost:8888/baidu 和localhost:8000/jd, 可以在数据库中看到,确实入库了

问题二: lua缓存

共享缓存被该nginx服务实例的所有工作进程共享

ua_shared_dict 共享内存满了后,lpush和rpush操作list类型时,会返回nil和 no memory, 如果未满,返回操作过后list的长度,lpop和rpop会正常从缓存中取数

共享缓存满了后,不会覆盖掉最近未被使用的值;

lua缓存在nginx重载配置文件的时候不会清理掉

lua共享缓存最少设置为12k,最大的不清楚

实践

设置logs共享缓存大小位12k,

在log_by_lua_block中通过for循环不断写入数字,ngx打印日志,比对缓存未满和已满的日志信息;

同时通过ngx.shared.logs:free_space()不断打印剩余缓存大小

lua 复制代码
log_by_lua_block {

              -- 需要采集的信息
              require "resty.core.shdict"
              local val = 1;
              local key = "log1";
              local logs = ngx.shared.log1;
              while (1 < 2) do
                     local len, err = ngx.shared.log1:rpush(key, val);
                     if len ~= nil then
                            ngx.log(ngx.ERR, "current len of logs cache: ", len);
                     else
                            ngx.log(ngx.ERR, "cache is full: ", err);
                            break;
                     end
                     val = 1 + val;
                     ngx.log(ngx.ERR, "fress_space of cache: ", logs:free_space());
              end
              
              -- do somthing
       }

日志如下:

在缓存已满的情况下,修改配置,打印重启配置后的缓存剩余大小

重新加载配置,不能向缓存中插入数据, 不会清楚掉缓存中的内容

试一试重启,不支持restart操作

停止的话,显然会清除掉缓存中的内容

如果重载配置后,缓存中的值未被清理,则使用lpop打印出头部字段,不会重写掉

在缓存已满的情况下,修改nginx.conf文件中缓存的大小,会报错

添加一个新的共享缓存,设置大小位8k,报错

至于最大是多少,这个也没有说明,试了一下,20M/200M都是可以的

问题三: 一般是在init_worker_by_lua中执行一些定时任务

一般服务的健康检查就是放到这里面执行

init_by_lua_block在重载配置文件时会执行多次?

还没整明白为什么,下面是github上的介绍

lua 复制代码
init_by_lua_block {
              local keys = "log1";
              ngx.log(ngx.ERR, "after cache full ,the first value is: ", ngx.shared.log1:lpop(keys));
       }

执行nginx -s reload重载配置文件的时候,会执行两次?

对应的lua_block和lua_file不能同时存在

问题四: 不支持

用逗号分割,报错

可以在block中通过dofile来指定执行多个lua脚本

链接

Nginx 配置详解 | 菜鸟教程 (runoob.com)

Nginx虚拟主机的六种配置_nginx虚拟主机配置-CSDN博客

GitHub - openresty/lua-nginx-module: Embed the Power of Lua into NGINX HTTP servers

相关推荐
安的列斯凯奇6 小时前
SpringBoot篇 单元测试 理论篇
spring boot·后端·单元测试
架构文摘JGWZ6 小时前
FastJson很快,有什么用?
后端·学习
BinaryBardC6 小时前
Swift语言的网络编程
开发语言·后端·golang
邓熙榆6 小时前
Haskell语言的正则表达式
开发语言·后端·golang
专职9 小时前
spring boot中实现手动分页
java·spring boot·后端
Ciderw9 小时前
Go中的三种锁
开发语言·c++·后端·golang·互斥锁·
m0_7482463510 小时前
SpringBoot返回文件让前端下载的几种方式
前端·spring boot·后端
m0_7482304410 小时前
创建一个Spring Boot项目
java·spring boot·后端
卿着飞翔10 小时前
Java面试题2025-Mysql
java·spring boot·后端
C++小厨神10 小时前
C#语言的学习路线
开发语言·后端·golang