nginx_lua的安装

nginx使用luajit进行编译安装

使用openresty进行yum安装

openresty中将lua和nginx进行封装,详情可查看openresty官网

openresty相关启动命令service openresty start

ngx_lua的相关api使用说明及相关使用

ngx_lua的日常使用场景

ngx_lua的执行顺序,可以看这张图

通过nginx直接进行一些值的显示,此处用到的一般是content_by_lua模块,lua 1.9.5版本中是content_by_lua_block

通过nginx作访问权限控制,包括重写等,不过nginx也可以直接重写

ngx_lua的实例

业务场景

老板要求访问一个url时进行用户时作权限控制,有权限者可以查看url,无权限者则直接返回错误

其中开发人员写了一个接口,能通过传入的两个参数(报表名和用户名),返回对应的值

其中实现过程如下

1.登陆入系统lebi.letv.cn中

2.用户需要访问报表链接,其中报表链接均为http://xxx/views/xxx模式

3.访问报表时,nginx先通过lua进行控制,先向开发人员提供的接口http://10.58.91.84:8080/m/api/permission/getSchedulePermission传递报表名和用户名,其中报表名从报表访问链接中获取,用户名从cookie中获取

4.ngx_lua控制访问请求,同时作相关的处理

开发接口返回值说明

开发接口返回值设置三种:

http状态码403为没权限

http状态码200为通过验证

http状态码500为服务错误

相关curl测试状态如下

http 403:

[root@10-110-157-48 conf.d]# curl -i ‘http://10.58.91.84:8080/m/api/permission/getSchedulePermission?username=marility&url=http://a/b/c‘

HTTP/1.1 403 Forbidden

Server: Apache-Coyote/1.1

Content-Type: application/json;charset=UTF-8

Transfer-Encoding: chunked

Date: Thu, 01 Mar 2018 08:26:05 GMT

{"success":false,"errorMsg":"没有权限,请联系管理员"}

http 200:

[root@10-110-157-48 conf.d]# curl -i ‘http://10.58.91.84:8080/m/api/permission/getSchedulePermission?username=letv&url=http://a/b/c‘

HTTP/1.1 200 OK

Server: Apache-Coyote/1.1

Content-Type: application/json;charset=UTF-8

Transfer-Encoding: chunked

Date: Thu, 01 Mar 2018 09:45:24 GMT

{"Msg":"有权限查看","success"}

http 500:

[root@10-110-157-48 conf.d]# curl -i ‘http://10.58.91.84:8080/m/api/permission/getSchedulePermission?username=letv&url=‘

HTTP/1.1 500 Internal Server Error

Server: Apache-Coyote/1.1

Content-Type: application/json;charset=utf-8

Transfer-Encoding: chunked

Date: Thu, 01 Mar 2018 10:07:03 GMT

Connection: close

{"errorMsg":"java.lang.ArrayIndexOutOfBoundsException: 2","success":false}

以上测试中url中直接传入测试url=http://a/b/c, 实际中应该动态传入访问报表的链接

ngx_lua中的控制

location ~ ^/views {

access_by_lua ‘

local res = ngx.location.capture("/matrix_proxy/m/api/permission/getSchedulePermission", {args={username=ngx.var.cookie_example , url=ngx.var.request_uri}})

if res.status == ngx.HTTP_FORBIDDEN then

ngx.exec("@hello")

elseif res.status == ngx.HTTP_OK then

ngx.exec("@/")

elseif res.status == ngx.HTTP_INTERNAL_SERVER_ERROR then

ngx.exec("@servererror")

else

ngx.exec("@error")

end

‘;}

access_by_lua因为要实现权限控制,所以只能选择access_by_lua,而不能使用content_by_lua

nginx中的lua全文以单引号‘ ‘进行囊括

local res, lua中使用local定义一个变量res

向一个接口发送参数,有两种方法,一种是使用ngx.location.capture方法,另外一种是httpc:request_uri,httpc.request_uri为openresty的第三方模块。 httpc.request_url的api使用说明 , openresty加载第三方模块说明 , 本例中使用capture方法

ngx.location.capture方法不能象httpc:request_uri方法一样直接传入url,而只能是$request_uri,所以此处先进行一层的/matrix_proxy/的封装,而/matrix_proxy通过pass_proxy,将请求反代至接口的服务器ip 10.58.91.84:8080

此处向接口url传递两个参数,因为要传入变量,所以要以{args={ }}的形式来完成。如果使用httpc.request_uri方法的话,应该可以使用lua的..拼接符进行变量与uri的拼接,有兴趣的同学可以自行测试

ngx.var.cookie_COOKIE_KEY 获取用户的cookie的value值,上实例中cookie的key为example。ngx.var.request_uri 获取nginx中的$request_uri值

从api说明中可以看到ngx.location.capture有4个slots,其中一个是res.status

判断res.status的结果与http状态码是否相等,lua中等于判断使用==

lua中多重if判断使用elseif

lua中if完整的语句为 if..else..end

将四种结果均返回进行执行,ngx.exec表示执行后面的location,@hello 中的 @表示nginx内部的传递,不会进行外部的跳转

完整的ngx_lua配制实例

[root@10-110-157-48 conf.d]# cat tableau.conf

upstream backend_lebiTableau {

server 10.110.150.217;

keepalive 100;

}

upstream matrix_proxy_backend {

server 10.58.91.84:8080;

keepalive 100;

}

server {

listen 82;

server_name lebi.letv.cn;

resolver 10.110.220.231;

access_log /tmp/lebitableau.a.log main;

error_log /tmp/lebitableau.error.log ;

location = /favicon.ico {

log_not_found off;

log_subrequest off;

}

location / {

proxy_http_version 1.1;

proxy_set_header Connection "";

proxy_set_header Host $host;

proxy_pass http://backend_lebiTableau;

proxy_send_timeout 18000;

proxy_read_timeout 18000;

proxy_next_upstream error timeout invalid_header http_500;

proxy_connect_timeout 20;

}

location ~ /matrix_proxy/(.*) {

internal;

proxy_pass http://matrix_proxy_backend/$1$is_args$args;

}

location @/ {

proxy_pass http://backend_lebiTableau;

}

location @error {

return 403;

}

location @servererror {

default_type ‘text/plain‘;

content_by_lua ‘ngx.say("server error")‘;

}

location @hello {

rewrite ^(.*)$ http://matrix.lebi.letv.cn/#/error break; ##没有权限的用户全部rewrite至系统错误页面

}

location @ok {

default_type ‘text/plain‘;

content_by_lua ‘ngx.say("authorized ok, cookie=", ngx.var.cookie_78bdfe11ce353909cb210160a76c330b)‘;

}

location ~ ^/views {

access_by_lua ‘

local res = ngx.location.capture("/matrix_proxy/m/api/permission/getSchedulePermission", {args={username=ngx.var.cookie_example , url=ngx.var.request_uri}})

if res.status == ngx.HTTP_FORBIDDEN then

ngx.exec("@hello")

elseif res.status == ngx.HTTP_OK then

ngx.exec("@/")

elseif res.status == ngx.HTTP_INTERNAL_SERVER_ERROR then

ngx.exec("@servererror")

else

ngx.exec("@error")

end

‘;}

}

nginxlua文件服务器权限,通过lua进行nginx的权限控制相关推荐

  1. nginx的权限问题(Permission denied)解决办法

    nginx的权限问题(Permission denied)解决办法 一个nginx带多个tomcat集群环境,老是报如下错误: failed (13: Permission denied) while ...

  2. 文件服务器共享文件夹访问权限,5对文件服务器中的共享文件夹进行访问权限控制...

    对文件服务器中的共享文件夹进行访问权限控制 1. 实训目的 在Windows Server 2003环境下设置文件服务器的目的是要对多用户进行资源共享,这其中经常遇到不同用户应该分配不同权限的问题,通 ...

  3. php require persion denied,php,nginx_php+nginx配置权限问题(13: Permission denied),php,nginx - phpStudy...

    php+nginx配置权限问题(13: Permission denied) ps查看nginx数据: _www 508 0.0 0.0 2461508 1320 ?? S 10:46下午 0:00. ...

  4. 内网畅外网墙--再聊Nginx访问权限管理

    接上回,Nginx访问权限管理 low address bits of 192.168.101.0/16 are meaningless in /usr/local/nginx/conf/nginx. ...

  5. 关于nginx集合fastdfs时http请求无法访问,nginx的权限问题。

    关于nginx集合fastdfs时http请求无法访问.nginx的权限问题 具体安装步骤请参考 https://www.cnblogs.com/yufeng218/p/8111961.html 非常 ...

  6. linux nginx启动用户权限,普通用户启动nginx

    众所周知,linux 0-1024 端口是不允许非root权限用户占用的. 但是在linux中,因为安全问题,root用户禁止登陆服务器,而且又不给普通用户 sudo权限 这种情况下 nginx既要可 ...

  7. linux网站权限怎么设置好,linux网站权限设置方法,网站安全配置,linux网站权限...

    目的:为了保证网站不遭受木马入侵上传及修改文件. 相对安全的权限: 1.站点内所有目录和文件的用户和组都应该是root 2.所有目录权限默认的755 3.所有文件权限默认的644 (不能改文件) 1+ ...

  8. 计算机如何授权访问局域网,局域网权限怎么设置?局域网访问权限设置软件哪个好...

    当前,很多企事业单位的局域网都配置了文件服务器,用于共享单位的一些文件供局域网用户访问.同时,员工工作当中形成的劳动成果.重要文件等也常常存储在文件服务器上,便于文件保存.协同工作等需要.这使得,企业 ...

  9. win7系统ftp服务器共享文件夹权限,win7 ftp服务器 文件夹权限

    win7 ftp服务器 文件夹权限 内容精选 换一换 本课程主要针对openEuler操作系统工程师在基础运维工作,以文件共享服务器的搭建和运维为案例,讲解openEuler操作系统的基础知识,并培养 ...

最新文章

  1. 坐标架内转换到坐标架外的公式
  2. 使用python制作神经网络——搭建框架
  3. matlab 连接mysql数据库_【转】matlab 连接 mysql 数据库
  4. 机器学习-算法背后的理论与优化(part7)--随机梯度下降法概述
  5. Python操作Excel删除一个Sheet
  6. 充一次电使用一年的手机_超级手机电池:充一次电用一年多?
  7. 突发:Maze 勒索团伙公开 LG 和 Xerox 的内部数据,达数十GB
  8. javafx button按钮分组突出选中按钮(ToggleButton)
  9. http的rest服务简介_REST概念简介
  10. Excel Mrp生产计划工具
  11. 学 C++ ,能不能简单点?
  12. 学Java是自学还是报培训班好?
  13. mysql重复写入_MYSQL避免重复插入记录的三种方法
  14. 利用copy命令合成一个图片马使用
  15. .netcore向写es日志报错Elasticsearch.Net.UnexpectedElasticsearchClientException:expected:‘{‘,actual:‘<‘
  16. 仿猫眼官网静态页面(纯HTML)
  17. 想成为管理者必须会讲的68个超级经典小故事
  18. h5跨域访问图片_网页保存为图片及高清截图的优化 | canvas跨域图片配置
  19. 计算机本地连接 协议4打不开,本地连接属性:Internet协议版本4(TCP/IPv4)打开闪退解决办法...
  20. PyCharm打包py文件为exe文件

热门文章

  1. vim编辑器常用命令总结
  2. 按钮交互loading ---- 转圈圈 加载
  3. 180118 有趣的人工智能对话小程序
  4. 论文笔记 Aggregated Residual Transformations for Deep Neural Networks
  5. PAT甲题题解-1011. World Cup Betting (20)-误导人的水题。。。
  6. 微信开发学习日记(六):weiphp框架
  7. leetcode 8: 字符串转整数(atoi)
  8. sort,uniq,wc指令简单用法
  9. 【Ext.Net学习笔记】01:在ASP.NET WebForm中使用Ext.Net
  10. 不再单打独斗?中国移动联合多企业组建医疗数据公司