nginx LUA使用总结

    不少中间件都会用到lua。mysqlproxy,redis,nginx, lua 一高性能著称。使用脚本能够大大扩展服务器的功能。Nginx不会自然支持lua. 须要先安装nginx的模块lua-nginx-module-0.10.8 。mysql

    我有一个应用是用到nginx下载文件。在下载以前会判断用户请求是否合法。若是只是判断URI地址。仅仅使用nginx的if else 就够了。可是若是要判断请求的参数作业务判断。好比我要拿到用户传过来的参数去 调另一个接口校验,成功则下载。nginx

rewrite_by_lua  '

  resp=ngx.location.capture("/auth");
';

这个auth 是个人一个子请求。正则表达式

location =/auth
        {
      
           proxy_pass  http://host/api/auth
           proxy_pass_request_body off;
           proxy_set_header N-Original-URI $request_uri;
           proxy_set_header Accept-Encoding '';
        }

这里须要设置一个头部 proxy_set_header Accept-Encoding ''。不然请求接口返回的数据多是gzip压缩过的。还要设置N-Original-URI由于接口须要经过N-Original-URI 拿到源地址。redis

 

首先我必须的判断请求接口成功与否。sql

if( res.status ~=200  ) then
                ngx.exit(res.status);
            end;

若是响应的状态码不是200就直接终止本次请求,也不执行下面的lua。执行ngx.exit()的时候把具体错误做为参数传给它。用户在页面上就能够看到错误类型。apache

而后我必须的校验返回的结果是不是合法的,是否符合基本的正则表达式。不能让乱七八糟的返回结果向下执行。api

local  mbody,merror=ngx,re.match(res.body,"([0-9a-zA-Z]+/)*[0-9a-zA-Z]+");
if(mbody)
   ngx.var.userkey=mbody[0]
else
   ngx.log(ngx.ERR,"auth chech fail"..(res.body));
   ngx.exit(ngx.HTTP_FORBIDDEN);
end;

校验返回的结果是不是 单词/单词的形式。lua自己%w能够表示单词,可是我在这里写%w好像不经过。服务器

若是校验失败就打印一个错误日志而后直接终止当前请求。若是成功拿到的变量userkey就能够作后面请求的地址拼接 proxy_pass http://host/${userkey};性能

相关文章
相关标签/搜索