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

The*_*One 47 nginx web-server reverse-proxy django

我有一个在 Gunicorn 上运行的 Django 站点,通过 Nginx 使用反向代理。Nginx 不就是额外的不必要的开销吗?在 Gunicorn 之上添加它有什么帮助?

blu*_*ben 60

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

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

在您的情况下,您正在处理 Internet 上的高延迟客户端。这些慢速客户端可能会占用相同的进程。当 QPS 很重要时,应用程序代码需要尽快接收、处理和解决请求,以便它可以转移到另一个请求。当慢速客户端直接与您的系统通信时,它们会阻塞该进程并减慢它的速度。该进程现在还必须等待慢速客户端,而不是尽快处理和处理请求。有效 QPS 下降。

以很少的 CPU 和内存成本处理大量连接是像 Nginx 这样的异步服务器所擅长的。它们不会受到慢客户端的负面影响,因为它们擅长同时处理大量客户端。就 Nginx 而言,在现代硬件上运行时,它可以同时处理数万个连接。

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

  • 作为奖励,Nginx 非常有效地阻止了“慢速 HTTP DoS 攻击”。我要补充的一点是,当使用 Nginx 时,它可能会弄乱您可能在 Gunicorn 中执行的任何与 IP 相关的事情,例如通过 ip 进行身份验证、日志记录等。除非 Gunicorn 支持查看 X-Forwarded-For 标头。我不熟悉 Gunicorn,所以我不能说这对你来说会有多大的问题。 (5认同)
  • 挑剔:gunicorn 是一个基于预分叉事件的服务器。每个进程异步处理多个连接。这并没有改变 nginx 的每个连接成本更低的事实,使您的其余解释有效。 (4认同)