前因:因公司需要搭建SAAS平台的灰度环境、考虑到该服务是一个开放API类型的,且里面都带有商家唯一ID,且只有POST请求,所以基于唯一标识通过NGINX+lua去转发请求。
每个人遇到的场景不同,以下就是nginx和lua脚本配置。缺点:每次需要增加灰度商户,需要平滑重启服务来重新加载灰度商户配置
nginx 配置
upstream api {
server localhost:8882 weight=75 max_fails=2 fail_timeout=10s;
}
upstream apihd {
server 39.*.*.3:80 weight=75 max_fails=2 fail_timeout=10s;
}
server {
listen *:80;
server_name *.***.net;
index index.php;
access_log logs/apilua.access.log main;
error_log logs/apilua.error.log notice;
root /data*;
charset utf-8;
location / {
if (!-e $request_filename) {
rewrite ^/(.*) /index.php last;
}
location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
include fastcgi.conf;
}
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
}
}
api.lua 配置
-- 读取请求体开关
ngx.req.read_body();
-- 获取请求体内容
local body = ngx.req.get_body_data();
-- 定义灰度服务器组变量
local grouphd = "apihd";
local group = "api";
if method == "GET" then
return 404;
elseif method == "POST" then
-- 查找请求体是否包含灰度商户的appid,包含则不返回nil
if string.find(body,"dp1svA1gkNt8cQMkoIv7HmD1") ~= nil then
--转发灰度
ngx.var.group = grouphd;
elseif string.find(body,"dp2LtmFFfUw4uv6Zk6p9toe") ~= nil then
ngx.var.group = grouphd;
else
-- 转发线上
ngx.var.group = group;
end
else
ngx.var.group = group;
end



