×

lua_code_cache 开启或关闭缓存

2021-04-14 23:56:47 Falcon

代码介绍

这个参数对lua的调试开发非常重要,作用是关闭或者开启lua的代码缓存,如果你再开发的时候需要实时看到代码变化后的效果,就关闭lua_code_cache即可。

语法 默认状态 作用域
lua_code_cache on | off lua_code_cache on http, server, location, location if

lua_code_cache 是默认开启状态的,做调试的时候可以设置为lua_code_cache off即可关闭缓存。

从0.9.3版本开始,lua_code_cache关闭时,ngx_lua服务的每个请求都将在单独的Lua VM实例中运行。因此,不会缓存set_by_lua_filecontent_by_lua_fileaccess_by_lua_file等中引用的Lua文件,并且将重新使用所有使用的Lua模块。有了这个,开发人员可以采用编辑和刷新方法。

但是请注意,在nginx.conf中内联编写的Lua代码(例如set_by_lua,content_by_luaaccess_by_luarewrite_by_lua指定的代码)在您编辑nginx.conf文件中的内联Lua代码时将不会更新,因为只有Nginx配置文件解析器可以正确解析nginx.conf文件,唯一的方法是通过发送HUP信号来重新加载配置文件,或者只是重新启动Nginx。

即使启用了代码缓存,也无法缓存由dofile*_by_lua_file中的loadfile加载的Lua文件(除非您自己缓存结果)。通常,您可以使用init_by_luainit_by_lua_file指令加载所有此类文件,也可以仅使这些Lua文件成为真正的Lua模块并通过require加载它们。

ngx_lua模块不支持Apache mod_lua模块可用的统计模式(尚未)。

强烈建议不要在生产环境禁用Lua代码缓存,仅在开发期间使用,因为它会对整体性能产生重大负面影响。例如,在禁用Lua代码缓存后,“ hello world” Lua示例的性能可能下降一个数量级。

实际操作:

server{
  lua_code_cache off; //关闭lua缓存 重启后生效
  server_name localhost;
  default_type 'text/plain';
  content_by_lua_file /conf/lua/test.lua; //将lua程序用file文件加载
}

注意:重启nginx会有警告不用管它

nginx:[warn] lua_code_cache is off; this will hurt performance in /usr/local/nginx/conf/nginx.cof:87

修改完成,这样就可以不需要重启nginx情况下实时访问lua程序

常见问题

网上有很多小伙伴们遇到过和我一样的问题:当lua_code_cache开关打开时,当使用content_by_lua 引入外部的lua文件,并且在lua文件中有对应的内容输出,只有第一次运行脚本的时候正常,如果再次运行,浏览器就会提示500 服务器内部错误。或者第一次请求有响应数据,第二次提示响应数据为空。

问题的原因:

类似这种问题的原因常见的错误是你使用的 lua文件的模块滥用 Lua 全局变量来存放其内部状态信息,而不是模块 table 本身。

而在lua_code_cache on 时,全局变量的生命期是每请求的,所以会出现这种情况:

第一个请求调用 require 加载了你用lua文件写的模块,而你的该模块把内部状态保存在了和第一个请求相关联的某些全局变量中。

后续的各次请求调用 require 时直接返回了步骤 1 中已经加载过的lua模块所对应的 table.

但此时后续请求的全局变量都是干净的(和第一个请求无关),于是该lua模块无法得到它需要的内部状态数据,出现访问未初始化变量的错误。

解决方式和建议:

总是使用下面的形式来加载 Lua 模块:

local foo = require "foo"   -- This is correct! 

而不是简单地 

require "foo"    -- This is wrong!! 
本文收录于