Flask和WSGI的间歇性500 HTTP错误

时间:2013-08-14 23:53:52

标签: python apache flask mod-wsgi wsgi

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

我毫无根据的猜测是,在Apache下运行的不同进程在某些时候加载了应用程序的模块,并且在发布刷新时,他们不会“费心”更新此信息。

重新启动Apache服务器,从而终止所有这些进程并重新生成新进程,解决了这个问题。

答案 2 :(得分: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未重新加载引起的)