Azure Flask Web App搭配Azure SQL部署后每日出现500服务器错误求助
Flask Azure部署间歇性500问题排查方案
1. 优先开启全链路日志定位根因
- 开启Flask应用的运行日志(生产环境不要开启DEBUG模式,仅开启日志输出即可),添加全局500错误捕获器,将完整异常栈打印到应用日志:
import logging from flask import Flask app = Flask(__name__) # 配置日志输出级别 app.logger.setLevel(logging.INFO) # 全局捕获500错误,输出完整异常信息 @app.errorhandler(500) def handle_500_error(e): app.logger.error(f"Unhandled exception: {e}", exc_info=True) return "Internal Server Error", 500
- 开启Azure App Service的日志记录:在Azure门户对应应用服务的「监视>应用服务日志」中,打开应用程序日志(文件系统),保留期限设为7天,故障发生后直接下载日志即可查看具体报错信息。
2. 排查数据库连接失效问题(匹配当前现象的最高概率原因)
Azure SQL默认会自动断开空闲超过300秒的连接,如果你使用SQLAlchemy等ORM工具未配置连接回收策略,会导致应用从连接池拿到已失效的连接,请求时报500错误,重启应用时连接池重建就会恢复正常:
- 如果你使用Flask-SQLAlchemy,添加如下配置:
# 连接回收时间小于Azure SQL的300秒空闲超时 app.config['SQLALCHEMY_POOL_RECYCLE'] = 299 # 每次从连接池取连接前先校验连接有效性 app.config['SQLALCHEMY_ENGINE_OPTIONS'] = { 'pool_pre_ping': True, 'pool_recycle': 299 }
- 排查连接泄漏问题:确认所有数据库操作完成后都正确释放连接,避免连接数占满Azure SQL的上限。
3. 排查Azure App Service配置问题
- 开启Always On功能:在Azure门户对应应用服务的「设置>配置>平台设置」中,将Always On切换为开启状态,避免应用长时间空闲被系统自动回收后重启失败。
- 确认运行时版本匹配:检查应用服务的Python运行时版本是否为3.8,和本地开发环境保持一致。
- 检查WSGI服务器配置:如果你使用Gunicorn作为生产服务器,确认worker超时时间配置不低于30秒,worker数设置为
2 * CPU核心数 +1,避免worker被强制Kill导致500错误。
4. 排查本地存储依赖问题
Azure App Service的本地临时存储(/tmp目录)会在应用重启、平台迁移时自动清空,如果你的应用将session、缓存、配置文件等需要持久化的数据存在本地临时目录,数据清空后会触发业务报错,重启/重部署时重新生成临时数据就会恢复正常,建议将这类持久化数据存储到Azure Redis、Azure存储或者数据库中。
内容的提问来源于stack exchange,提问作者ZaraThoustra
相关产品推荐
相关产品推荐

