跳转至

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 日。


用于通过反向/正向 DNS 查询验证搜索引擎机器人身份的 NGINX 模块。

此模块通过执行各搜索提供商推荐的 DNS 验证方法来验证声称是搜索引擎爬虫(Google、Bing、Yahoo、Baidu、Yandex)的请求方。它可以防止恶意行为者通过伪造机器人 User-Agent 字符串来绕过安全措施。

它是 Aaron Bedra 开发的原始 ngx_bot_verifier 的直接替代品。

功能特性

  • 反向/正向 DNS 验证,遵循搜索引擎提供商指南
  • 异步 DNS 解析,使用 NGINX 内置解析器(非阻塞)
  • Redis 缓存,带连接池,以最小化 DNS 查询开销
  • 可配置提供商 - 在默认提供商之外添加自定义机器人提供商
  • 故障开放设计 - 验证错误时允许请求通过,以避免阻塞合法流量
  • 真实 IP 支持,通过 ngx_http_realip_module 适用于代理后方的部署

支持的提供商

内置提供商

提供商 已验证域名
Google 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 {
    # Required: Configure realip module to trust your upstream proxies
    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;

    # Required: Configure resolver for non-blocking DNS lookups
    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;

            # Optional: Add custom providers
            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 响应不会影响其他请求

验证流程:

  1. 对客户端 IP 进行反向 DNS 查询(PTR 记录)
  2. 验证解析出的主机名以已知提供商域名结尾
  3. 进行正向 DNS 查询(A 记录)以确认 IP 匹配
  4. 将结果缓存到 Redis 中