Returning status code with OpenResty + Lua

If we want to return specific status codes from our Lua code we should have the following in mind:

ngx.say("hello")  
return ngx.exit(404)  

Will return 200 response code

ngx.status = 404  
ngx.say("hello")  
return ngx.exit(404)  

Will return 404 response code

BTW that last line return ngx.exit(404) is there to reinforce the code and exist the request.

There is no better way to explain what's happening than read Yichun Zhang comments about the matters:

By default, ngx_lua output response data in a non-buffered manner (in  
order to save memory and increase I/O and CPU overlapping).

When you call ngx.say() for the first time, the response header will  
automatically be sent right away if it is not sent yet. After that,  
even if you call ngx.exit(404), the response header cannot be altered  
because it has already been sent out (unless you have a time machine).  

source