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 日志中没有错误——而其他目录继续正常运行。
- 对于客户端,对 Flask 服务器的请求永远不会得到满足(只是超时,没有信息 503 等)
- 根据
htop
,机器资源很好
- 根据
server-status
,Apache 有大量空闲的工作线程/线程; Flask 应用程序不是资源密集型的,一次只有 ~5-10 个用户
- 我在
/var/log/apache2/error.log
中没有收到任何错误(在应用程序停止工作之前从 Flask 应用程序中记录了很多内容)
sites-enabled/default-ssl.conf
读取(telephone-flask
是 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
上
您的配置在很多方面都不正确。尝试使用:
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
方法,如以下所述:
我在 EC2 实例 运行 Ubuntu 16.04 上的 Apache 上的 Flask Web 应用程序 运行 中有一个讨厌的错误。每隔几个小时(3-5?),Flask 应用程序就会停止工作——Apache 日志中没有错误——而其他目录继续正常运行。
- 对于客户端,对 Flask 服务器的请求永远不会得到满足(只是超时,没有信息 503 等)
- 根据
htop
,机器资源很好
- 根据
server-status
,Apache 有大量空闲的工作线程/线程; Flask 应用程序不是资源密集型的,一次只有 ~5-10 个用户 - 我在
/var/log/apache2/error.log
中没有收到任何错误(在应用程序停止工作之前从 Flask 应用程序中记录了很多内容)
sites-enabled/default-ssl.conf
读取(telephone-flask
是 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
上您的配置在很多方面都不正确。尝试使用:
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
方法,如以下所述: