Windows 环境下nginx 静态资源服务器(图片,文件)权限控制(nginx/openresty/lua)
前言
1
同nginx配置server以后,我们可以很方便的直接访问到文件服务器上的文件资源,但是某些情况下,文件资源可能是隐私图片,比如客户注册时上传的身份证照片等等,这时候我们需要对图片访问进行控制,必须登录后才能查看到这些隐私图片。
2
一般来说,我们都是通过后端controller对权限进行控制,但是nginx作为图片服务器的情况下,再专门为此写一个后端程序显然比较笨重。所以根据实际情况,我们采用openresty平台,用lua脚本+redis读取token的方式即可完成对图片访问服务器的权限控制。
步骤
1.服务器文件目录设置
正常来说我们的文件存放目录是统一的,但是由于有些文件是开放访问的,比如网页图片,有的文件是隐私的,比如注册信息。所以此时我们将文件服务器目录修改为两个文件夹,public和private,public用以存放开发文件,private存放登陆后才可以访问的文件。
2.openresty下载
进入官网下载页:http://openresty.org/en/download.html
选择windows版本的压缩包进行下载
将压缩包解压到本地目录,openresty是nginx和lua的结合,此时我们编写lua脚本并修改nginx.conf,测试openresty。
在openresty目录下的lua文件夹下新建txt文件,
ngx.say('hello lua!!!')
然后重命名txt为hello.lua
如图所示
然后在penresty目录下的conf文件夹下,修改nginx.conf
server { listen 9000; server_name localhost;location / {default_type 'text/html';rewrite_by_lua_file lua/hello.lua;}}
修改完成后,启动openresty下的nginx.exe
然后通过cmd运行
./nginx -s reload
启动nginx
然后浏览器键入 http://127.0.0.1:9000/ 如图所示即为成功
3 配置nignx权限控制
#反向代理进入文件查询服务器upstream download{server 127.0.0.1:8282;} server { listen 8282; server_name localhost;location /file_resources/private/ { alias D:/society/file_resources/private/; }} server { listen 8082; server_name localhost; client_max_body_size 10000m; location / { index index.html; } #开放文件,直接进入文件目录查找location /file_resources/public/ { alias D:/society/file_resources/public/; }#隐私文件,匹配下载请求前缀,进入token.lua, 进行token鉴权,location /file_resources/private/ {default_type 'text/html';rewrite_by_lua_file lua/token.lua;proxy_pass http://download;}}
4. token.lua编写
该处获取请求的token为get请求参数获取
如为cookie中, ngx.var.arg_token改为 ngx.var.cookie_token即可
-- 从cookie中获取token值key为token)local token = ngx.var.arg_token--判断token是否为空,为空返回登录if not token then ngx.redirect("http://127.0.0.1:8086/login", 302)--判断token存在,则根据redis存储格式拼写Token, “..”为字符串拼接else token = "prefix_user_token_" .. ngx.var.arg_tokenendlocal function close_redis(red) if not red then return end local pool_max_idle_time = 30000 --毫秒 local pool_size = 50 --连接池大小 local ok, err = red:set_keepalive(pool_max_idle_time, pool_size) if not ok then ngx.say("close redis error : ",err); endend-- 连接redislocal redis = require "resty.redis";local red = redis:new();red:set_timeout(2000)local ok,err = red:connect("192.168.0.28", 6379)if not ok then ngx.say("failed to connect: ", err)end-- 根据自身redis是否有密码开启本部分--local res, err = red:auth("password")--if not res then-- ngx.say("failed to authenticate: ", err)--end-- redis中若 key 存在返回 1 ,否则返回 0 。local resp, err = red:exists(token) if not resp then ngx.say("get msg error : ", err) return close_redis(red) end if resp == ngx.null then resp = '' end if resp == 0 then-- ngx.exit(ngx.HTTP_FORBIDDEN) ngx.redirect("http://127.0.0.1:8086/login", 302)endclose_redis(red)
完成后 执行 nginx -s reload重启nginx即可
5.结果展示
开开放图片
隐私图片访问失败
如图通过开发工具可以看到访问的是图片地址,由于token为空,所以直接转转到了login页面
隐私图片访问成功
带上token,访问成功
来源地址:https://blog.csdn.net/MyBurden/article/details/129401537