将基于Python的WebApp部署到WebServer的更流行的方法是哪种?

时间:2014-09-17 05:15:03

标签: web-applications deployment webserver

我只知道WSGI,FCGI(FastCGI)和uWSGI。 如果您知道其他,请告诉我。 如何应用上述三种方式的状态,哪种更受欢迎? 感谢。

2 个答案:

答案 0 :(得分:3)

你很困惑。

WSGI是一个API规范。它本身不是部署任何东西的方式。特定的WSGI部署机制将是WSGI规范的实现,该规范将遵循WSGI规范的Python Web应用程序桥接到特定的Web托管机制。这可能是Web应用程序最终嵌入到同一Web服务器进程中,或者通过套接字协议与单独的Web服务器通信的地方。

FASTCGI是用于在Web应用程序进程和Web服务器之间进行通信的此类套接字协议的一个实例。对于Python Web应用程序,flup是FASTCGI和Python Web应用程序之间桥接的WSGI适配器实现的一个示例。套接字协议的另一个例子是SCGI。

uWSGI是一种实现,实际上是用于托管各种语言的Web应用程序的保护伞。它可以处理HTTP直接,但通常使用自己的套接字协议uwsgi(小写)与Web服务器通信。它通过其插件系统支持的语言之一是Python,因此它在直接处理时用作uwsgi协议或HTTP的WSGI适配器实现。

关于你可能想要提出的问题,在Python世界中最流行的WSGI部署机制是:

  • 阿帕奇/ mod_wsgi的
  • uWSGI
  • gunicorn

Apache / mod_wsgi是最古老的,被认为是坚如磐石的。许多人没有花时间学习如何为Python Web应用程序正确配置Apache,因此无法充分利用它,从而导致对Apache的大量错误印象。对那些说Apache缓慢而臃肿的人非常怀疑。这只是表明他们从未正确设置Apache。真正使Apache / mod_wsgi大放异彩的最好方法之一就是在nginx后面使用它。使用Apache / mod_wsgi时,除非你真正知道自己在做什么,否则最好使用它的守护进程模式。

gunicorn服务器是一个纯Python服务器,因此很有吸引力。它仅限于单线程同步工作者,并不支持传统的多线程。因此,您必须使用多进程配置,尽管这在CPU密集型任务中具有优势,但对于Web应用程序通常具有的I / O绑定任务意味着它可以使用比使用多线程和多处理的良好配置的Apache设置更多的内存。也可以使用几个基于couroutine的工作人员使用gunicorn,但是你必须非常小心地使用它们并确保你使用的所有应用程序代码和模块都是greenlet知识的,并且可以使用协同程序,或者你可能遇到单点阻塞问题从做任何事情的整个过程。

尽管在Apache / mod_wsgi之前使用nginx是一个非常好的组合,但大多数人都会接受nginx背后的uWSGI。 uWSGI的问题在于它有太多不同的设置方式,其默认值不是最好的,您需要确保使用某些选项使其更加健壮。基于uWSGI的代码仍然看到非常快速的发展,这在过去一直是一个可靠的问题。因此,请确保您没有使用Linux发行版附带的古老版本,请确保您使用的是最新版本。

至于哪个最好,在正确设置时,每个之间的性能差异不应该那么多。除非您搞砸了他们的配置,否则瓶颈通常永远不会出现在部署机制中。真正的瓶颈将出现在您的Web应用程序,数据库和后端服务中。

因此,作为一般规则,您最好根据系统管理员或您自己的理解选择一个,并认为您可以配置和管理最简单的。试着忽略那些虔诚地试图引导你到他们最爱的人,因为对他们有用的东西并不总能为你工作。对于一个严肃的网站,你需要正确评估什么是最好的,然后投入适当的努力来正确设置它,而不是简单地抛弃它并希望最好。

到目前为止,我还没有提到过龙卷风。在Tornado之上使用WSGI并不是一个很好的选择,除了特定的用例,因为在ASYNC Tornado上运行阻塞WSGI会出现问题。如果您想使用ASYNC API而不是WSGI,那么Tornado和Twisted都是合理的选择。写入ASYNC API可能会复杂得多,但在某些情况下,如果要进行大量的数据上传,由于Tornado在处理请求之前缓冲请求请求内容,您必须要小心Tornado。

最后一点。在复杂的系统中,您完全有可能需要使用多种技术。不要以为你应该使用一种技术。使用WSGI Web框架使Web应用程序编程更容易,但WSGI的阻塞特性不一定适用于某些高度并发的长轮询类型应用程序。因此,您确实需要查看Web应用程序的不同部分需要并分解它并为每个部分使用适当的技术,而不只是在一个尝试执行所有操作的技术中使用一个巨大的单片应用程序。

答案 1 :(得分:-1)

我宁愿使用Django + mod_wsgi。但另一种方法是使用SSI。只需<!--#exec cmd="python script.py" -->