如何调试OpenResty的Lua代码
在适当位置打印输出
使用print
使用print()
, 相当于ngx.log(ngx.NOTICE, ...)
, 适用于所有阶段.
nginx.conf
|
|
|
|
通过在error.log
中查看相关输出
注意:
- print无法处理lua的table对象, 需要先序列化.
- print无法处理函数对象.
- 需要提前在nginx.conf中设置
error_log logs/error.log notice;
, 才能正常使用print()
使用nxg.say或ngx.print
使用ngx.say()
或ngx.print()
, 这俩区别是在内容输出时前一个比后一个多一个换行符.
|
|
设置断点
函数块内代码的断点
|
|
放置在函数代码块中需要断点的位置, 这样断点位置后的函数代码不会被运行, 注意不会终止代码文件运行.
模块级别(文件)的断点
|
|
用在条件代码块时, return不论是否放在最后一行, 都会最后一个执行, 并会终止当前代码文件的运行.
用于循环代码块时, 会在return所在位置终止当前代码文件的运行.
|
|
在代码文件级别、条件代码块、循环代码块需要设置断点的位置设置do return end
, 将终止当前代码文件的运行.
注意:
以上说的终止代码文件执行, 终止的是return
所在的当前文件(模块)级别, 并不会影响其他执行阶段;
至于是否会终止当前执行阶段, 就要看当前执行阶段的代码块中是否有return
了, 如果return
只是出现在当前代码文件的require
的模块中, 或者是当前代码文件调用的外部定义的函数中, 这个return
也不会影响到当前执行阶段.
当前请求的断点
|
|
当前请求将在ngx.exit
的位置给用户响应, 后续代码不会执行,
注意:
header_filter/body_filter/log
阶段的代码还是会执行的.
当前阶段的断点
ngx.exit(0)
或者 ngx.exit(ngx.OK)
- 当前阶段的位于
ngx.exit(0)
或ngx.exit(ngx.OK)
后的所有代码不会执行, 后续阶段不受影响 - 适用于阶段函数调用的外部函数中
- 注意使用
ngx.exit(-1)
或ngx.exit(ngx.ERROR)
后, 只有log
阶段会执行, 并且不会给客户端响应任何内容和响应码.
lua_code_cache指令
lua_code_cache
指令默认是on
状态, 即会对代码和一些共享数据做缓存, 大大提高性能, 这个在生产环境一定是要打开的.
对于测试阶段, 对于一些测试场景也需要打开, 比如对模块级别变量的测试, 压测等场景.
其他测试场景, 在使用*_by_lua_file
的方式时, 为了不必频繁reload nginx
来重新加载代码的麻烦, 可以将该指令设置为off
.
syntax: lua_code_cache on | off
default: lua_code_cache on
context: http, server, location, location if