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

我有一个运行在Gunicorn上的Django站点,通过Nginx的反向代理。 Nginx是不是额外的不必要的开销? 如何在Gunicorn上添加这些帮助?

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

Gunicorn是预分配软件。 对于低延迟通信,例如负载平衡器到应用服务器或服务之间的通信,预分叉系统可能非常成功。 启动处理请求的stream程没有任何成本,并且可以专门处理单个请求; 消除这些事情可以导致整体更快,更有效的系统,直到同时连接的数量超过处理它们的可用进程的数量。

在你的情况下,你正在通过互联网处理高延迟的客户端。 这些速度慢的客户可以捆绑这些相同的stream程。 当QPS很重要时,应用程序代码需要尽可能快地接收,处理和解决请求,以便移动到另一个请求。 当慢速客户端直接与您的系统进行通信时,他们将这个过程绑定在一起,并放慢速度。 这个过程不是尽快处理和处理请求,而是要等待缓慢的客户端。 有效的QPS下降。

用很less的cpu和内存成本处理大量的连接是像Nginx这样的asynchronous服务器所擅长的。 他们不受慢速客户负面影响,因为他们善于同时处理大量客户。 在Nginx的情况下,运行在现代硬件上,它可以同时处理数以万计的连接。

在预分叉服务器前的Nginx是一个很好的组合。 Nginx处理与客户端的通信,不会因为处理慢速客户端而受到惩罚。 它以后端处理这些请求的速度向后端发送请求,使后端对服务器资源的效率尽可能高。 后端在计算结果后立即返回结果,Nginx会caching响应,以便按照自己的步调对客户端进行caching。 同时,后端可以继续处理另一个请求,即使慢速客户端仍在接收结果。

@blueben是对的。 不使用反向代理时会发生什么的一个特定和常见的示例是,后端数据库可能会耗尽没有代理的数据库连接句柄,并且出现stream量峰值。 这是由于@blueben描述的连接速度缓慢。

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

Nginx在提供静态内容,caching和各种其他HTTP任务方面也很出色,让您的应用服务器专注于应用服务器。

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

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