Skip to content

十一、输出响应体

xikder edited this page Dec 14, 2018 · 1 revision

在Lua中,响应体的输出可以使用ngx.print 和 ngx.say 这两个指令完成。


11.1 异步发送响应体

ngx.print

语法: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.


ngx.say

语法:ok, err = ngx.say(...)

配置环境:rewrite_by_lua*,access_by_lua*,content_by_lua*

含义:功能和ngx.print一样,只是输出结果多了1个回车符。

11.2 同步发送响应体

ngx.print和ngx.say为异步调用,执行后并不会立即输出响应体,可以通过执行ngx.flush(true)来实现同步输出响应体的功能。

ngx.flush

语法: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