本节将介绍 NSX Advanced Load Balancer 上存在的各种错误和提供的故障排除选项。

DataScript 可能会由于以下两种情况之一失败:

  1. 配置错误

  2. 执行错误

配置错误

所有 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。将函数更改为正确的名称后,测试并验证问题是否已解决。

在上述示例中,大多数客户端不会受已损坏规则的影响。可以使用此相同逻辑隔离问题并进行测试,而不会影响其他用户。