如何在nginx.conf中使用ngx_http_keyval_module的keyval?是否需导入模块?
使用ngx_http_keyval_module实现IP黑名单的完整指南
我来帮你一步步搞定这个配置,先从模块的安装确认说起,再到具体的配置写法:
一、先确认模块是否需要额外安装
ngx_http_keyval_module并不是Nginx默认编译的核心模块,所以你得先检查它有没有在你的Nginx里启用:
- 跑一下命令
nginx -V,看看输出的编译参数里有没有--with-http_keyval_module。如果有,那直接用就行;如果没有,你有两个选择:- 重新编译Nginx,编译时加上
--with-http_keyval_module参数; - 如果你用的是Debian/Ubuntu这类发行版,可以直接装
nginx-extras包,这个包默认包含了这个模块。
- 重新编译Nginx,编译时加上
二、配置keyval指令实现IP黑名单
结合你给出的配置片段,我调整成适合IP黑名单的写法,注释里会讲清楚每个部分的作用:
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # 定义一个名为ip_blacklist的内存区域,分配1MB空间(足够存几千条IP) # state参数指定的文件用来持久化规则,重启Nginx也不会丢 keyval_zone zone=ip_blacklist:1m state=/var/lib/nginx/ip_blacklist.keyval; # 将客户端IP($remote_addr)作为查询key,匹配到的结果存在$is_blacklisted变量里 keyval $remote_addr $is_blacklisted zone=ip_blacklist; server { listen 8080; server_name localhost; # 拦截逻辑:如果匹配到的value是"block",直接返回403禁止访问 if ($is_blacklisted = "block") { return 403; } # 你的其他业务配置 location / { root html; index index.html index.htm; } } }
三、如何管理黑名单规则
因为我们加了state参数,你可以直接编辑指定的ip_blacklist.keyval文件来添加或删除黑名单IP,格式是每行一个键值对:
192.168.1.100 block 10.0.0.5 block # 注释用#开头,不会生效
修改完文件后,不用重启Nginx,只需要执行 nginx -s reload 就能让新规则立刻生效。
一些额外的小提示
- 如果不需要规则持久化,把
state=/var/lib/nginx/ip_blacklist.keyval这部分删掉就行,不过重启Nginx后规则会清空; keyval_zone后面的1m是内存大小,要是你的黑名单IP特别多,可以调大一点,比如10m;- Nginx的
if指令在server块里尽量只做简单的相等判断,复杂逻辑容易出问题,这里的场景完全没问题。
内容的提问来源于stack exchange,提问作者sunder
相关产品推荐
相关产品推荐

