为什么我有 uWSGI 还需要 nginx

use*_*447 75 nginx django uwsgi

关于在部署Django应用时如何配置nginx配合uWGSI的教程有很多。

但是为什么我需要在这个套件中使用 nginx?uWSGI 本身可以服务 WSGI Python 应用程序,可以服务静态文件,也可以做 SSL。nginx 可以做什么而 uWSGI 不能?

Kro*_*mey 65

你没有。

无论如何,这就是简单的答案——你不需要它。uWSGI 本身就是一个功能强大的服务器。

然而,像 nginx 这样的其他服务器存在的时间更长,并且(无论如何)更安全,并且具有 uWSGI 不支持的附加功能——例如,改进对静态资源的处理(通过 Expires 或 E-Tag 的任意组合)标头、gzip 压缩、预压缩 gzip 等)可以显着降低服务器和网络负载;此外,在 Django 应用程序前面的像 nginx 这样的服务器也可以实现动态内容的缓存,进一步帮助减少服务器负载,甚至有助于促进 CDN 的使用(这通常不适用于动态内容)。您甚至可以更进一步,在完全独立的服务器上使用 nginx,将动态内容的请求反向代理到负载均衡的应用服务器集群,同时处理静态内容本身。

例如,我的博客(虽然它是 WordPress,但它前面确实有 nginx)调整为缓存帖子 24 小时,缓存索引页面 5 分钟;虽然我在大部分时间都没有看到足够的流量来真正重要,但它帮助我的小 VPS 经受住了偶尔的激增,否则可能会使其崩溃——例如当我的一篇文章被选中时流量激增由拥有数千名粉丝的推特用户上传,其中许多人将其转发给了数千名粉丝。

如果我一直在运行一个“裸”的 uWSGI 服务器(并假设它是一个 Django 站点,而不是 WordPress),它可能会很好地经受住它的考验——或者它可能会崩溃并烧毁,让我错过访客. 将 nginx 放在它前面来处理该负载真的很有帮助。

话虽如此,如果您只是运行一个不会看到大量流量的小站点,则没有真正需要 nginx 或其他任何东西——如果您想要这样做,只需单独使用 uWSGI。另一方面,如果您会看到大量流量......好吧,您可能仍然需要 uWSGI,但您至少应该考虑在它前面的一些东西来帮助负载。实际上,您真的应该对已完成的站点的不同配置进行负载测试,以确定在您的预期负载下什么最适合您,并使用最终的配置。

  • 除了@Kromey 在他们的回答中提到的内容之外,我认为值得注意的一件事是 uWSGI 的本机协议不是 http,而是 uwsgi 协议。uwsgi 协议比 http 更简单、更有效,因此在你的 uWSGI 应用程序前面粘贴一个功能更齐全的 Web 服务器(nginx 或诸如此类)实际上并没有重复大量的处理,并且可能会提供显着的好处,具体取决于你的需要。 (4认同)
  • 这是一个很好的答案,但是,可以通过指向 uWSGI 自己的有关该主题的文档的链接来改进它,该文档更详细地解释了您*可以*使用 uWSGI 做什么:http://uwsgi-docs.readthedocs.io/en /latest/HTTP.html#can-i-use-uwsgi-s-http-capability-in-生产 (2认同)

Jcy*_*rss 6

IMO,如果您将网站放在互联网而不是实验室中,您可能会看到差异。

想象一下来自另一个国家/地区的低网速用户打开网络浏览器来访问您的网站。uWSGI将在线程中处理该Http连接。由于网络速度较低,该线程可能会花费相当长的时间来等待完整的 Http 请求。如果你的线程池大小是100,想象一下100个用户都这么慢,会发生什么?没有空闲线程来处理其他 Http 请求。

但 Nginx 的情况就完全不同了。Nginx 采用“反应堆模式”设计。你可以用谷歌搜索“Reactor Pattern”来看看它是如何工作的。总之,连接速度慢并不影响它处理其他Http请求。

  • 据我所知,默认情况下,Nginx不会将HTTP请求代理到后端应用服务器,直到它收到完整的HTTP请求。因此,对于像 Django 这样的应用服务器,它们得到的总是快速的 HTTP 连接和请求,没有时间浪费在等待完整的 http 请求上,在很快处理完请求后,正在运行的线程很快就可以空闲下来处理下一个 Http 请求。 (3认同)
  • 我怀疑使用 Nginx 会改变这一点。当使用 WSGI 在 Apache 上托管 Django 应用程序时,将在从套接字读取任何 POST 数据之前调用视图函数。所以如果客户端速度慢的话,从收到请求到收到POST数据都会占用一个线程。为什么用 Nginx 替换 Apache 会改变这种情况? (2认同)
  • 它称为请求缓冲,在 Nginx 中默认启用(在旧版本的 Nginx 中无法将其关闭):http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_request_buffering (2认同)