通过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常用命令

  1. 从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