Nginx后端Flask/Python应用运行约24小时后uWSGI段错误求助
Flask/uWSGI在M1 Mac上运行12-24小时后出现段错误的解决方案
问题核心
你的Flask应用通过uWSGI运行在M1 Mac裸机环境,接收请求后启动Python线程执行Docker部署,运行12-24小时后触发段错误。从崩溃栈来看,问题出在Python的_scproxy模块调用macOS系统代理配置时,大概率是ARM64架构下的兼容性bug或多线程竞态条件导致。
具体解决方案
1. 直接禁用代理自动检测
段错误的触发点是获取系统代理配置,绕过这个逻辑可以直接避免崩溃:
- 代码层面:给requests强制清空代理配置
import requests # 全局设置,所有requests请求都不使用代理 session = requests.Session() session.proxies = {"http": None, "https": None} - 环境变量层面:在uWSGI配置中添加环境变量,强制禁用代理检测
修改uwsgi.ini,新增以下配置:env = NO_PROXY=* env = REQUESTS_NO_PROXY=* env = HTTP_PROXY= env = HTTPS_PROXY=
2. 升级依赖版本
M1 Mac的ARM64架构对旧版本软件支持不完善,升级到最新稳定版:
- 升级uWSGI到2.0.25及以上版本:
pip install --upgrade uwsgi - 升级Python到3.11或更高版本,新版本对ARM64的系统API调用兼容性更好。
3. 替换Python线程为异步任务队列
uWSGI Worker进程与Python线程的组合容易引发资源冲突,改用专业异步框架:
- 使用Celery搭配Redis或RabbitMQ,将Docker部署任务交给独立的Celery Worker执行,uWSGI只负责处理请求并返回响应,彻底避免在Worker进程内运行长时间线程。
4. 优化uWSGI配置,增强崩溃自愈能力
调整uWSGI配置,让Master进程自动处理崩溃的Worker:
修改uwsgi.ini,添加以下配置:
[uwsgi] # 保留原有配置,新增以下内容 reload-on-exit = true # Worker进程退出时自动重启 max-requests = 1000 # 每个Worker处理1000个请求后自动重启,避免积累异常状态 harakiri = 300 # 任务执行超过5分钟则强制杀死Worker(根据你的部署时长调整)
内容的提问来源于stack exchange,提问作者Justin Hammond
相关产品推荐
相关产品推荐

