我负责为网站提供静态内容的生产服务器。这些服务器不断被机器人抓取,寻找潜在的漏洞(从安全角度来看,这并不是什么大问题,因为 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)
如您所见,返回值为((25609−22905)÷22905×100) 比从磁盘提供页面快echo
。因此,我想要一个简单的字符串。11%
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 提供页面?(无需破解源代码,这可能是下一步)
答案1
实际上,默认情况下,nginx 会在内部生成 404 响应。只有当您使用 error_page 指令告诉它时,它才会从磁盘提供文件。如果您想控制 404 页面的格式,echo "404 - page not found";
您可以使用而不是return 404 "404 - page not found";
(假设您使用的是较新版本的 nginx,我相信您需要 0.9 或更新版本)