前因:因公司需要搭建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;
client_header_buffer_size 128k;
client_body_buffer_size 1m;
proxy_buffer_size 64k;
proxy_buffers 64 64k;
proxy_busy_buffers_size 1m;
proxy_temp_file_write_size 512k;
##定义转发变量
set $group "api";
location / {
##参数调用lua脚本,通过lua重新定义group变量
rewrite_by_lua_file /usr/local/services/nginx-1.14.2/lua/api.lua;
proxy_pass http://$group;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen *:8882;
server_name *.***.net;
index index.php;
access_log logs/api.access.log main;
error_log logs/api.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