我们的服务器被 HEAD 请求淹没了。
这导致 tcp 连接激增,导致服务器无法连接到其 mysql 数据库。
我们广泛使用了 nginx 速率限制,它与 fail2ban 完美结合,适用于任何 GET 和 POST 请求。但是,似乎没有收到 HEAD 请求。
我们使用的 fail2ban filter.d 操作nginx-limit-req
似乎是一个股票配置,用于检测何时达到 nginx 区域限制。
由于我们的 webapp 不需要 HEAD 请求,我们有两个选择(除了手动禁止单个 IP 地址)
- 有没有办法禁用 HEAD 请求?这似乎是气馁,但它可能仍然吗?
- 是否可以让 nginx 区域限制器识别任何 GET/POST/HEAD 请求并相应地限制它?
nginx.conf:
http {
...
limit_req_zone "$http_x_forwarded_for" zone=web_zone:50m rate=2r/s;
...
}
server {
...
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
location / {
limit_req zone=web_zone burst=25;
try_files $uri $uri/ @pretty-urls;
}
...
}
监狱.conf:
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
action = custom-iptables-proxy
port = http,https
logpath = /var/log/nginx/*error*.log
findtime = 10
bantime = 3600
maxretry = 3
nginx-limit-req.conf:
[Definition]
ngx_limit_req_zones = [^"]+
failregex = ^\s*\[[a-z]+\] \d+#\d+: \*\d+ limiting requests, excess: [\d\.]+ by zone "(?:%(ngx_limit_req_zones)s)", client: <HOST>,
ignoreregex =
datepattern = {^LN-BEG}
事件期间的netdata,违规者ip被封禁后正常化:
要在 Nginx 配置中禁用 HEAD 请求,只需将以下内容添加到您的服务器块中:
444 HTTP 状态码是 Nginx 特有的,会丢弃所有 HEAD 请求,因此客户端发起 HEAD 请求的连接失败。这些尝试的连接仍会记录在 Nginx 日志中,因此您可以在防火墙配置中禁止相关 IP。