一、问题情况
因为业务和安全防御上的需求,可能会遇到需要会对IP进行小时或者天的统计周期进行访问控制,但是nginx自带的limit模块只能使用秒和分作为统计周期,即r/s和r/m,开始我以为nginx会用r/h和r/d来进行小时和天limit的周期控制,结果配置报错.尝试写成r/60m也不行.然后就查了资料发现可以修改nginx源码后编译实现.如果你已经使用lua模块就没必要使用这种方法了.
二、解决方法
首先解压nginx源码包,然后找到模块文件进行修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
cd /nginx源码包目录 vim ./src/http/modules/ngx_http_limit_req_module.c 大概825行的地方 if (ngx_strncmp(p, "r/s", 3) == 0) { scale = 1; len -= 3; } else if (ngx_strncmp(p, "r/m", 3) == 0) { scale = 60; len -= 3; } 改成 if (ngx_strncmp(p, "r/s", 3) == 0) { scale = 1; len -= 3; } else if (ngx_strncmp(p, "r/m", 3) == 0) { scale = 60; len -= 3; } else if (ngx_strncmp(p, "r/h", 3) == 0) { scale = 3600; len -= 3; } else if (ngx_strncmp(p, "r/d", 3) == 0) { scale = 86400; len -= 3; } |
修改前
nginx.conf
1 |
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/h; |
检测报错
1 2 3 |
nginx -t nginx: [emerg] invalid rate "rate=1r/h" in /usr/local/nginx/conf/nginx.conf:62 nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed |
修改后重新编译nginx
1 2 3 |
nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful |
进行测试也一切OK,目的达到.