为什么将Nginx设置为反向代理是一个好主意?


41

我有一个通过Nginx的反向代理在Gunicorn上运行的Django站点。Nginx不仅仅是额外的不必要的开销吗?将其添加到Gunicorn上有什么帮助?

Answers:


52

我将专注于缓慢的客户端行为以及您的配置如何处理它,但是不要试图相信这是唯一的好处。使慢速客户端受益的相同方法也对快速客户端,SSL处理,处理流量激增以及在Internet上提供HTTP服务的其他方面也具有益处。

Gunicorn是预分叉软件。对于低延迟通信,例如到应用程序服务器的负载平衡器或服务之间的通信,前叉系统可能会非常成功。扩展处理请求的过程是没有成本的,并且可以将单个过程专用于处理单个请求;消除这些问题可以导致整体上更快,更高效的系统,直到同时连接的数量超过了处理它们的可用进程的数量。

在您的情况下,您正在通过Internet处理高延迟的客户端。这些缓慢的客户端可以占用相同的进程。当QPS很重要时,应用程序代码需要尽快接收,处理和解决该请求,以便可以继续处理其他请求。当速度较慢的客户端直接与您的系统通信时,他们会束缚该过程并降低其速度。现在,除了尽快处理和处理请求之外,该过程还必须等待缓慢的客户端。有效QPS下降。

Nginx等异步服务器擅长以很少的cpu和内存成本处理大量连接。缓慢的客户端不会以相同的负面方式影响它们,因为它们善于同时处理大量客户端。以Nginx为例,在现代硬件上运行,它可以一次处理成千上万的连接。

Nginx在分叉服务器之前是一个很好的组合。Nginx处理与客户端的通信,并且不会因处理速度较慢的客户端而受到惩罚。它以后端能够处理这些请求的速度将请求发送到后端,从而使后端能够尽可能高效地利用服务器资源。后端一计算出结果就返回结果,Nginx缓冲该响应以按照自己的速度将其反馈给速度较慢的客户端。同时,即使速度较慢的客户端仍在接收结果,后端也可以继续处理另一个请求。


3
nitpicking:gunicorn是基于事件的预分支服务器。每个进程异步处理几个连接。但这并没有改变nginx降低每次连接成本的事实,因此其余的解释仍然有效。
哈维尔

4
另外,Nginx非常有效地阻止了“慢速HTTP DoS攻击”。我要补充的一点是,使用Nginx时,它可能会使您在Gunicorn中所做的任何与IP相关的事情搞乱,例如通过ip进行身份验证,登录等。除非Gunicorn支持查看X-Forwarded-For标头。我对Gunicorn不熟悉,所以无法说这对您有多大的问题。
Niall Donegan

感谢您提供Javier的信息,我不过是非常熟悉Gunicorn。
blueben

您的答案应该适合以下问题:stackoverflow.com/q/13182892/719276
arthur.sw 2014年

这与* _busy_buffer_size选项有关吗?
CMCDragonkai 2015年

2

@blueben是正确的。当不使用反向代理时可能发生的一个特定且常见的示例是,后端数据库可能会耗尽没有代理且流量高峰的数据库连接句柄。这是由于连接缓慢释放所致,如@blueben所述。

看到数据库句柄耗尽的第一个本能可能是支持更多的数据库连接。但是,通过在应用程序前面添加反向代理,您将看到高负载所需的数据库连接数量都显着下降并且稳定下来-当流量高峰时,数据库连接级别不会大幅增加。

Nginx还擅长提供静态内容,缓存和其他各种HTTP任务,使您的应用服务器专注于成为应用服务器。


0

@naill Donegan在上面的评论中提到了这一点,但重要的是需要一个答案。

Nginx阻止了gunicorn无法处理的缓慢的loris攻击。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.