我正在尝试在运行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>
答案 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文件,则将强制重新启动进程。
有解决此问题的建议,包括
如果由于某些原因像我一样,您对所有这些都不满意,可以尝试的一种破解方法是触发另一个错误-这种错误将迫使wsgi重新加载。
就我而言,我注释掉了这一行
从{app name}导入应用程序作为应用程序
在我的wsgi文件中为。这引发了另一个错误,但是这次取消注释时强制重新加载,然后解决了最初的问题(这是由wsgi未重新加载引起的)