我想部署Django应用程序时,有很多教程介绍如何配置nginx与uWGSI合作。
但是,为什么我需要此套件中的nginx?uWSGI本身可以服务WSGI Python应用程序,它可以服务静态文件,也可以服务SSL。nginx可以做哪些uWSGI无法做的事情?
我想部署Django应用程序时,有很多教程介绍如何配置nginx与uWGSI合作。
但是,为什么我需要此套件中的nginx?uWSGI本身可以服务WSGI Python应用程序,它可以服务静态文件,也可以服务SSL。nginx可以做哪些uWSGI无法做的事情?
Answers:
你不知道
无论如何,这就是简单的答案-您不需要它。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上,您可能会发现有所不同。
想象一下另一个网络速度低的国家/地区的用户打开Web浏览器访问您的网站。uWSGI将在线程中处理该Http连接。由于网络速度低,该线程可能花费很长时间等待完整的Http请求。如果您的线程池大小为100,那么想象有100个这样的用户缓慢,将会发生什么?没有空闲线程来处理其他Http请求。
但是对于Nginx来说情况就大不一样了。Nginx是按“反应器模式”设计的。您可以在Google的“反应器模式”中进行搜索以查看其工作原理。简而言之,低速连接不会影响它处理其他Http请求。