当我想要部署 Django 应用程序时,有很多关于如何配置 nginx 与 uWGSI 配合的教程。
但是为什么我需要这个套件中的 nginx?uWSGI 本身可以为 WSGI Python 应用程序提供服务,它可以提供静态文件,它还可以执行 SSL。nginx 可以做什么而 uWSGI 不能做?
答案1
你不知道。
无论如何,答案很简单——你不需要需要它。uWSGI 本身是一个功能强大的服务器。
但是,其他服务器(例如 nginx)已经存在了很长时间,并且(可能)更安全,并且具有 uWSGI 不支持的附加功能 - 例如,改进了对静态资源的处理(通过 Expires 或 E-Tag 标头的任意组合、gzip 压缩、预压缩 gzip 等),可以显着减少服务器和网络负载;此外,Django 应用程序前面的服务器(例如 nginx)也可以实现动态内容的缓存,进一步帮助减少服务器负载,甚至有助于促进 CDN 的使用(通常 CDN 不适用于动态内容)。您甚至可以更进一步,将 nginx 放在完全独立的服务器上,将动态内容请求反向代理到负载平衡的应用程序服务器集群,同时处理静态内容本身。
例如,我的博客(虽然它是 WordPress,但前面有 nginx)被调整为缓存帖子 24 小时,缓存索引页 5 分钟;虽然大多数时候我看不到足够的流量来真正发挥作用,但它可以帮助我的小 VPS 抵御偶尔的流量激增,否则可能会将其击垮——例如,当我的一篇文章被一位拥有数千名粉丝的 Twitterer 选中时,流量激增,其中许多人将其转发给他们的数千名粉丝。
如果我运行的是“裸”uWSGI 服务器(假设它是一个 Django 网站,而不是 WordPress),它可能会很好地应对这种情况——或者它可能会崩溃并烧毁,让我失去访客。在它前面安装 nginx 来处理这种负载确实很有帮助。
话虽如此,如果你只是运行一个流量不大的小网站,那么就没有必要使用 nginx 或其他任何东西——如果你想这样做,只需单独使用 uWSGI 即可。另一方面,如果你会看到很多流量……好吧,你仍然可能需要 uWSGI,但您至少应该考虑在它之前使用某些配置来帮助降低负载。实际上,您应该对完成的站点进行不同的负载测试,以确定在预期负载下哪种配置最适合您,然后使用最终的配置。
答案2
在我看来,如果你把你的网站放在互联网上而不是实验室里,你可能会看到差异。
想象一下,一个来自其他国家/地区的用户在网络速度较慢的情况下打开 Web 浏览器访问您的网站。uWSGI 将在一个线程中处理该 Http 连接。由于网络速度较慢,该线程可能要花费相当长的时间等待完整的 Http 请求。如果您的线程池大小为 100,想象一下 100 个用户都这么慢,会发生什么?没有空闲线程来处理其他 Http 请求。
但 Nginx 的情况则完全不同。Nginx 的设计遵循了“反应堆模式”。您可以谷歌搜索“反应堆模式”来了解其工作原理。简而言之,低速连接不会影响它处理其他 Http 请求。