AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 401593
Accepted
Max
Max
Asked: 2012-06-24 03:29:50 +0800 CST2012-06-24 03:29:50 +0800 CST 2012-06-24 03:29:50 +0800 CST

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

  • 772

我负责为网站提供静态内容的生产服务器。这些服务器不断被机器人抓取以寻找潜在的漏洞利用(这在安全方面并不是什么大问题,因为无法访问 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 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 提供页面?(不破解可能是下一步的来源)

ubuntu nginx
  • 2 2 个回答
  • 1832 Views

2 个回答

  • Voted
  1. Best Answer
    kolbyjack
    2012-06-24T04:52:53+08:002012-06-24T04:52:53+08:00

    实际上,默认情况下,nginx 会在内部生成 404 响应。如果您告诉它使用 error_page 指令,它只会从磁盘提供文件。如果你想控制 404 页面的格式,而不是echo "404 - page not found";,你可以使用return 404 "404 - page not found";(假设你使用的是较新版本的 nginx,我相信你需要 0.9 或更新版本)

    • 4
  2. kworr
    2012-06-24T04:48:18+08:002012-06-24T04:48:18+08:00

    Nginx echo模块就是你所需要的。但是你应该将它与 error_page 一起使用:

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

    您可以通过返回 444使 nginx 关闭活动连接:

    return 444;
    

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

    您的计算差异只是未启用open_file_cache的结果。如果你想让它运行得更快,调整你的系统:接受过滤器、套接字队列和缓冲区等等。

    • 1

相关问题

  • 无法通过 Ubuntu VPN 访问外部网络

  • ubuntu apt-get upgrade - 如何在 shell 中单击确定?

  • VirtualBox 上 Ubuntu 的访客优化技巧 [关闭]

  • 外部硬盘上的 virtualbox 虚拟硬盘驱动器(Vista 主机上的 ubuntu 客户机)

  • 如何在 Ubuntu 上挂载 LVM 分区?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve