通过nginx_lua拦截请求参数准发到不同服务
一、引言
在不更改代码情况下,使用nginx拦截请求参数token,通过token长短转发到不同应用。可使用nginx_lua 实现。
二、处理方案
2.1 前置要求
nginx安装lua模块,也可直接使用OpenResty(通过Lua拓展nginx的web平台);
下载地址: http://openresty.org/cn/
2.2 编写demo.lua脚本
-- 1、token可通过url和请求头传递
-- 2、新程序token是jwt,旧程序token是原生的security oauth2 生成的uuid
-- 分別从请求头、url获取token
-- 获取body参数
-- 可使用ngx.req.read_body()和 ngx.req.get_post_args()
-- 1、从url中获取token,从请求头获取token,替换Bearer
local param = ""
if(ngx.var.arg_token ~= nil) then
param = ngx.var.arg_token
elseif(ngx.var.http_Authorization ~= nil) then
param= string.gsub(ngx.var.http_Authorization, "Bearer ", "")
end
-- 根据token长度 转发
if (param ~= nil and string.len(param) > 40 ) then
ngx.log(ngx.ERR,"token--new--send " ..param)
return ngx.exec("/new", {token= param})
else
ngx.log(ngx.ERR,"token--used--send " ..param)
return ngx.exec("/used",{token= param})
end
2.3 nginx.conf 出发脚本
server {
listen 8080;
server_name localhost;
charset utf8;
#拦截url,获取token转发到不同路由
location =/api/oauth/check_token {
content_by_lua_file "/etc/nginx/demo.lua";
}
#程序1 jwtToken
location =/agent_api/oauth/refresh_token {
proxy_pass http://127.0.0.1:8080/oauth/check_token;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
rewrite ^(.*) /oauth/token?grant_type=refresh_token break;
}
#程序1 原生Token
location /new {
internal;
proxy_pass http://127.0.0.1:8081/oauth/check_token;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location =/50x.html {
root /html;
}
}
三、lua常用命令
- 从url中获取参数:ngx.var.arg_参数key
2.从请求头中获取参数:ngx.var.http_参数key
3.日志输出
- ngx.STDERR – 标准输出
- ngx.EMERG – 紧急报错
- ngx.ALERT – 报警
- ngx.CRIT – 严重,系统故障,触发运维告警系统
- ngx.ERR – 错误,业务不可恢复性错误
- ngx.WARN – 告警,业务中可忽略错误
- ngx.NOTICE – 提醒,业务比较重要信息
- ngx.INFO – 信息,业务琐碎日志信息,包含不同情况判断等
- ngx.DEBUG – 调试
4. 执行lua脚本路径:content_by_lua_file