当我有uWSGI时为什么需要nginx


62

我想部署Django应用程序时,有很多教程介绍如何配置nginx与uWGSI合作。

但是,为什么我需要此套件中的nginx?uWSGI本身可以服务WSGI Python应用程序,它可以服务静态文件,也可以服务SSL。nginx可以做哪些uWSGI无法做的事情?


9
我可以看到,这个问题是基于观点而封闭的。我绝对不同意。问题“ nginx可以做什么uWSGI不能做什么?” 基于事实。
user983447 2014年

1
我一般不要求重新营业,但在这种情况下,我同意。现有的已被接受并被接受的答案是一个很好的答案,它表明该问题在书面上承认了明智且相关的答案。我认为这可能是一个很好的问题。
2014年

Answers:


55

你不知道

无论如何,这就是简单的答案-您不需要它。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,但是您至少应该考虑一下它前面的内容以帮助进行负载。实际上,您实际上应该在最终站点上对不同的配置进行负载测试,以确定在预期负载下最适合您的方法,并使用最终的结果。


3
除了@Kromey在回答中涉及的内容外,我认为值得一提的是,uWSGI的本机协议不是http,而是uwsgi协议。uwsgi协议比http处理起来更简单,更有效,因此在您的uWSGI应用程序之前使用功能更全的Web服务器(nginx或whatnot)实际上并不会重复很多处理,并且可能会带来重大的收益,具体取决于您的需要。
哈坎·林奎斯特

@HåkanLindqvist绝对正确;为了明确起见,uWSGI完全具备“说” HTTP的能力,因此可以独立使用,但是是的,值得注意的是,位于它前面的Web服务器将使用uwsgi协议而不是HTTP来进行通信。与uWSGI交流,因此,是的,所涉及的处理几乎没有重复。
Kromey 2014年

这是一个很好的答案,但是,它可以用一个链接到uWSGI自己的文档的主题,与更多的细节你解释了提高与uWSGI做:uwsgi-docs.readthedocs.io/en/latest/...
托比亚斯McNulty

1

IMO,如果将您的网站放在Internet而不是Lab上,您可能会发现有所不同。

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

但是对于Nginx来说情况就大不一样了。Nginx是按“反应器模式”设计的。您可以在Google的“反应器模式”中进行搜索以查看其工作原理。简而言之,低速连接不会影响它处理其他Http请求。


1
我怀疑使用Nginx是否会改变这一点。当使用WSGI将Django应用程序托管在Apache上时,将在从套接字读取任何POST数据之前调用view函数。因此,如果客户端运行缓慢,它将从收到请求开始一直占用一个线程,直到收到POST数据为止。为什么用Nginx替换Apache会改变这一点?
卡巴斯德(Kasperd),2015年

1
据我所知,默认情况下,Nginx在获得完整的HTTP请求之前不会将HTTP请求代理到后端应用服务器。因此,对于像Django这样的applicaton服务器,他们获得的始终是快速的HTTP连接和请求,没有浪费时间等待完整的http请求,很快处理完任务后,运行线程很快就可以空闲用于下一个Http请求。
Jcyrss,2015年

1
这就是所谓的请求缓冲,这是在默认情况下启用Nginx的(在旧版本Nginx的,不可能关闭这个功能):nginx.org/en/docs/http/...
托比亚斯麦克纳尔蒂
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.