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

相关推荐
AI大模型24 分钟前
从原理到落地:RAG 技术全解析,手把手教你搭建专属知识库
程序员·llm·agent
IT_陈寒28 分钟前
React 性能优化:5个实战技巧让首屏加载提升50%,开发者亲测有效!
前端·人工智能·后端
AI大模型42 分钟前
RAG:企业数智化的“知识引擎”,让AI真正读懂你的业务
程序员·llm·agent
大厂码农老A1 小时前
你打的日志,正在拖垮你的系统:从P4小白到P7专家都是怎么打日志的?
java·前端·后端
摇滚侠1 小时前
Spring Boot 3零基础教程,深度理解 Spring Boot 自动配置原理,笔记11
spring boot·笔记·后端
间彧1 小时前
Spring Boot默认支持Logback的原因分析
后端
ezl1fe1 小时前
第零篇:把 Agent 跑起来的最小闭环
人工智能·后端·agent
文心快码BaiduComate1 小时前
文心快码Comate3.5S更新,用多智能体协同做个健康管理应用
前端·人工智能·后端
程序员鱼皮1 小时前
我造了个程序员练兵场,专治技术焦虑症!
java·计算机·程序员·编程·自学
袁煦丞1 小时前
极空间变身全能私有云+1Panel傻瓜式部署:cpolar内网穿透实验室第618个成功挑战
前端·程序员·远程工作