但是为什么我需要这个套件中的nginx? uWSGI本身可以服务WSGI Python应用程序,可以服务静态文件,也可以服务SSL。 nginx可以做哪些uWSGI无法做的事情?
#1 楼
您不需要。无论如何,这就是简单的答案-您不需要它。 uWSGI本身就是一台功能强大的服务器。
但是,其他服务器(例如nginx)的使用寿命更长,并且(无论如何)更安全,并且具有uWSGI不支持的其他功能-例如,改进了对静态资源的处理(通过Expires或E-Tag标头,gzip压缩,预压缩的gzip等的任意组合),可以显着减少服务器和网络负载;此外,在Django应用程序前面的类似nginx的服务器也可以实现动态内容的缓存,从而进一步帮助减轻服务器负载,甚至有助于简化CDN的使用(通常情况下,动态内容效果不佳) )。您甚至可以走得更远,在完全独立的服务器上安装nginx,将对动态内容的请求反向代理到应用程序服务器的负载平衡群集,同时处理静态内容本身。
例如,我的博客(而(它是WordPress,它的前面确实有nginx)已调整为将帖子缓存24小时,将索引页面缓存5分钟;虽然我认为大部分时间并没有足够的流量来解决这个问题,但是它可以帮助我的小VPS经受偶尔的激增,否则可能会使其崩溃-例如,当我的一篇文章被选中时,流量就激增了由拥有数千名关注者的Twitterer进行,其中许多人将其转发给其成千上万的关注者。网站,而不是WordPress),它可能已经很好了,或者它可能崩溃并烧毁,使我错失了访问者的成本。在其前面放置nginx来处理该负载确实可以提供帮助。
话虽如此,如果您只是在运行一个流量不大的小站点,则不需要真正使用nginx或其他任何东西-如果您要这样做,只需单独使用uWSGI。另一方面,如果您会看到大量的流量……那么,您仍然可能需要uWSGI,但是您至少应该考虑一下它前面的内容以帮助进行负载。实际上,您实际上应该在最终站点上对不同的配置进行负载测试,以确定在预期负载下最适合您的方法,并使用最终的结果。
评论
除了@Kromey在回答中涉及的内容外,我认为值得一提的是,uWSGI的本机协议不是http,而是uwsgi协议。 uwsgi协议比http处理起来更简单,更有效,因此在您的uWSGI应用程序前面粘贴功能更全的Web服务器(nginx或whatnot)实际上并不会重复很多处理,并且根据您的使用可能会带来重大好处需要。
–Håkan Lindqvist
2014年4月23日在17:38
@HåkanLindqvist是绝对正确的;为了明确起见,uWSGI完全具备“说” HTTP的能力,因此可以独立使用,但是是的,值得注意的是,位于它前面的Web服务器将使用uwsgi协议而不是HTTP来进行通信。与uWSGI交流,因此,是的,所涉及的处理几乎没有重复。
– Kromey
14年4月23日在18:04
这是一个很好的答案,但是,可以通过链接到uWSGI自己的主题文档进行改进,该文档详细介绍了您可以使用uWSGI进行的操作:uwsgi-docs.readthedocs.io/en/latest/…
– Tobias McNulty
17年3月22日在5:28
#2 楼
IMO,如果将网站放在Internet上而不是Lab上,您可能会发现差异。想象来自另一个国家/地区的网络速度低的用户打开Web浏览器访问您的网站。 uWSGI将在线程中处理该Http连接。由于网络速度低,该线程可能花费很长时间等待完整的Http请求。如果您的线程池大小为100,请想象有100个这样的用户缓慢,将会发生什么?没有空闲线程可以处理其他Http请求。
但是对于Nginx来说却大不相同。 Nginx是按“反应器模式”设计的。您可以在Google的“反应器模式”中进行搜索,以了解其工作原理。简而言之,低速连接不会影响它处理其他Http请求。
评论
我怀疑使用Nginx是否会改变这一点。当使用WSGI将Django应用程序托管在Apache上时,将在从套接字读取任何POST数据之前调用view函数。因此,如果客户端运行缓慢,它将从收到请求开始一直占用一个线程,直到收到POST数据为止。为什么用Nginx替换Apache会改变这一点?
–卡巴斯德
15年5月26日在12:58
据我所知,默认情况下,Nginx在获得完整的HTTP请求之前不会将HTTP请求代理到后端应用服务器。因此,对于像Django这样的applicaton服务器,他们得到的始终是快速的HTTP连接和请求,没有浪费时间等待完整的http请求,很快处理完任务后,运行线程很快就可以闲置用于下一个Http请求。
–Jcyrss
2015年5月27日5:10
这称为请求缓冲,在Nginx中默认启用(在Nginx的较旧版本中无法将其关闭):nginx.org/en/docs/http/…
– Tobias McNulty
17 Mar 22 '17 at 5:25
评论
我可以看到,这个问题是基于观点而封闭的。我绝对不同意。问题“ nginx可以做什么uWSGI不能做什么?”是基于事实的。我一般不要求重新营业,但在这种情况下,我同意。现有的已被接受并被接受的答案是一个很好的答案,它表明该问题在书面上承认了明智且相关的答案。我认为这可能是个好问题。