使用ZeroBrane Studio调试OpenResty和Nginx Lua脚本

ZeroBrane Studio已被用于调试各种Lua引擎 - 游戏框架(如Corona,Gideros,Moai,Love2d),家庭自动化设备,wirehark 脚本,Adobe Lightroom插件等 - 但是已经有几种Lua环境没有尝试过。其中一个是OpenResty / Nginx Lua脚本。OpenResty是一个基于nginx的网络应用服务器,一个非常快速的Web服务器,它提供了具有各种后端(Redis,Memcached,MySQL,HTTP服务器等)的非阻塞IO,并支持Lua作为其脚本语言。

我首先尝试使用OpenResty提供的非阻塞套接字API,但无法让调试工作,因为应该是阻塞的套接字调用返回的时间太早,这破坏了应用程序中的调试器与该IDE。根据OpenResty软件包的维护者Yichun Zhang(agentzh)的建议,我尝试使用与ZeroBrane Studio使用的Luasocket库相同的工具。这些是您可以遵循的步骤来尝试:

ZeroBrane Studio配置。

获得ZeroBrane Studio。这些说明适用于Windows,但调试也适用于Linux和OSX。

2.启动ZBS(zbstudio.exe或zbstudio.sh)并启动调试器Project | Start Debugger Server。

OpenResty配置。

我正在使用一个非常基本的配置(<NGINX>/conf/nginx.conf):

worker_processes 1;

events {

worker_connections 1024;

}

http {

lua_package_path '<ZBS>/lualibs/?/?.lua;<ZBS>/lualibs/?.lua;;';

lua_package_cpath '<ZBS>/bin/clibs/?.dll;;';

server {

location /hellolua {

default_type 'text/plain';

content_by_lua_file 'lua/content.lua';

}

}

}

确保替换<ZBS>为ZeroBrane Studio位置的实际路径。如果您正在OSX上运行,请更换?.dll,?.dylib如果您在Linux上运行,请bin/clibs/?.dll使用bin/linux/x86/clibs/?.so或bin/linux/x64/clibs/?.so取决于您的平台。

2.创建我们要debug(<NGINX>/lua/content.lua)的文件,可能如下所示:

require('mobdebug').start('192.168.1.22')

local name = ngx.var.arg_name or "Anonymous"

ngx.say("Hello, ", name, "!")

ngx.say("Done debugging.")

require('mobdebug').done()

请注意,start()呼叫需要运行IDE的计算机的IP 。默认情况下使用“localhost”,但是由于您的nginx实例正在运行,因此您需要指定运行IDE的计算机的IP地址(在我的例子中192.168.1.22)。

3. <NGINX>/lua/content.lua在IDE中打开该文件(),并将项目目录设置为lua文件夹Project | Project Directory | Set From Current File。

脚本调试。

clip_image001

现在启动nginx并转到http:// localhost / hellolua。如果一切都正确,您应该看到ZeroBrane Studio被激活,绿色箭头指向第二行(类似于上面截图中可以看到的内容)。您现在可以设置断点,逐步执行代码,查看堆栈等。

您也可以转到远程控制台并在那里运行任何ngx命令。例如,如果您运行ngx.say("Message from console")(如屏幕截图所示),脚本完成后将在输出中看到此文本。

如果在开始调试时,如果您在Nginx日志中“尝试屈服于C调用边界”错误,请尝试使用更新的ZeroBrane Studio(0.70+),因为它包含几个改进,使调试能够与最新版本的OpenResty一起使用。

OpenResty配置进行远程调试。

只有在Nginx在一台机器上运行并且ZeroBrane Studio在另一台机器上运行时,如果您OpenResty / Nginx配置为远程调试,则仅需要执行以下步骤。当您在同一台机器上运行时,Nginx正在使用ZeroBrane Studio附带的模块,因为它们被引用lua_package_path和引用lua_package_cpath。

1.复制调试器(mobdebug.lua)和套接字文件。去<ZBS>/lualibs/mobdebug/并复制mobdebug.lua到<NGINX>/lua/mobdebug.lua; 也复制<ZBS>/lualibs/socket.lua到<NGINX>/lua/。完成之后,lua文件夹的内容将如下所示:

./

content.lua

mobdebug.lua

socket.lua

2.复制<ZBS>/bin/clibs/socket/core.dll到<NGINX>/socket/core.dll(core.dylib和core.so文件也在bin文件夹中)。

你应该得到我的光滑ZeroBrane Studio IDE 的副本,并 这里跟随我在Twitter