直接从 nginx 回显 404 以提高性能

直接从 nginx 回显 404 以提高性能

我负责为网站提供静态内容的生产服务器。这些服务器不断被机器人抓取,寻找潜在的漏洞(从安全角度来看,这并不是什么大问题,因为 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%404echo404 Page not Foundnginx

到目前为止我尝试了很多方法但都失败了,本质上的想法是这样的:

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 或更新版本)

答案2

Nginx回声模块就是您所需要的。但您应该将其与 error_page 一起使用:

error_page 404 @echo_404;
location @echo_404 { echo "Not found"; }

你可以通过以下方式让 nginx 关闭活动连接返回 444

return 444;

这将立即关闭套接字而不向网络写入任何内容。

你计算的差异仅仅是由于打开文件缓存尚未启用。如果您希望它运行得更快,请调整您的系统:接受过滤器、套接字队列和缓冲区等。

相关内容