6

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

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

PHP 很简单——你上传一个文件的新版本,新版本运行。

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

4

3 回答 3

7

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

如果您使用的是标准的 WSGI 模块,例如 Apache 的mod_wsgi,那么您不必重新启动服务器——只需触摸.wsgi文件,代码就会重新加载。如果您正在使用一些不支持 WSGI 的奇怪服务器,那么您在可用性方面有点靠自己。

于 2009-11-10T22:30:35.330 回答
4

取决于您如何部署 Python 应用程序。如果它是纯 Python CGI 脚本,则无需重新启动(但完全不建议,因为它会超级慢)。如果您在 Apache 中使用 modwsgi,则有重新加载源的有效方法。modpython 显然对模块重新加载有一些支持和伴随的问题

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

但是,除非您有特定的理由不使用它(因为您可能来自 Apache/PHP 商店),否则我强烈建议您在 Apache 上使用 mod_wsgi。我知道 Django 推荐在 Apache 上使用 modwsgi,而大多数其他主要的 Python 框架都可以在 modwsgi 上运行。

于 2009-11-10T22:06:45.280 回答
3

真的是这样吗?

这取决于。代码重新加载高度特定于托管解决方案。大多数服务器都提供了一些方法来自动重新加载 WSGI 脚本本身,但是没有标准化;实际上,WSGI 应用程序对象如何连接到 Web 服务器的问题在不同的托管环境中存在很大差异。(您几乎可以制作一个脚本文件,用作 CGI、mod_wsgi、passenger 和 ISAPI_WSGI 的部署胶水,但这并非完全无关紧要。)

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

有一些解决方法可以一次重新加载一组模块,当其中一个模块被触摸时,这些模块可以可靠地更新应用程序。我使用了一个部署模块来执行此操作(我还没有发布,但如果你有兴趣可以给你一份副本),它对我自己的 web 应用程序非常有用。但是您确实需要一点纪律,以确保您不会意外地将对旧模块对象的引用留在您没有重新加载的其他模块中;如果您正在谈论由第三方编写的大量网站,其代码可能会泄漏,那么这可能并不理想。

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

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

于 2009-11-10T22:58:47.940 回答