我在一个运行Ubuntu16.04的EC2实例上运行在Apache上的Flask应用程序中有一个令人讨厌的错误。每隔几个小时(3-5?)Flask应用程序停止工作-- Apache日志中没有错误--而其他目录继续正常工作。
htop,机器资源是很好的server-status的说法,Apache有大量空闲的工作人员/线程;Flask应用程序不是资源密集型的,一次只有5-10个用户。/var/log/apache2/error.log中没有任何错误(在应用程序停止工作之前,很多东西都会在这个应用程序中登录到这里)sites-enabled/default-ssl.conf读取(telephone-flask是烧瓶应用程序的名称):
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
#WSGIDaemonProcess flaskapp threads=8
WSGIScriptAlias /telephone-flask /var/www/telephone-flask/telephone-flask.wsgi
<Directory telephone-flask>
WSGIScriptReloading On
WSGIProcessGroup telephone-flask
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>`
</VirtualHost>
</IfModule>我使用的是mpm_events模块,下面的设置如下:
<IfModule mpm_event_module>
StartServers 8
MinSpareThreads 75
MaxSpareThreads 250
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 300
MaxConnectionsPerChild 0
</IfModule>如果它是相关的,我有一个动态DNS服务背后的实例的弹性IP,但我看不出这将如何影响Flask应用程序,而不是Apache提供的其他东西。
这个问题还会在哪里被记录?我的Apache配置有什么问题吗?有什么奇怪的事情发生在网络上吗?因为它在EC2上
发布于 2018-04-20 02:48:04
您的配置在许多方面都不正确。试着使用:
WSGIRestrictEmbedded On
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
WSGIDaemonProcess telephone-flask threads=5 request-timeout=60
WSGIScriptAlias /telephone-flask /var/www/telephone-flask/telephone-flask.wsgi process-group=telephone-flask application-group=%{GLOBAL}
<Directory /var/www/telephone-flask>
Require all granted
</Directory>
LogLevel info
</VirtualHost>
</IfModule>这里最重要的是让它正确地使用守护进程模式并添加request-timeout=60选项。
很可能您的应用程序正在锁定,而Apache最终只会扼杀它的子工作进程。
当请求陷入太长时间(所有线程平均60秒)时,request-timeout将强制重新启动守护进程。当发生这种情况时,它将丢弃Python堆栈跟踪您的代码被卡在哪里。
但是现在它也可能运行良好,因为不正确的Directory路径意味着WSGIApplicationGroup被忽略了。如果您在Python中使用第三方C扩展,如果没有在子解释器中正确地实现它们,它们就有可能是死锁的。
最后一件重要的事。不要使用来自Ubuntu的mod_wsgi包。它通常是古老的,不受支持,并且可能有错误在其中。根据Python堆栈的旧版本,可能不会正确地将其转储出去。从源代码中自己编译mod_wsgi。最简单的方法是使用pip方法,如下所示:
https://stackoverflow.com/questions/49931549
复制相似问题