关于 lua_code_cache ,如何实现不重启nginx 动态编译lua问题

480 views
Skip to first unread message

jiany...@gmail.com

unread,
Nov 3, 2013, 12:55:38 AM11/3/13
to open...@googlegroups.com
我们想实现不重启nginx动态编译或在加载修改后的lua文件。

试了很多方法,都没有实现。

看了文档以后。我英文一般可能理解有问题 试了两种方法都不行:

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文件。

2 把 location /up 改成 rewrite_by_lua_file
还是没有解决

请问我如何 ,或者使用什么机制 可以实现我的想法。。

XinQi Yang

unread,
Nov 5, 2013, 7:45:52 PM11/5/13
to open...@googlegroups.com
在开发的时候在  nginx.conf 里面加入 lua_code_cache off 不就可以了,想做性能测试或者发布的时候,把这句注释掉就好了....

lua_code_cache 这个项目修改后 nginx 要reload吧......


2013/11/3 <jiany...@gmail.com>

--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html



--
xinqiyang

Yichun Zhang (agentzh)

unread,
Nov 5, 2013, 8:03:25 PM11/5/13
to openresty
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
Reply all
Reply to author
Forward
0 new messages