首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache2.4/ mod_wsgi /烧瓶/Ubuntu16.04在EC2上几小时后停止工作

Apache2.4/ mod_wsgi /烧瓶/Ubuntu16.04在EC2上几小时后停止工作
EN

Stack Overflow用户
提问于 2018-04-19 23:08:16
回答 1查看 327关注 0票数 0

我在一个运行Ubuntu16.04的EC2实例上运行在Apache上的Flask应用程序中有一个令人讨厌的错误。每隔几个小时(3-5?)Flask应用程序停止工作-- Apache日志中没有错误--而其他目录继续正常工作。

  • 对于客户端,对Flask服务器的请求从未得到满足(只是超时,没有提供任何信息的503,等等)
  • 根据htop,机器资源是很好的
  • 根据server-status的说法,Apache有大量空闲的工作人员/线程;Flask应用程序不是资源密集型的,一次只有5-10个用户。
  • 我在/var/log/apache2/error.log中没有任何错误(在应用程序停止工作之前,很多东西都会在这个应用程序中登录到这里)

sites-enabled/default-ssl.conf读取(telephone-flask是烧瓶应用程序的名称):

代码语言:javascript
复制
<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模块,下面的设置如下:

代码语言:javascript
复制
<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上

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-20 02:48:04

您的配置在许多方面都不正确。试着使用:

代码语言:javascript
复制
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方法,如下所示:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49931549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档