Python虚拟主机:为什么需要重启服务器?

时间:2009-11-10 21:50:06

标签: python web-hosting

我们目前在我们的服务器上为几百个小型PHP站点运行一个小型共享托管服务。我们也想提供Python支持,但至少从我们的初步研究来看,每次源代码更改后似乎都需要重启服务器。

这是真的吗?如果是这样,我们就无法提供Python托管支持。让我们的客户能够上传文件很容易,但我们不能让他们重新启动(共享)服务器进程!

PHP非常简单 - 您上传新版本的文件,新版本即可运行。

我非常尊重Python语言和社区,因此很难相信它真的需要一个疯狂的过程来更新网站的代码。请告诉我,我错了! : - )

3 个答案:

答案 0 :(得分:7)

Python是一种编译语言;编译后的字节代码由Python进程缓存以供以后使用,以提高性能。默认情况下,PHP被解释。这是可用性和速度之间的权衡。

如果您正在使用标准的WSGI模块,例如Apache的mod_wsgi,那么您不必重新启动服务器 - 只需触摸.wsgi文件即可重新加载代码。如果您正在使用一些不支持WSGI的奇怪服务器,那么您可以根据自己的可用性进行操作。

答案 1 :(得分:4)

取决于您如何部署Python应用程序。如果它是纯Python CGI脚本,则不需要重新启动(尽管不建议,因为它会超级慢)。如果您在Apache中使用modwsgi,则有reloading the source的有效方法。 modpython显然has some support and accompanying issues用于模块重新加载。

除了Apache之外,还有其他方法可以托管Python应用程序,包括CherryPy服务器,Paste Server,Zope,Twisted和Tornado。

但是,除非你有特殊的理由不使用它(因为你来自大概是Apache / PHP商店),我强烈建议在Apache上使用mod_wsgi。我知道Django建议在Apache上使用modwsgi,而大多数其他主要的Python框架都适用于modwsgi。

答案 2 :(得分:3)

  

这是真的吗?

它取决于。代码重新加载特定于托管解决方案。大多数服务器提供了一些自动重新加载WSGI脚本的方法,但没有标准化;实际上,WSGI Application对象如何连接到Web服务器的问题在不同的托管环境中存在很大差异。 (您可以创建一个单独的脚本文件,作为CGI,mod_wsgi,passenger和ISAPI_WSGI的部署粘合剂,但它并非完全无关紧要。)

然而,Python真正在努力的是模块重新加载。这对WSGI应用程序来说是个问题,因为任何非平凡的webapp都会将其功能封装到模块和包中,而不是简单的独立脚本。事实证明重新加载模块非常棘手,因为如果你逐个reload()它们,他们很容易就会对旧版本的错误引用结束。理想情况下,前进的方法是在更新任何文件时重新加载整个Python解释器,但实际上似乎有些C扩展似乎不喜欢这样,因此通常不会这样做。

workarounds一次重新加载一组模块,可以在触摸其中一个模块时可靠地更新应用程序。我使用了一个部署模块来执行此操作(我还没有发布,但如果您感兴趣的话可以复制一份副本)并且它适用于我自己的webapps。但是你确实需要一些纪律,以确保你不会意外地开始在你没有重新加载的其他模块中留下对旧模块对象的引用;如果你正在谈论由代码可能漏洞的第三方编写的大量网站,这可能并不理想。

在这种情况下,您可能希望查看在守护进程模式下运行mod_wsgi以及每个方和进程级重新加载的应用程序组,并在更新任何模块时触摸WSGI脚本文件。

你抱怨是对的;这(以及许多其他WSGI部署问题)可以使用一些标准化帮助。