openresty入门教程:ngx.print ngx.say ngx.log
在OpenResty(一个结合了Nginx和Lua的高性能Web平台)中,ngx.print
、ngx.log
和ngx.say
是处理输出、日志记录和响应发送的常用函数。以下是这些函数的详细教程和使用方法:
1. ngx.print
ngx.print
用于向客户端发送响应内容。它可以接受多种类型的数据,包括字符串、数字、列表(会被自动连接成字符串)和字典(会被转换成字符串表示)。
使用示例:
location /print {
content_by_lua_block {
ngx.print("Hello, ")
ngx.print("OpenResty!\n")
ngx.print(123) -- 数字会被转换成字符串
ngx.print({"foo", "bar"}) -- 列表会被连接成"foobar"
ngx.print({foo = "bar"}) -- 字典会被转换成类似"foo=bar"的字符串
}
}
注意:ngx.print
不会自动添加换行符,需要手动添加\n
。
2. ngx.log
ngx.log
用于记录日志。它接受两个主要参数:日志级别和日志消息。日志级别可以是ngx.ERR
(错误)、ngx.WARN
(警告)、ngx.INFO
(信息)、ngx.DEBUG
(调试)等。
使用示例:
location /log {
content_by_lua_block {
ngx.log(ngx.INFO, "This is an informational message.")
ngx.log(ngx.ERR, "This is an error message.")
}
}
日志消息会被记录到Nginx的错误日志中,日志级别决定了消息的严重程度。
3. ngx.say
ngx.say
是ngx.print
的一个便捷封装,它在输出内容后会自动添加一个换行符(\n
)。这使得它特别适合于发送HTTP响应,因为HTTP响应通常是以行为单位分隔的。
使用示例:
location /say {
content_by_lua_block {
ngx.say("Hello, World!")
ngx.say("This is a new line.")
}
}
等价于使用ngx.print
并手动添加换行符:
location /say-equivalent {
content_by_lua_block {
ngx.print("Hello, World!\n")
ngx.print("This is a new line.\n")
}
}
注意事项
- 上下文:这些函数只能在Nginx Lua模块支持的上下文中使用,如
content_by_lua_block
、content_by_lua_file
等。 - 性能:频繁记录日志(尤其是高级别日志)可能会影响性能,应谨慎使用。
- 输出顺序:在发送HTTP头部之后,应避免使用
ngx.print
或ngx.say
来修改响应体,因为这可能导致错误。 - 字符编码:当输出非ASCII字符时,应确保正确设置
Content-Type
响应头和字符集。
通过理解和正确使用这些函数,你可以更有效地处理HTTP请求和响应,并记录必要的日志信息以供后续分析和调试。