我来自PHP/Apache
运行应用程序非常容易的世界。每当PHP
应用程序崩溃时,运行该请求的 Apache 进程将停止,但服务器仍将愉快地破坏并响应其他客户端。有没有办法让 Python 应用程序以 smilar 的方式工作。我将如何设置 wsgi 服务器,Tornado
或者CherryPy
它会类似地工作?另外,我将如何从具有不同域的一台服务器上运行多个应用程序?
2 回答
无论如何,对于 WSGI 服务器,您所追求的可能会发生。这是因为任何 Python 异常只影响当前请求,框架或 WSGI 服务器会捕获异常,记录它并将其转换为 HTTP 500 状态页面。该应用程序仍将在内存中,并将继续处理未来的请求。
我们得到的是你所说的“崩溃 Apache 进程”究竟是什么意思。
您的代码很少会崩溃,因为整个过程由于核心转储而导致进程完全退出。因此,您是否对将应用程序语言级别错误等同于整个进程崩溃的术语感到困惑。
即使您确实找到了使进程崩溃的方法,Apache/mod_wsgi 也可以处理,并且该进程将被替换。Gunicorn WSGI 服务器也会这样做。CherryPy 不会,除非您有一个正在运行的进程管理器来监控它并且进程监视器重新启动它。Tornado 在其单进程模式下也会有同样的问题。在 Gunicorn 中使用 Tornado 作为 worker 是一种解决方法,而且我相信 Tornado 本身现在可能有一些进程管理器来运行多个进程,如果它们死亡,它可以重新启动进程。
请注意,如果导致 Python 异常的应用程序错误足够严重并且破坏了进程中的状态,则后续请求可能会出现问题。这是与 PHP 的一个区别。使用 PHP,在任何请求之后,无论成功与否,应用程序都会被有效地丢弃并且不会持续存在。因此错误代码不会影响后续请求。在 Python 中,由于加载代码和保留状态的进程保留在请求之间,因此从技术上讲,您可以使事情处于必须重新启动进程才能修复它的状态。我不知道有任何 WSGI 服务器,尽管它具有在一个请求返回错误响应时自动重新启动进程的机制。
如果您在类 UNIX 环境中,您可以在 Apache 下以守护程序模式运行mod_wsgi 。这意味着 Python 代码将有一个单独的进程,即使它崩溃,服务器也会继续正常运行(并且希望 WSGI 进程会自行重启)。一个 WSGI 应用程序可以在多个进程和每个进程的多个线程下运行。
至于在同一台服务器上运行多个域,请检查Name-Based Virtual Hosts。