bot-verifier: NGINX 的搜索引擎机器人验证模块
安装
您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:
- RedHat Enterprise Linux 7, 8, 9 和 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-bot-verifier
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-bot-verifier
通过在 /etc/nginx/nginx.conf 顶部添加以下内容来启用模块:
load_module modules/ngx_http_bot_verifier_module.so;
本文档描述了 nginx-module-bot-verifier v0.0.17,于 2026 年 2 月 6 日发布。
NGINX 模块用于通过反向/正向 DNS 查找验证搜索引擎机器人身份。
该模块通过执行每个搜索提供商推荐的 DNS 验证方法,验证声称为搜索引擎爬虫(Google、Bing、Yahoo、Baidu、Yandex)的行为者。它防止恶意行为者通过伪造机器人 User-Agent 字符串来绕过安全措施。
这是 Aaron Bedra 原始 ngx_bot_verifier 的替代模块。
特性
- 反向/正向 DNS 验证,遵循搜索引擎提供商的指南
- 异步 DNS 解析,使用 NGINX 内置解析器(非阻塞)
- Redis 缓存,使用连接池以最小化 DNS 查找开销
- 可配置提供商 - 添加自定义机器人提供商,超出默认设置
- 容错设计 - 验证错误允许请求通过,以避免阻塞合法流量
- 真实 IP 支持,通过
ngx_http_realip_module支持在代理后面的部署
支持的提供商
内置提供商
| 提供商 | 验证域名 |
|---|---|
google.com, googlebot.com |
|
| Bing | search.msn.com |
| Yahoo | yahoo.com |
| Baidu | crawl.baidu.com |
| Yandex | yandex.com, yandex.net, yandex.ru |
自定义提供商
使用 bot_verifier_provider 指令添加自定义提供商:
bot_verifier_provider facebook .facebook.com .fbcdn.net;
bot_verifier_provider apple .applebot.apple.com;
自定义提供商在内置提供商之外进行验证。
概要
http {
# 必需:配置 realip 模块以信任您的上游代理
set_real_ip_from 10.0.0.0/8;
set_real_ip_from 172.16.0.0/12;
set_real_ip_from 192.168.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
# 必需:配置解析器以进行非阻塞 DNS 查找
resolver 8.8.8.8 8.8.4.4 valid=300s ipv6=off;
resolver_timeout 5s;
server {
location / {
bot_verifier on;
bot_verifier_redis_host localhost;
bot_verifier_redis_port 6379;
bot_verifier_redis_expiry 3600;
# 可选:添加自定义提供商
bot_verifier_provider applebot .applebot.apple.com;
}
}
}
指令
bot_verifier
语法: bot_verifier on|off;
默认值: off
上下文: http, server, location
启用或禁用机器人验证。当启用时,具有匹配已知机器人模式的 User-Agent 字符串的请求将通过 DNS 查找进行验证。
bot_verifier_provider
语法: bot_verifier_provider <name> <domain1> [domain2] ...;
默认值: 无
上下文: http, server, location
添加自定义机器人提供商进行验证。name 与 User-Agent 字符串匹配(不区分大小写)。域用于验证反向 DNS 查找结果。
示例:
bot_verifier_provider facebook .facebook.com .fbcdn.net;
bot_verifier_provider apple .applebot.apple.com;
bot_verifier_provider duckduckgo .duckduckgo.com;
自定义提供商在内置提供商(Google、Bing、Yahoo、Baidu、Yandex)之外进行检查。
bot_verifier_redis_host
语法: bot_verifier_redis_host <hostname>;
默认值: localhost
上下文: http, server, location
用于缓存验证结果的 Redis 服务器主机名。
bot_verifier_redis_port
语法: bot_verifier_redis_port <port>;
默认值: 6379
上下文: http, server, location
Redis 服务器端口。
bot_verifier_redis_connection_timeout
语法: bot_verifier_redis_connection_timeout <milliseconds>;
默认值: 10
上下文: http, server, location
建立 Redis 连接的超时时间。
bot_verifier_redis_read_timeout
语法: bot_verifier_redis_read_timeout <milliseconds>;
默认值: 10
上下文: http, server, location
Redis 读取操作的超时时间。
bot_verifier_redis_expiry
语法: bot_verifier_redis_expiry <seconds>;
默认值: 3600
上下文: http, server, location
缓存验证结果的 TTL。过期后,来自同一 IP 的下一个请求将触发新的 DNS 验证。
bot_verifier_redis_database
语法: bot_verifier_redis_database <number>;
默认值: 0
上下文: http, server, location
用于存储验证结果的 Redis 数据库编号。
bot_verifier_redis_password
语法: bot_verifier_redis_password <password>;
默认值: 空
上下文: http, server, location
Redis 认证的密码。如果 Redis 不需要认证,请留空。
异步 DNS 解析
当配置 NGINX resolver 指令时,模块使用 NGINX 的内置解析器异步执行 DNS 查找。这是生产环境推荐的配置:
- 非阻塞 - DNS 查找不会阻塞 NGINX 工作进程
- 可扩展 - 处理高流量而不会出现因 DNS 引起的延迟峰值
- 优雅超时 - 慢速 DNS 响应不会影响其他请求
验证流程:
- 对客户端 IP 进行反向 DNS 查找(PTR 记录)
- 验证解析的主机名是否以已知提供商域名结尾
- 进行正向 DNS 查找(A 记录)以确认 IP 匹配
- 将结果缓存到 Redis
GitHub
您可以在 nginx-module-bot-verifier 的 GitHub 仓库 中找到此模块的其他配置提示和文档。