Python web hosting: 服务器重启的必要性 我们目前为服务器上的数百个小型 PHP 站点运行一个小型的共享主机服务。我们也想提供 Python 支持,但至少从我们最初的研究来看,每次更改源代码后似乎都需要重启服务器。 这真的是这种情况吗?如果是这样,我们就无法提供 Python 托管支持。让我们的客户能够上传文件很容易,但我们不能让他们重新启动(共享)服务器进程! PHP 很简单——您上传新版本的文件,运行新版本。我对 Python 语言和社区非常尊重,所以很难相信它真的需要如此疯狂的过程来更新网站的代码。请告诉我我错了! :-)
2、解决方案
答案1: Python 是一种编译型语言;编译的字节码由 Python 进程缓存以备后用,以提高性能。默认情况下,PHP 是解释型的。这是可用性和速度之间的权衡。 如果您使用的是标准 WSGI 模块,例如 Apache 的 mod_wsgi,那么您不必重新启动服务器——只需轻触 .wsgi 文件,代码就会重新加载。如果您使用的是不支持 WSGI 的奇怪服务器,那么您在可用性方面有点自给自足。
答案2: 取决于您如何部署 Python 应用程序。如果它是一个纯 Python CGI 脚本,则无需重新启动(但根本不建议这样做,因为它的速度非常慢)。如果您在 Apache 中使用 modwsgi,则有有效的方法来重新加载源代码。modpython 显然有一些支持并附带模块重新加载问题。 除了 Apache 之外,还有其他方法可以托管 Python 应用程序,包括 CherryPy 服务器、Paste Server、Zope、Twisted 和 Tornado。 但是,除非您有特殊原因不使用它(而且您可能来自 Apache/PHP 商店),否则我强烈推荐在 Apache 上使用 mod_wsgi。我知道 Django 建议在 Apache 上使用 modwsgi,并且大多数其他主要的 Python 框架可以在 modwsgi 上运行。
答案3: 这真的是这种情况吗?
这取决于。代码重新加载对于托管解决方案来说是高度特定的。大多数服务器提供了一些自动重新加载 WSGI 脚本本身的方法,但没有标准化;事实上,WSGI 应用程序对象如何与 Web 服务器连接的问题在不同的托管环境中差异很大。(您几乎可以制作一个用作 CGI、mod_wsgi、passenger 和 ISAPI_WSGI 部署胶水的单个脚本文件,但这并不是完全微不足道的。) 然而,Python 真正难以解决的是模块重新加载。这对 WSGI 应用程序来说很成问题,因为任何非平凡的网络应用程序都会将其功能封装到模块和包中,而不是简单的独立脚本。事实证明重新加载模块非常棘手,因为如果您逐个重新加载()它们,它们很容易最终对旧版本产生错误的引用。理想情况下,向前发展的方法是在更新任何文件时重新加载整个 Python 解释器,但在实践中似乎有些 C 扩展不喜欢这样做,因此通常不会这样做。 有一些解决方法可以一次重新加载一组模块,当应用程序的其中一个模块被触及时,可以可靠地更新应用程序。我使用一个部署模块来完成此操作(我还没有发布,但如果您有兴趣,可以给您一个副本),它非常适合我自己的网络应用程序。但您确实需要一点纪律来确保您不会意外地将对旧模块对象的引用留在其他您没有重新加载的模块中;如果您正在谈论许多由代码可能泄漏的第三方编写的站点,这可能不理想。 在那种情况下,您可能需要考虑在守护程序模式下运行 mod_wsgi,为每个参与者提供一个应用程序组并执行进程级重新加载,并在更新任何模块时轻触 WSGI 脚本文件。 你对这个抱怨是正确的;这(以及许多其他 WSGI 部署问题)可以做一些标准化帮助。