跳转至

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 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 响应不会影响其他请求

验证流程:

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

GitHub

您可以在 nginx-module-bot-verifier 的 GitHub 仓库 中找到此模块的其他配置提示和文档。