简单测试一下
location = /mixed {
set_by_lua $a 'ngx.log(ngx.ERR, "set_by_lua")';
rewrite_by_lua 'ngx.log(ngx.ERR, "rewrite_by_lua")';
access_by_lua 'ngx.log(ngx.ERR, "access_by_lua")';
header_filter_by_lua 'ngx.log(ngx.ERR, "header_filter_by_lua")';
body_filter_by_lua 'ngx.log(ngx.ERR, "body_filter_by_lua")';
log_by_lua 'ngx.log(ngx.ERR, "log_by_lua")';
content_by_lua 'ngx.log(ngx.ERR, "content_by_lua")';
}
执行结果日志(截取了一下):
set_by_lua
rewrite_by_lua
access_by_lua
content_by_lua
header_filter_by_lua
body_filter_by_lua
log_by_lua
这样我们就可以根据我们的需要,在不同的阶段直接完成大部分典型处理了。
- set_by_lua: 流程分支处理判断变量初始化
- rewrite_by_lua: 转发、重定向、缓存等功能(例如特定请求代理到外网)
- access_by_lua: IP准入、接口权限、A/B测试
- content_by_lua: 内容生成
- header_filter_by_lua: 应答HTTP过滤处理(添加修改头部信息)
- body_filter_by_lua: 应答BODY过滤处理(例如完成应答内容统一成大写)
- log_by_lua: 会话完成后本地异步完成日志记录(日志可以记录在本地,还可以同步到其他机器)
注意access_by_lua 如果执行了ngx.say, 那么content_by_lua就不会执行,也就是access_by_lua其实可以代替content_by_lua
在access_by_lua 阶段执行ngx.exit, 并不会中断整个请求,只会跳过content_by_lua 阶段,后面的header_filter_by_lua和body_filter_by_lua还是会被执行。