Flask和WSGI的间歇性500 HTTP错误

问题描述 投票:1回答:3

我正在尝试在运行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>
python apache flask mod-wsgi wsgi
3个回答
1
投票

我在Apache + wsgi + Django上遇到了同样的问题。我已经尝试过setting up wsgi in Daemon mode,如Django手册所推荐,这似乎可以解决问题。我现在已经完成了1000次页面加载,没有500个响应。

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


0
投票

Miguel的答案很有意义,并且实际上重新启动服务器可以解决此问题和其他问题(更改未生效。

我没有根据的猜测是,在Apache下运行的不同进程有时会加载应用程序的模块,并且在发出刷新后,它们将不会“继续”更新此信息。

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


0
投票

[我有一个解决方案,而不是真正的解决方案,但它更有效,但是它可以工作。

首先是背景,根据Graham Dumpleton在本文https://github.com/GrahamDumpleton/mod_wsgi/issues/198中所述>

[在守护程序模式下触摸WSGI文件时,始终会重新加载整个过程,但这取决于已成功加载WSGI文件。要解决WSGI文件无法加载但加载代码的位置将状态保留在内存中的问题(例如Django可能发生的情况),那么您需要使用WSGIDaemonProcess指令的startup-timeout选项来指定时间段,在此之后如果即使在随后的尝试之后仍然无法加载WSGI文件,也会发生强制重启。

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

  • 在WSGIDaemonProcess中使用启动超时
  • 在WSGIDaemonProcess中使用请求超时
  • 重新启动Apache
  • 如果由于某些原因而喜欢我,那么您对所有这些都不满意,可以尝试的一种破解方法是触发另一个错误-这种错误将迫使wsgi重新加载。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.