【问题标题】:How to setup WSGI server to run similarly to Apache?如何设置 WSGI 服务器以与 Apache 类似地运行?
【发布时间】:2023-11-18 00:07:01
【问题描述】:

我来自PHP/Apache 世界,运行应用程序非常容易。每当PHP 应用程序崩溃时,运行该请求的 Apache 进程将停止,但服务器仍将愉快地破坏并响应其他客户端。有没有办法让 Python 应用程序以 smilar 的方式工作。我将如何设置像TornadoCherryPy 这样的wsgi 服务器,以便它可以类似地工作?另外,我如何从具有不同域的一台服务器上运行多个应用程序?

【问题讨论】:

    标签: python tornado wsgi cherrypy


    【解决方案1】:

    对于 WSGI 服务器,您所追求的可能无论如何都会发生。这是因为任何 Python 异常只影响当前请求,框架或 WSGI 服务器会捕获异常,记录它并将其转换为 HTTP 500 状态页面。该应用程序仍将在内存中,并将继续处理未来的请求。

    我们所了解的是您所说的“使 Apache 进程崩溃”的确切含义。

    您的代码很少会崩溃,因为整个进程由于核心转储而导致进程完全退出。那么,您是否对将应用程序语言级别错误等同于整个进程崩溃的术语感到困惑。

    即使您确实找到了使进程崩溃的方法,Apache/mod_wsgi 也可以处理,并且该进程将被替换。 Gunicorn WSGI 服务器也会这样做。 CherryPy 不会,除非您有一个正在运行的进程管理器来监控它并且进程监视器重新启动它。 Tornado 在其单进程模式下也会有同样的问题。在 Gunicorn 中使用 Tornado 作为 worker 是一种解决方法,而且我相信 Tornado 本身现在可能有一些进程管理器来运行多个进程,如果它们死亡,它可以重新启动进程。

    请注意,如果导致 Python 异常的应用程序错误足够严重并且破坏了进程中的状态,则后续请求可能会出现问题。这是与 PHP 的一个区别。使用 PHP,在任何请求之后,无论成功与否,应用程序都会被有效地丢弃并且不会持续存在。因此错误代码不会影响后续请求。在 Python 中,由于加载代码和保留状态的进程保留在请求之间,因此从技术上讲,您可以使事情处于必须重新启动进程才能修复它的状态。我不知道有任何 WSGI 服务器,尽管它具有在一个请求返回错误响应时自动重启进程的机制。

    【讨论】:

    • 格雷厄姆,很抱歉我在谈论应用程序语言错误,例如未捕获的异常。感谢您详尽的回答。
    【解决方案2】:

    如果您处于类 UNIX 环境中,您可以在 Apache 下以守护程序模式运行 mod_wsgi。这意味着 Python 代码将有一个单独的进程,即使它崩溃,服务器也会继续正常运行(并且希望 WSGI 进程会自行重启)。一个 WSGI 应用程序可以在多个进程下运行,每个进程可以有多个线程。

    至于在同一台服务器上运行多个域,请查看Name-Based Virtual Hosts

    【讨论】:

    • +1。当代码更改时,甚至可以让 mod_wsgi 自动重新加载(在 mod_wsgi 网站上有示例代码)。
    最近更新 更多