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

相关推荐
苏三说技术1 小时前
LangChain4j 和 LangGraph4j,哪个更好?
后端
ServBay2 小时前
7 个AI开发中真正用得上的 MCP Server,配合Claude Code食用效果更佳
后端·claude·mcp
妙码生花2 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十五):优化细节、网络请求封装
前端·后端·ai编程
用户6757049885023 小时前
Go 语言里判断字符串为空,90% 的人都写错了!
后端·go
用户6757049885023 小时前
Go 进阶必修:90% 的人都没用对的“表驱动法”
后端·go
小兔崽子去哪了3 小时前
Java 生成二维码解决方案
java·后端
苍何3 小时前
懂事的 Agent 已经开始自己看屏幕干活了,效率起飞!
后端
掘金码甲哥4 小时前
1分钟买不了吃亏系列: nginx动态域名解析
后端
神奇小汤圆4 小时前
2026大厂Java岗面试记录:八股+场景+项目+AI,一文讲透快速上岸路径(含答案)
后端