Hello!
2013/11/2 jianyingcn:
> 我们想实现不重启nginx动态编译或在加载修改后的lua文件。
>
可以这么做:
1. 把需要动态加载的代码放在一个 Lua 模块文件 foo.lua 中,并标记版本号。
2. 暴露一个 location 让从外部写最新的版本号到一个 ngx_lua 共享内存字典中。
3. 在 Lua 代码中,首先检查当前 foo 模块的版本号与共享内存字典中的最新版本号是否一致;如果不一致的话,则卸载当前的 foo
模块(通过 package.loaded.foo = nil 这一行),然后再调用 local foo = require "foo"
重新加载最新的 foo 模块。
请注意,使用了 LuaJIT FFI 的模块是不能通过清空 package.loaded 中的对应字段卸载的。
>
> 1. location /file 下是lua_code_cache on (content_by_lua_file方式)
> location /up 下是lua_code_cache off (content_by_lua_file方式)
>
> 修改lua文件后。先发送 /up 请求。再发生 /file 发现
> /file 的请求还是旧code文件。
>
这种做法是行不通的。因为对于 lua_code_cache off 的 location,只是直接绕过 Lua code cache
直接加载 .lua 文件。此时新加载的 .lua 文件并不会再写入 Lua code cache 中。这就是为什么你的 location
/file 中从 Lua code cache 读出的代码仍然是老版本。
需要提醒的是,lua_code_cahe off 应当绝对避免在生产环境使用。
Regards,
-agentzh