
先说结论:面对大量恶意请求,建议直接关闭连接(444)(也就是直接切断链接不返回任何内容)
我们先逐个分析200、404、403、500、502、503、444不同的返回响应有哪些区别。
| 状态码 | 类型 | 是否占用服务器资源 | 核心原因简述 |
|---|---|---|---|
| 200(正常返回) | 正常 | 极大 | 消耗资源最多。服务器不仅需要处理请求,还可能执行后端程序、查询数据库,最后返回一个完整的“正常”页面内容,极大浪费资源。 |
| 404 Not Found | 客户端错误 (4xx) | 是,消耗较少 | 服务器找不到请求的资源(如页面、图片) |
| 403 Forbidden | 客户端错误 (4xx) | 是,消耗较少 | 服务器理解请求,但拒绝授权访问 |
| 500 Internal Server Error | 服务器错误 (5xx) | 是,消耗很大 | 服务器内部处理请求时发生意外错误 |
| 502 Bad Gateway | 服务器错误 (5xx) | 是 | 作为网关的服务器从上游服务器收到了无效响应 |
| 503 Service Unavailable | 服务器错误 (5xx) | 是,但会主动拒绝请求以节省资源 | 服务器暂时无法处理请求(如服务器过载或维护中) |
| 444 (连接关闭) | (非标准码,Nginx定义) | 否,消耗极低 | 服务器直接关闭连接,不返回任何HTTP响应 |
200一般是普通用户访问网站获得的响应,如果针对攻击和恶意请求也返回200,等于没有防火墙。
一般默认采用403作为防火墙拒绝返回的代码,明确告诉客户端(恶意请求方)我们的服务器不欢迎你,虽然这是最文明也最明确的的返回方式,但是这样可能导致对方大量更换不同的代理IP,持续攻击服务器。
如果针对大量攻击使用403返回拒绝代码,403得走完整个HTTP处理流程:解析请求、找资源、执行权限判断、生成403页面、发HTTP头部和完整的HTML错误页面。这过程消耗CPU、内存、带宽资源。
444就简单粗暴多了,识别到黑名单IP后,内核层面直接发TCP RST包断连,跳过所有应用层处理。可以看出444是最节省服务器资源的返回码。不在响应层面消耗服务器资源
但是缺点也有:当攻击方没有收到响应时,可能会持续大量发出请求,这种请求虽然不会对服务器响应方面产生压力,但是也会给服务器增加一堆讨厌的日志记录。算是一点缺点吧。

如果是这种/xmlrpc.php的反复攻击,返回404也可以,这样就直接让攻击方知道这玩意不存在,也不会反复进行讨厌的请求了(眼不见心不烦)。