从nginx直接回声404提高性能

我负责为网站提供静态内容的生产服务器。 这些服务器不断被爬虫寻找潜在的漏洞( 这在安全方面没有什么太大的问题,因为在Web服务器之后没有任何应用程序 ),但是每天产生成千上万的404 ,有时每小时。 我正在研究阻止这些请求的方法,但这很棘手( 您要确保您不会阻止合法的stream量,而且这些漫游器在看起来像是合法的时候变得越来越聪明 ),并且需要一段时间find可以接受的解决scheme。

与此同时,我想减less服务这404页的性能影响。 事实上,我们使用的nginx默认configuration为从磁盘提供404页面(这可以使用error_page指令进行更改,但最终404将不得不从磁盘或其他外部源(例如上游应用程序将是最糟糕的))这是不理想的。

我使用基本configuration在本地计算机上运行了一个testing:在一种情况下,我直接从nginx echo一条消息,所以磁盘根本不被触及,另一种情况是我find了一个缺失的页面, nginx提供了404磁盘。

 server { # [...] the default nginx stuff location / { } location /this_page_exists { echo "this page was found"; } } 

这里是testing结果( 我的笔记本电脑有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返回值比从磁盘提供404页面快11% ((25609-22905)÷22905×100)。 因此,我想从nginx echo一个简单的404 Page not Foundstring。

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

 location / { try_files $uri @not_found; } location @not_found { echo "404 - Page not found"; } 

问题是一旦使用了echo指令 , http response code被设置为200 。 我试图通过做error_page 200 = 400改变,但是打破了configuration。

我怎样才能直接从nginx服务404页面? (没有黑客可能下一步的来源)

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

Nginx的回声模块是你所需要的。 但是你应该使用error_page:

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

你可以通过返回444来使nginxclosures活动连接:

 return 444; 

这将立即closures套接字而不写任何东西到网上。

您的计算中的差异只是open_file_cache未启用的结果。 如果你想要更快地调整你的系统:接受filter,套接字队列和缓冲区等等。