You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:15:38