文档章节

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

epiclight
 epiclight
发布于 2015/06/07 10:37
字数 379
阅读 74
收藏 1

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

 

一、概述

需求:所有访问/myapi/**的请求必须是POST请求,而且根据请求参数过滤不符合规则的非法请求(黑名单), 这些请求一律不转发到后端服务器(Tomcat)

实现思路:通过在Nginx上进行访问限制,通过Lua来灵活实现业务需求,而Redis用于存储黑名单列表。

相关nginx上lua或redis的使用方式可以参考我之前写的一篇文章:

openresty(nginx)、lua、drizzle调研 http://www.cnblogs.com/huligong1234/p/4007103.html

 

二、具体实现

1.lua代码

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

复制代码

 1 -- access_by_lua_file '/usr/local/lua_test/my_access_limit.lua'; 2 ngx.req.read_body() 3  4 local redis = require "resty.redis" 5 local red = redis.new() 6 red.connect(red, '127.0.0.1', '6379') 7  8 local myIP = ngx.req.get_headers()["X-Real-IP"] 9 if myIP == nil then10    myIP = ngx.req.get_headers()["x_forwarded_for"]11 end12 if myIP == nil then13    myIP = ngx.var.remote_addr14 end15         16 if ngx.re.match(ngx.var.uri,"^(/myapi/).*$") then17     local method = ngx.var.request_method18     if method == 'POST' then19         local args = ngx.req.get_post_args()20         21         local hasIP = red:sismember('black.ip',myIP)22         local hasIMSI = red:sismember('black.imsi',args.imsi)23         local hasTEL = red:sismember('black.tel',args.tel)24         if hasIP==1 or hasIMSI==1 or hasTEL==1 then25             --ngx.say("This is 'Black List' request")26             ngx.exit(ngx.HTTP_FORBIDDEN)27         end28     else29         --ngx.say("This is 'GET' request")30         ngx.exit(ngx.HTTP_FORBIDDEN)31     end32 end

复制代码

 

2.nginx.conf

location / {
root html;
index index.html index.htm;

access_by_lua_file /usr/local/lua_test/my_access_limit.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.验证结果

#curl -d "imsi=460123456789&tel=15800000000" "http://www.mysite.com/myapi/abc"


本文转载自:http://www.cnblogs.com/huligong1234/p/4163832.html

上一篇: ngx_lua 内幕
epiclight
粉丝 3
博文 41
码字总数 79
作品 0
深圳
架构师
私信 提问
【Nginx探究系列三】nginx+lua+redis构建高并发应用

1.nginx+lua+redis构建高并发应用 https://www.ttlsa.com/nginx/nginx-lua-redis/ 2. nginx+lua+redis自动识别封解禁频繁访问IP: http://outofmemory.cn/code-snippet/35653/nginx-lua-red......

开源中国首席撸码官
2016/03/14
247
0
通过 lua 进行 nginx redis 访问控制

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

zzc052
2018/06/29
0
0
Nginx 通过 Lua + Redis 实现动态封禁 IP

1。背景 为了禁止一些爬虫或恶意用户请求的服务器,我们需要创建一个动态IP黑名单。对于黑名单内的IP,拒绝提供服务。 两。建筑 实现IP黑名单的方法有很多种。 1,在操作系统层面,配置iptab...

小致dad
2018/04/18
0
0
Nginx学习之九:实践学习指南

Nginx基础 1. nginx安装 2. nginx 编译参数详解 3. nginx安装配置+清缓存模块安装 4. nginx+PHP 5.5 5. nginx配置虚拟主机 6. nginx location配置 7. nginx root&alias文件路径配置 8. ngxht...

boonya
2014/07/09
0
0
Nginx+Lua+Redis连接池

上篇介绍了如果使用Lua访问Redis,但是每次都是重新创建一个连接到Redis,其实更好的方法是使用Redis连接池。 如果创建Redis连接池呢?原理是用Nginx的Upstream来实现,在Nginx启动时就可以创...

醉人的笑容你有没有
2016/04/19
3.1K
2

没有更多内容

加载失败,请刷新页面

加载更多

数据科学热潮下的冷思考:什么才是最需要的技能?

全文共3087字,预计学习时长6分钟 图片来源:pexels.com/@freestocks 数据科学已经进入了稳定生产的成熟期,数据科学家所需的技能也在与时俱进。不仅是追求更高效的机器学习模型,在当下,推...

读芯术
17分钟前
0
0
48.Nginx访问日志 日志切割 静态文件不记录

12.10 Nginx访问日志 12.11 Nginx日志切割 12.12 静态文件不记录日志和过期时间 12.10 Nginx访问日志: ~1.日志格式 vim /usr/local/nginx/conf/nginx.conf //搜索log_format log_format com...

oschina130111
22分钟前
1
0
好程序员分享Css详解bem书写规范

  好程序员分享Css详解bem书写规范,bem是基于组件的web开发方法。其思想是将用户界面分隔为独立的块,从而使开发复杂的UI界面变得更简单和快,且不需要粘贴复制便可复用现有代码。BEM由B...

好程序员IT
27分钟前
0
0
基于cm+cdh搭建大数据集群

第一部分:搭建基本环境 1、网络配置 vim /etc/sysconfig/network-scripts/ifcfg-ens32 service network restart vim /etc/hosts 192.168.15.121 node1 192.168.15.122 node2 192.168.15.123......

一个点一个点
35分钟前
0
0
[学]ngin反向代理搭建与配置

Nginx安装地址:https://www.cnblogs.com/wyd168/p/6636529.html (linux) 必须安装的4个包: nginx-1.1.10.tar.gz openssl-1.0.1t.tar.gz pcre-8.39.tar.gz zlib-1.2.11.tar.gz ng配置主要......

覃光林
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部