nginx:[错误] 未能初始化 Lua 虚拟机

Posted

技术标签:

【中文标题】nginx:[错误] 未能初始化 Lua 虚拟机【英文标题】:nginx: [error] failed to initialize Lua VM 【发布时间】:2015-04-10 09:53:21 【问题描述】:

我正在尝试使用 valgrind 检查我的 nginx 模块中的内存泄漏。我正在尝试以下命令

valgrind --leak-check=full --tool=memcheck --show-reachable=yes --log-file="/tmp/val.out" -v /usr/local/nginx -c /usr/ local/conf/nginx.conf

我收到错误 nginx: [error] failed to initialize Lua VM

我在 Cent OS 7 和 lua 0.9.15 上使用 nginx-1.6.2。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,通过升级 Valgrind 并在 LuaJIT 编译中添加一些额外的标志来解决这个问题。

查看:

https://github.com/openresty/lua-nginx-module/issues/681 具体来说:

==52538== 使用 Valgrind-3.10.0 和 LibVEX;

您的 valgrind 版本不支持 LuaJIT 自己的分配器所需的 MAP_32BIT 标志。您需要旧版本的 valgrind(如 3.8.1)或新版本(如 3.11.0)。

https://groups.google.com/forum/#!topic/openresty/riEO_YXTwz4 具体来说(使用谷歌翻译):

这是因为 LuaJIT 自带的内存分配器 MAP_32BIT 在 Linux x86_64 上面使用这个标志来调用 mmap() 系统调用。并且 Valgrind 3.9.0 从 mmap 不再支持 MAP_32BIT 这个标志,它会使 LuaJIT 初始化失败。

解决办法是重新编译一个特殊版本的LuaJIT,强制它使用dispenser系统,在编译LuaJIT时使用这样的命令:

制作 CCDEBUG=-g Q= XCFLAGS='-DLUAJIT_USE_VALGRIND -DLUAJIT_USE_SYSMALLOC'

这里最重要的是LUAJIT_USE_SYSMALLOC这个宏。当然,为了获得最佳效果,您还应该指定以下 C 编译器选项:

-DLUA_USE_APICHECK -DLUA_USE_ASSERT

【讨论】:

以上是关于nginx:[错误] 未能初始化 Lua 虚拟机的主要内容,如果未能解决你的问题,请参考以下文章

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

无法打开内核设备“\.Globalvmx86”: 系统找不到指定的文件。是否在安装 VMware Workstation 后重新引导? 未能初始化监视器设备。

Nginx与LUA

奇虎 360 温铭:Nginx + Lua 高性能 Web 平台OpenResty 的未来

lua栈

Nginx+lua+openresty系列 | 第一篇:openresty介绍