本节将介绍 NSX Advanced Load Balancer 上存在的各种错误和提供的故障排除选项。
DataScript 可能会由于以下两种情况之一失败:
配置错误
所有 DataScript 均在配置保存/编辑期间进行解析。尝试提交 DataScript 时,不正确的 DataScript 语法将失败。报告配置时间错误是为了帮助调试,因此将捕获语法错误,而不是逻辑错误。以下 DataScript 包含多余字符。Lua
将其解释为尚未声明的变量,例如,abc = 1。
if avi.vs.client_ip() == "10.1.1.1" then abc avi.http.close_conn() def end ghi
错误消息:
Failed to compile the datascript "Drop_Client_on_http_req.ds": luac: Drop_Client_on_http_req.ds:3: '=' expected near 'avi'
上述规则有三个语法错误,但仅报告遇到的第一个错误。在此示例中,abc 是一个未声明的变量,但是直到读取下一行时才会注意到这个确定错误。因此,在第 3 行而非第 2 行报告错误: http_req.ds:3
,并且报告错误位置在“avi
”附近。DataScript 对空格和回车非常宽容。变量声明 abc = 2 是有效的。
abc = 2
以下 DataScript 缺少完成 if 逻辑的结尾:
if avi.vs.client_ip() == "10.1.1.1" then avi.http.close_conn()
错误消息:
Failed to compile the datascript "Drop_Client_on_http_req.ds": luac: Drop_Client_on_http_req.ds:1: 'end' expected near '<eof>'
执行错误
即使可以在不报错的情况下保存 DataScript,仍可能存在逻辑问题或其他问题,稍后可能会弹出。当 DataScript 执行遇到故障时,该请求或响应的脚本执行会提前结束。将向客户端发送 HTTP 500 Internal Server Error
,并使用已提前结束的脚本的堆栈跟踪生成客户端日志以帮助调试。
使用以下
筛选器搜索出现 DataScript 错误的客户端。significance= “Request ended abnormally: Datascript failed to execute”
。打开客户端日志,然后单击所有标头以查看有关错误的更多信息。
以下是日志中的错误示例:
Datascript 错误
[string "Drop Client"]:2: attempt to call field 'close_conn' (a nil value)
Datascript 错误堆栈跟踪
stack traceback: coroutine 0: [string "Drop Client"]:2: in function <[string "Drop Client"]:1>
此错误的堆栈跟踪可能不会提供原因,但确实会提供有用的提示。该错误位于规则 "Drop Client"]:2 的第二行中,并且与 close_conn 函数有关。从规则来看,问题可能仍然不明显。
if avi.vs.client_ip() == "10.1.1.1" then avi.close_conn() end
有关更多信息,请参阅 avi.http.close_conn。将函数更改为正确的名称后,测试并验证问题是否已解决。
在上述示例中,大多数客户端不会受已损坏规则的影响。可以使用此相同逻辑隔离问题并进行测试,而不会影响其他用户。