【问题标题】:Intermitent 500 HTTP errors with Flask and WSGIFlask 和 WSGI 的间歇性 500 HTTP 错误
【发布时间】:2026-01-07 22:25:05
【问题描述】:

我正在尝试在运行 Apache 和 mod_wsgi 的机器上设置 Flask 应用程序。我的应用程序“随机”运行良好,这意味着有时它可以工作,有时我刷新它并引发内部服务器错误。这似乎很随机.. 我已经清除了浏览器的缓存,尝试了不同的浏览器,尝试了隐身模式,请朋友从他的笔记本电脑上尝试。它总是显示这种间歇性的 500 行为。

有没有人知道我可以在哪里寻找原因?或者你以前也遇到过这个问题?

我能想到的所有数据都在下面,如果您需要其他信息,请告诉我。

谢谢!


刷新失败时,Apache error_log 显示如下:

[Wed Aug 14 16:42:52 2013] [error] [client 171.65.95.100] mod_wsgi (pid=1160): Target WSGI script '/home/server/servers/flaskapp.wsgi' cannot be loaded as Python module.
[Wed Aug 14 16:42:52 2013] [error] [client 171.65.95.100] mod_wsgi (pid=1160): Exception occurred processing WSGI script '/home/server/servers/flaskapp.wsgi'.
[Wed Aug 14 16:42:52 2013] [error] [client 171.65.95.100] Traceback (most recent call last):
[Wed Aug 14 16:42:52 2013] [error] [client 171.65.95.100]   File "/home/server/servers/flaskapp.wsgi", line 5, in <module>
[Wed Aug 14 16:42:52 2013] [error] [client 171.65.95.100]     from flaskapp.frontend import app
[Wed Aug 14 16:42:52 2013] [error] [client 171.65.95.100] ImportError: cannot import name app

应用程序是这样组织的:

flaskapp.wsgi
flaskapp/
    __init__.py (empty)
    settings.py
    frontend/
        __init__.py (app is defined here)
        static/
            style.css
        templates/
            index.html
        views.py

init.py 包含以下内容:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config.from_object('flaskapp.settings')
db = SQLAlchemy(app)

import flaskapp.views

Apache httpd.conf文件中与本应用相关的配置文件为:

<VirtualHost *:80>
        ServerName <redacted>

        WSGIDaemonProcess flaskapp user=server group=server
        WSGIScriptAlias /flaskapp /home/server/servers/flaskapp.wsgi

        <Directory /home/server/servers/flaskapp/>
            WSGIProcessGroup flaskapp
            WSGIApplicationGroup %{GLOBAL}
            Order allow,deny
            Allow from all
        </Directory>

</VirtualHost>

【问题讨论】:

  • 在 apache 尝试重新加载应用程序时,您是否有机会使用 scp 之类的方法更新应用程序?复制操作在 Linux 中不是原子操作。
  • 我无法解释原因,但间歇性错误可能是由于一部分工作进程处于不良状态所致。完全重启服务器后是否也会发生这种情况?
  • @PauloScardine:我没有使用 scp PS。很抱歉没有早点回复,错过了通知..
  • @Miguel:我停止了 httpd 守护进程几秒钟,然后重新启动它。同样的事情也会发生。昨天我在摆弄一些设置,但它停止了。我以为是因为工作人员确实无法正确导入应用程序,所以我在导入函数时添加了一个 os.chdir 语句,现在一切顺利.. 很奇怪。

标签: python apache flask mod-wsgi wsgi


【解决方案1】:

我在 Apache+wsgi+Django 上遇到了同样的问题。我已经按照 Django 手册的建议尝试了setting up wsgi in Daemon mode,这似乎解决了问题。我现在已经完成了 1000 次页面加载,但没有 500 次响应。

同样的解决方案应该可以使用 Flask 设置。

【讨论】:

    【解决方案2】:

    Miguel 的回答很有意义,并且确实重新启动服务器解决了这个问题和其他问题(更改未生效)。

    我未经证实的猜测是,在 Apache 下运行的不同进程有时会加载应用程序的模块,并且在发出刷新时它们不会“打扰”更新此信息。

    重新启动 Apache 服务器,从而杀死所有这些进程并重新生成新进程,即可解决问题。

    【讨论】:

      【解决方案3】:

      我有一个解决方案,它更像是一个 hack,而不是真正的解决方案,但它确实有效。

      首先是背景,根据本文中 Graham Dumpleton 的说法https://github.com/GrahamDumpleton/mod_wsgi/issues/198

      当在守护模式下接触一个 WSGI 文件时,整个进程总是被重新加载,但这依赖于 WSGI 文件已经被成功加载。为了解决 WSGI 文件加载失败,但加载的代码将状态留在内存中的问题,就像 Django 可能发生的那样,您需要使用 WSGIDaemonProcess 指令的启动超时选项来指定一个时间段,之后如果在后续尝试后仍然无法加载 WSGI 文件,则会发生强制进程重启。

      有解决这个问题的建议,包括

      • 在 WSGIDaemonProcess 中使用启动超时
      • 在 WSGIDaemonProcess 中使用请求超时
      • 重启apache

      如果由于某些原因像我一样,您对所有这些都不满意,您可以尝试一种技巧来触发另一个错误 - 那种会迫使 wsgi 重新加载的错误。

      就我而言,我注释掉了这一行

      从 {app name} 导入应用程序作为应用程序

      在我的 wsgi 文件中。这引发了另一个错误,但这次在我取消注释时强制重新加载,然后解决了最初的问题(这是由 wsgi 未重新加载引起的)

      【讨论】: