1

我正在尝试在运行 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>
4

3 回答 3

1

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

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

于 2015-09-06T10:51:00.173 回答
0

米格尔的回答是有道理的,确实重新启动服务器可以解决这个问题和其他问题(更改没有生效)。

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

重新启动 Apache 服务器,从而杀死所有这些进程并重新产生新的,解决了这个问题。

于 2013-08-16T01:10:50.780 回答
0

我有一个解决方案,它更像是一个黑客而不是一个解决方案,但它确实有效。

首先是背景,根据这篇文章中的 Graham Dumpleton https://github.com/GrahamDumpleton/mod_wsgi/issues/198

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

有解决此问题的建议,包括

  • 在 WSGIDaemonProcess 中使用启动超时
  • 在 WSGIDaemonProcess 中使用请求超时
  • 重启阿帕奇

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

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

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

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

于 2020-06-14T08:11:13.977 回答