求助:Apache 2.4/mod_wsgi/Flask在EC2 Ubuntu16.04上运行数小时后停止响应
排查Apache+Flask间歇性无响应问题(Ubuntu 16.04)
这种没有错误日志、资源还充足的间歇性挂掉确实挺棘手的,我之前处理过类似的生产环境问题,给你几个实用的排查方向和解决方案:
1. 检查WSGI守护进程的超时配置
Apache的mod_wsgi守护进程如果没有设置合理的超时,很容易出现僵死进程——看起来进程还在,但完全不处理请求。你可以修改虚拟主机或全局WSGI配置:
WSGIDaemonProcess flask_app processes=4 threads=10 display-name=%{GROUP} process-timeout=300 # 5分钟无活动就重启进程 request-timeout=60 # 单个请求超时时间 WSGIProcessGroup flask_app
设置process-timeout是关键,让Apache自动回收僵死的Flask进程,避免积累导致无响应。
2. 补全Flask和WSGI的详细日志
Apache日志没报错不代表Flask内部没出问题,很多时候是日志没配置到位。在你的Flask应用里添加文件日志:
import logging from logging.handlers import RotatingFileHandler # 配置Flask日志 handler = RotatingFileHandler( '/var/log/flask/app.log', maxBytes=1024*1024*5, # 5MB backupCount=5 ) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) handler.setLevel(logging.DEBUG) app.logger.addHandler(handler) app.logger.setLevel(logging.DEBUG)
同时在Apache配置里开启WSGI专用日志:
WSGILogFile /var/log/apache2/flask_wsgi.log WSGILogLevel debug
下次出现问题时,先看这两个日志,大概率能找到线索。
3. 排查外部依赖的连接泄漏
如果你的Flask应用用到了数据库(MySQL/PostgreSQL)、Redis或其他外部服务,很可能是连接没正确关闭导致连接池耗尽,进程僵死。
- 检查数据库操作代码,确保用上下文管理器自动关闭连接:
with db.session() as session: # 执行查询/修改操作 - 用
netstat -anp | grep 3306(替换成你的数据库端口)查看是否有大量TIME_WAIT或ESTABLISHED的连接,要是数量异常高,就是连接泄漏了。
4. 调整系统文件句柄限制
Ubuntu默认的文件句柄数(1024)对于Apache+Flask的部署可能不够,当进程打开的文件/连接数达到上限时,就会出现无响应但无日志的情况。
- 修改
/etc/security/limits.conf:www-data soft nofile 4096 www-data hard nofile 8192 - 重启Apache生效:
systemctl restart apache2
5. 添加进程监控自动重启
如果以上配置调整后还是偶尔出问题,可以加个简单的监控脚本,自动恢复服务。比如写个bash脚本check_flask.sh:
#!/bin/bash # 替换成你的Flask应用健康检查端点 HEALTH_URL="http://localhost/health" curl -s --connect-timeout 5 --max-time 10 $HEALTH_URL > /dev/null if [ $? -ne 0 ]; then echo "$(date): Flask无响应,重启Apache" >> /var/log/flask/monitor.log systemctl restart apache2 fi
然后加到crontab里,每5分钟检查一次:
crontab -e # 添加一行 */5 * * * * /path/to/check_flask.sh
6. 考虑升级mod_wsgi或更换部署方式
Ubuntu 16.04自带的mod_wsgi版本比较老,可能存在已知的僵死bug。你可以尝试通过pip安装最新版:
pip install mod_wsgi # 然后替换Apache里的mod_wsgi模块路径
如果还是不行,也可以考虑换成uWSGI + Nginx的部署组合,稳定性通常比mod_wsgi更好。
内容的提问来源于stack exchange,提问作者imadrin
相关产品推荐
相关产品推荐

