我们的一个生产 magento 2.4.5 网站经常出现宕机问题,我们详细检查了该案例,我们可以看到我们从元外部代理收到了过多的爬虫请求。 请参阅下面的示例日志条目。
57.141.0.9 - - [xx/Dec/2024:12:xx:09 +0530] "GET /our-xxxxxxxxxs/ms-xxx?karat=23&size=6%2C7%2C13%2C16%2C17%2C18%2C24 HTTP/1.1" 200 780515 "-" "meta-externalagent/1.1 (+https://developers.facebook.com/docs/sharing/webmasters/crawler
进一步检查时,我可以从日志中看到我们在 12 小时内收到了来自“meta-externalagent/1.1”的“64941”请求。
我可以看到很多人都面临类似的问题,但没有提到 magento 2.4.5 版本的明确解决方案。
来自 facebookexternalhit bot 的流量过多
https://developers.facebook.com/community/threads/992798532416685/
我们是否可以对元爬虫进行一些速率限制?由于我们正在做Facebook广告,所以我们无法完全阻止来自元外部代理的请求。
目前我已经在 nginx 中使用 7G 防火墙阻止了元外部代理。
您可以使用 nginx 内置的速率限制功能来限制此机器人的速率。根据 “Meta Web Crawlers” Facebook 文章,该机器人的
User-Agent
HTTP 标头可以是
meta-externalagent/1.1 (+https://developers.facebook.com/docs/sharing/webmasters/crawler)
或
meta-externalagent/1.1
但是,由于本文可能不会列出所有可能的
User-Agent
值,因此您应该检查 nginx 访问日志以确定。
要限制来自此机器人的请求,您可以将以下代码段添加到您的 nginx 配置中:
map $http_user_agent $meta_crawler {
"meta-externalagent/1.1 (+https://developers.facebook.com/docs/sharing/webmasters/crawler)" 1;
"meta-externalagent/1.1" 1;
}
# Limit meta crawler to 30 requests per minute; adjust according to your needs
limit_req_zone $meta_crawler zone=meta:10m rate=30r/m;
server {
# your magento server section
limit_req zone=meta burst=5 nodelay;
limit_req_status 429;
... # the rest of your nginx configuration
}
建议在 HTTP 429 响应中包含
Retry-After
HTTP 标头;您可以按如下方式进行:
server {
limit_req zone=meta burst=5 nodelay;
limit_req_status 429;
error_page 429 @err429;
location @err429 {
add_header Retry-After 30 always;
return 429;
}
... # the rest of your nginx configuration
}
虽然您可以在
map
块中使用正则表达式,例如:
map $http_user_agent $meta_crawler {
"~^meta-externalagent/" 1;
}
出于性能考虑,我不建议这样做(有关详细信息,请阅读this nginx 支持论坛帖子)。