orlabs / orange

OpenResty/Nginx Gateway for API Monitoring and Management.
http://orange.sumory.com
MIT License
2.31k stars 573 forks source link

使用分流插件后获取post请求参数问题 #136

Open sumory opened 7 years ago

sumory commented 7 years ago

有同学经常提问针对application/x-www-form-urlencoded类型的post请求,在使用分流插件后获取不到post参数,大部分都是因为配置不当或者对Nginx相关知识点理解不清晰导致的。

下面介绍一个相关issue的正确配置:

1) nginx.conf里配置一个upstream:

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 .. "]")
            }
        }
}

3) 在dashboard上分流插件配置一个规则,将符合条件的流量打到这个business_upstream上

image

4) 用postman来测试

image

如上图,发送application/x-www-form-urlencoded类型的post请求,能正确获取get和post参数。

image 同样的,发送get请求,也能正确获取到query参数。

关于分流插件的另一个常见问题

使用分流插件时,如果对Nginx的proxy和upstream相关知识点理解不清楚,不要在填写upstream url时在真实的upstream后面拼接任何字符串。当然,如果你非常清楚Nginx的proxy_pass等指令的用法,可以随意使用。此问题可参考这个相关issue

noname007 commented 7 years ago

good doc 👍

Fijileijun commented 6 years ago

@sumory 你好 在这个案例中是必须先在nginx.conf中配置: upstream business_upstream { server 127.0.0.1:8003; } 对吧

divide组件支持动态分配upstream吗?