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