一、概述

需求:所有访问/webapi/**的请求必须是POST请求,而且根据请求参数过滤不符合规则的非法请求(黑名单), 这些请求一律不转发到后端服务器(Tomcat)
实现思路:通过在Nginx上进行访问限制,通过Lua来灵活实现业务需求,而Redis用于存储黑名单列表。

二、具体实现

1.lua代码
本例中限制规则包括(post请求,ip地址黑名单,请求参数中imsi,tel值和黑名单)

[root@git-server ~]# cat /usr/local/nginx/conf/lua/ipblacklist.lua
ngx.req.read_body()local redis = require "resty.redis"
local red = redis.new()
red.connect(red, '127.0.0.1', '6379')local myIP = ngx.req.get_headers()["X-Real-IP"]
if myIP == nil thenmyIP = ngx.req.get_headers()["x_forwarded_for"]
end
if myIP == nil thenmyIP = ngx.var.remote_addr
endif ngx.re.match(ngx.var.uri,"^(/webapi/).*$") thenlocal method = ngx.var.request_methodif method == 'POST' thenlocal args = ngx.req.get_post_args()local hasIP = red:sismember('black.ip',myIP)local hasIMSI = red:sismember('black.imsi',args.imsi)local hasTEL = red:sismember('black.tel',args.tel)if hasIP==1 or hasIMSI==1 or hasTEL==1 then--ngx.say("This is 'Black List' request")ngx.exit(ngx.HTTP_FORBIDDEN)endelse--ngx.say("This is 'POST' request")ngx.exit(ngx.HTTP_FORBIDDEN)endend

2.nginx.conf

location / {
root html;
index index.html index.htm;access_by_lua_file /usr/local/nginx/conf/lua/ipblacklist.lua;proxy_pass http://127.0.0.1:8080;
client_max_body_size 1m;
}

3.添加黑名单规则数据

#redis-cli sadd black.ip '153.34.118.50'
#redis-cli sadd black.imsi '460123456789'
#redis-cli sadd black.tel '15888888888'

可以通过redis-cli smembers black.imsi 查看列表明细

4.验证结果

[root@git-server ~]# curl -d "imsi=460123456789&tel=15800000000" "http://www.kjios.com/myapi/111"
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

转载于:https://blog.51cto.com/wujianwei/2125305

nginx+lua+redis实现post请求接口之黑名单(一)相关推荐

  1. Nginx+Lua+Redis 对请求进行限制

    Nginx+Lua+Redis 对请求进行限制 一.概述 需求:所有访问/myapi/**的请求必须是POST请求,而且根据请求参数过滤不符合规则的非法请求(黑名单), 这些请求一律不转发到后端服务器 ...

  2. nginx lua redis 访问频率限制(转)

    1. 需求分析 Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等. 用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的 ...

  3. nginx+lua+redis 灰度发布实现方案

    背景: 公司要把现有的某传统项目进行微服务化,拆分后要分批次预发布,实现某部分使用户使用微服务模块,其他用户使用传统项目.待微服务稳定.无bug后全部用户迁移至微服务系统. 以上为背景,实现此方案使用 ...

  4. 利用nginx+lua+redis实现反向代理方法教程

    这篇文章主要给大家介绍了利用nginx+lua+redis实现反向代理方法教程,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧. 前言 最近因为工作需要,要进行IVR的 ...

  5. nginx+lua+redis实现降级

    前言 商城或web站点的用户访问量出乎意料地增加了很多,超出了系统的负载能力, 系统有些扛不住,继而导致注 册,下单,支付什么的全部在绕圈卡住,继而导致公司业务损失了不少用户和订单.. 一.引子 面对 ...

  6. nginx+lua+redis deny ip

    2019独角兽企业重金招聘Python工程师标准>>> nginx+lua+redis实现ip黑名单 1.安装LuaJIT LuaJIT LuaJIT即采用C语言写的Lua代码的解释 ...

  7. windows下nginx+lua+redis实现短域名服务

    nginx+lua+redis 环境搭建: 我使用的是大牛 ZhangYichun 提供的集成包快速安装. 非常简单,下载 ngx_openresty,该集成包中有:Nginx,Lua或Luajit, ...

  8. Nginx+Lua+Redis实现广告缓存

    1.需求分析 需要在页面上显示广告的信息. 2.OpenResty 2.1.OpenResty介绍 OpenResty(又称:ngx_openresty) 是一个基于 NGINX 的可伸缩的 Web ...

  9. Nginx+ lua实现http转发请求

    最近要使用nginx+lua实现 一个需求: 在nginx的location部分,请求时,判断用户是否为会员,如果是会员,则跳转到a页面,否则跳转到b页面. 用户服务是一个单独的服务,具体lua脚本实 ...

最新文章

  1. 程序员持续成长,需要持久而痛苦的学习
  2. 2018-3-12论文(非结构网络中有价值信息数据挖掘)笔记二-----作者:关联规则的非结构网络有价值信息数据挖掘(看不懂,看不懂)
  3. MySQL第2天:MySQL的架构介绍之MySQL介绍
  4. JavaScript技术篇 - js的null值判断,js的undefined的判断,js的null与undefined的2种区分方法
  5. 历史上最简单的一道Java面试题,但无人能通过
  6. cocos2d-x 帧动画
  7. 二维码识别中面临的主要问题
  8. 广域网协议之PPP,HDLC
  9. Activiti CamelTask(骆驼任务)
  10. OpenGL ES glad 下载和使用
  11. python 学习目录
  12. 计算机硬件维护注意事项,电脑硬件日常维护和注意事项
  13. 终极解决maya渲染层丢材质,变线框等问题
  14. Matlab之min()、max()函数(求最小、最大值)
  15. log4j2日志配置颜色
  16. 字节跳动薪酬体系最全揭晓|看完我是真酸了,不服不行
  17. 分享一款光彩四射的CSS3按钮集合
  18. SpringBoot18:集成SpringSecurity
  19. 什么是gnuplot
  20. 百度地图API——修改infowindow样式

热门文章

  1. Oracle中的左连接与右连接
  2. 现有系统如何集成Consul服务发现
  3. 微软正式发布PowerShell Core 6.0
  4. 代码之美~利用构造方法实现模块的解耦
  5. 美团HD(7)-添加取消搜索按钮
  6. GNUstep 运行gui程序
  7. EF调用执行Oracle中序列
  8. Ganglia 和 Nagios,第 2 部分: 使用 Nagios 监视企业集群
  9. fgets()逐行读取文件内容
  10. Hive(三)——数据定义