使用OpenResty实现流控
OpenResty简介
OpenResty是一种基于Nginx并且使用C语言开发的、同时使用Lua作为用户语言的Web平台。如果把Nginx比作Linux内核,那么OpenResty则可以看做是一种Liunx的发行版,其对原有的Nginx做了很大的补充与扩展,使得我们可以在Nginx中编写并执行Lua脚本。Open表示开源的,而Resty则代表了restful的接口风格。
OpenResty环境搭建
创建openresty用户
useradd openresty
安装openresty(其它环境的安装方法)
sudo yum-config-manager --add-repo https://openresty.org/yum/cn/centos/OpenResty.repo
sudo yum install openresty
创建文件夹openresty-test,并根据以下的目录结构创建文件夹以及相应的文件
$ tree openresty-test/
openresty-test/
├── conf
│ └── nginx.conf
├── logs
│ ├── access.log
│ └── error.log
└── lua
└── nginx.lua
openresty-test文件夹应属于openresty用户,如果不是使用如下命令进行修改
chown -R openresty:openresty openresty-test
修改nginx.conf如下
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
server {
listen 6699;
location / {
default_type text/html;
# 关闭lua缓存,只能用于方便调试,修改lua文件后nginx不需要重新reload
lua_code_cache off;
# 引入Lua脚本文件
content_by_lua_file lua/nginx.lua;
}
}
}
以上内容设置完毕之后,启动openresty
openresty -p openresty-test
如果需要重新加载配置文件
openresty -p openresty-test -s reload
编写限流脚本
在nginx.conf中我们把 lua/nginx.lua
引入到了配置中,接下来我们开始书写Lua代码。
我们的限流使用了Redis来帮助实现,具体代码如下
1 | -- 修改content-type |
限流的原理非常简单,客户端每请求一次就会给计数器加1,如果计数器达到5那么服务端就会告知访问频率到达限制。计数器每10秒钟重置一次,这意味着每个IP在10秒钟内最多请求5次。
总结
其实Nginx的限流是可以通过配置直接实现的,不需要这么复杂,我举这么个例子就是想描述一下OpenResty的工作方式。在Lua中我们除了可以访问Nginx和Redis的模块,还有很多其它的模块OpenResty也已经为我们提供好了,下面就是这样的一个列表,更详细的信息可以在OpenResty的官网中查到
- lua-resty-memcached
- lua-resty-mysql
- lua-resty-redis
- lua-resty-dns
- lua-resty-upload
- lua-resty-websocket
- lua-resty-lock
- lua-resty-logger-socket
- lua-resty-lrucache
- lua-resty-string
- ngx_memc
- ngx_postgres
- ngx_redis2
- ngx_redis
- ngx_proxy
- ngx_fastcgi
参考
OpenResty 最佳实践
https://github.com/openresty/lua-nginx-module
OpenResty + Lua + Redis 实现 IP 限流
在 Nginx 使用 Lua 扩展功能