upstream business_upstream {
server 127.0.0.1:8003;
}
2) 然后配一个server用来作为business_upstream的服务提供者:
server {
listen 8003;
server_name localhost 127.0.0.1;
access_log ./logs/business_upstream_access.log main;
error_log ./logs/business_upstream_error.log;
location / {
content_by_lua_block {
-- 读取get和post(x-www-form-urlencoded)请求的参数
ngx.req.read_body()
local post_params = ngx.req.get_post_args() -- 获取post请求还有另一个方法ngx.req.get_body_data(),这两个API的区别请自行查看官方文档
local query = ngx.req.get_uri_args()
-- 组装参数用于展示
local q = ""
for i, v in pairs(query) do
q = i .. ":" .. v .. " " .. q
end
local p = ""
for i, v in pairs(post_params) do
p = i .. ":" .. v .. " " .. p
end
-- 打印获取到的参数
ngx.say("business_upstream, uri:" .. ngx.var.uri .. " query:[" .. q .. "] post:[" .. p .. "]")
}
}
}
有同学经常提问针对
application/x-www-form-urlencoded
类型的post请求,在使用分流插件后获取不到post参数,大部分都是因为配置不当或者对Nginx相关知识点理解不清晰导致的。下面介绍一个相关issue的正确配置:
1) nginx.conf里配置一个upstream:
2) 然后配一个server用来作为business_upstream的服务提供者:
3) 在dashboard上分流插件配置一个规则,将符合条件的流量打到这个business_upstream上
4) 用postman来测试
如上图,发送
application/x-www-form-urlencoded
类型的post请求,能正确获取get和post参数。同样的,发送get请求,也能正确获取到query参数。
关于分流插件的另一个常见问题
使用分流插件时,如果对Nginx的proxy和upstream相关知识点理解不清楚,不要在填写
upstream url
时在真实的upstream后面拼接任何字符串。当然,如果你非常清楚Nginx的proxy_pass等指令的用法,可以随意使用。此问题可参考这个相关issue