使用lua-nginx-module遇到的一些问题
-
配置在http里面,是全局生效吗?
-
lua_shared_dict 内存满了后,进行lpush/rpush操作会怎么样?进行lpop和rpop呢?还有内存满了的话,会按照lru清理掉最远未被使用的值吗?ua_shared_dict 内存什么时候会清理掉呢?支持的最小最大内存是多少呢?
-
除了init_worker_by_lua_block, 其他的阶段可以启动定时任务吗?
-
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