EC2 上的 Apache 2.4 / mod_wsgi / Flask / Ubuntu 16.04 在几个小时后停止工作

Apache 2.4 / mod_wsgi / Flask / Ubuntu 16.04 on EC2 stops working after a few hours

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

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

<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

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

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 最终只是终止了它的子工作进程。

当请求卡住时间过长时,request-timeout 将强制重启守护进程(所有线程平均 60 秒)。发生这种情况时,它会转储出 Python 代码卡住位置的堆栈跟踪。

但现在它也可能 运行 也很好,因为 Directory 的错误路径意味着 WSGIApplicationGroup 被忽略了。如果您使用的是 Python 的第三方 C 扩展,如果未实现它们以在子解释器中正常工作,它们可能会陷入僵局。

最后一件重要的事情。不要使用来自 Ubuntu 的 mod_wsgi 包。它通常是古老的,不受支持并且可能有错误。 Python 堆栈跟踪可能无法正确转储,具体取决于它们拥有的旧版本。从源代码自行编译 mod_wsgi。最简单的方法是使用 pip 方法,如以下所述: