我负责为网站提供静态内容的生产服务器。这些服务器不断被机器人抓取以寻找潜在的漏洞利用(这在安全方面并不是什么大问题,因为无法访问 Web 服务器后面的应用程序)但404
每天生成数千个,有时每小时生成数以千计。我正在研究阻止这些请求的方法,但这很棘手(你想确保你不阻止合法流量,而且这些机器人变得越来越聪明,看起来像是合法的)并且需要我一段时间找到可接受的解决方案。
与此同时,我想减少服务这些404
页面对性能的影响。事实上,我们使用nginx
的是默认配置为404
从磁盘提供页面(这可以使用error_page
指令更改,但最终404
必须从磁盘或其他外部源(例如上游应用程序,这将是最差))这并不理想。
ab
我在我的本地机器上用基本配置运行了一个测试:在一种情况下,我echo
直接从中发送一条消息,nginx
所以磁盘根本没有被触及,在另一种情况下,我找到了一个丢失的页面并从磁盘nginx
提供它。404
server {
# [...] the default nginx stuff
location / {
}
location /this_page_exists {
echo "this page was found";
}
}
以下是测试结果(我的笔记本电脑有 Intel(R) Core(TM) i7-2670QM + SSD,以防你想知道为什么它们这么高):
$ ab -n 500000 -c 1000 http://localhost/this_page_exists
Requests per second: 25609.16 [#/sec] (mean)
$ ab -n 500000 -c 1000 http://localhost/this_page_doesnt_exists
Requests per second: 22905.72 [#/sec] (mean)
如您所见,返回一个值为echo
( 11%
(25609−22905)÷22905×100) 的值比404
从磁盘提供页面更快。因此,我想echo
从.404 Page not Found
nginx
到目前为止我尝试了很多东西但都失败了,基本上这个想法是这样的:
location / {
try_files $uri @not_found;
}
location @not_found {
echo "404 - Page not found";
}
问题是一旦使用该echo
指令,http response code
就会设置为200
. 我尝试通过这样做来改变它,error_page 200 = 400
但这会破坏配置。
如何404
直接从 nginx 提供页面?(不破解可能是下一步的来源)
实际上,默认情况下,nginx 会在内部生成 404 响应。如果您告诉它使用 error_page 指令,它只会从磁盘提供文件。如果你想控制 404 页面的格式,而不是
echo "404 - page not found";
,你可以使用return 404 "404 - page not found";
(假设你使用的是较新版本的 nginx,我相信你需要 0.9 或更新版本)Nginx echo模块就是你所需要的。但是你应该将它与 error_page 一起使用:
您可以通过返回 444使 nginx 关闭活动连接:
这将立即关闭套接字而不向网络写入任何内容。
您的计算差异只是未启用open_file_cache的结果。如果你想让它运行得更快,调整你的系统:接受过滤器、套接字队列和缓冲区等等。