我正在尝试在运行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 + wsgi + Django上遇到了同样的问题。我已经尝试过setting up wsgi in Daemon mode,如Django手册所推荐,这似乎可以解决问题。我现在已经完成了1000次页面加载,没有500个响应。
使用Flask设置,相同的解决方案应该可以工作。
Miguel的答案很有意义,并且实际上重新启动服务器可以解决此问题和其他问题(更改未生效。
我没有根据的猜测是,在Apache下运行的不同进程有时会加载应用程序的模块,并且在发出刷新后,它们将不会“继续”更新此信息。
重新启动Apache服务器,从而杀死所有这些进程并重新产生新的进程,即可解决问题。
[我有一个解决方案,而不是真正的解决方案,但它更有效,但是它可以工作。
首先是背景,根据Graham Dumpleton在本文https://github.com/GrahamDumpleton/mod_wsgi/issues/198中所述>
[在守护程序模式下触摸WSGI文件时,始终会重新加载整个过程,但这取决于已成功加载WSGI文件。要解决WSGI文件无法加载但加载代码的位置将状态保留在内存中的问题(例如Django可能发生的情况),那么您需要使用WSGIDaemonProcess指令的startup-timeout选项来指定时间段,在此之后如果即使在随后的尝试之后仍然无法加载WSGI文件,也会发生强制重启。
有解决此问题的建议,包括
如果由于某些原因而喜欢我,那么您对所有这些都不满意,可以尝试的一种破解方法是触发另一个错误-这种错误将迫使wsgi重新加载。
就我而言,我注释掉了这一行
从{app name}导入应用程序为应用程序
在我的wsgi文件中。这引发了另一个错误,但是这次取消注释时强制重新加载,然后解决了最初的问题(这是由wsgi未重新加载引起的)]