-
Notifications
You must be signed in to change notification settings - Fork 8
十一、输出响应体
在Lua中,响应体的输出可以使用ngx.print 和 ngx.say 这两个指令完成。
语法:ok, err = ngx.print(...)
配置环境:rewrite_by_lua*,access_by_lua*,content_by_lua*
含义:用来输出内容,输出的内容会和其他的输出合并,然后再发送给客户端。如果响应头还未发送的话,发送前会优先将响应头发送出去。 示例:
location / {
content_by_lua_block {
local ngx = require "ngx";
local h = ngx.req.get_headers()
for k, v in pairs(h) do
ngx.print('Header name: ',k, ' value: ',v)
end
}
} 执行结果如下(所有的数据会合并到一起进行发送):
# curl -i 'http://testnginx.com/test?=12132&a=2&b=c&dd'
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Fri, 08 Jun 2018 08:11:40 GMT
Content-Type: application/octet-stream
Transfer-Encoding: chunked
Connection: keep-alive
Header name:host value: testnginx.comHeader name:accept value: */*Header name:user-agent value: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.
语法:ok, err = ngx.say(...)
配置环境:rewrite_by_lua*,access_by_lua*,content_by_lua*
含义:功能和ngx.print一样,只是输出结果多了1个回车符。
ngx.print和ngx.say为异步调用,执行后并不会立即输出响应体,可以通过执行ngx.flush(true)来实现同步输出响应体的功能。
语法:ok, err = ngx.flush(wait?)
配置环境:rewrite_by_lua*,access_by_lua*,content_by_lua*
含义:在默认情况下会发起一个异步调用,即不等后续的数据到达缓冲区就会直接将内容输出到客户端。如果将wait的参数值设置为true,表示同步执行,即会等内容全部输出到缓冲区后再输出到客户端。
server {
`listen 80;`
`server_name testnginx.com;`
`default_type 'text/plain';`
`location /test1 {`
`content_by_lua_block {`
`ngx.say("test ")`
`ngx.say("nginx ")`
`ngx.sleep(3)`
`ngx.say("ok!")`
`ngx.say("666!")`
`}`
`}`
`location /test2 {`
`content_by_lua_block {`
`ngx.say("test ")`
`ngx.say("nginx ")`
`ngx.flush(true)`
`ngx.sleep(3)`
`ngx.say("ok!")`
`ngx.say("666!")`
`}`
`}`
}
访问/test1 和 /test2后,从执行结果可以看出,带有ngx.flush(true) 指令的内容会先输出test nginx,然后,等待大约3秒后再输出ok! 666!。如果没有配置ngx.flush(true)指令,请求会在等待3秒后输出完整的一句话。
注意:指令ngx.flush不支持HTTP1.0,可以使用如下方式进行测试:
# curl -i 'http://testnginx.com/test2' --http1.0