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

相关推荐
m0_748254667 分钟前
Spring Boot 热部署
java·spring boot·后端
Seven9718 分钟前
SpringCloud带你走进微服务的世界
java·后端·spring cloud
夕颜1111 小时前
排查问题的知识记录
后端
zhuyasen1 小时前
Go语言Viper配置详解:conf库优雅解析实战
后端·golang
一点多余.1 小时前
nginx的使用
运维·nginx
佳佳_2 小时前
Spring Boot SSE 示例
spring boot·后端
Seven972 小时前
【设计模式】使用解释器模式简化复杂的语法规则
java·后端·设计模式
李长渊哦3 小时前
Spring Boot 接口延迟响应的实现与应用场景
spring boot·后端·php
Seven973 小时前
【设计模式】通过访问者模式实现分离算法与对象结构
java·后端·设计模式
Seven973 小时前
【设计模式】遍历集合的艺术:深入探索迭代器模式的无限可能
java·后端·设计模式