迁移后Flask服务每日因werkzeug.utils缺失崩溃求助
问题描述
我有一个基于Flask和Werkzeug的服务,近期从Linux服务器迁移到Python服务器后,服务每天都会崩溃。卸载重装Werkzeug能暂时恢复,但一天后日志又会出现werkzeug.utils相关的ModuleNotFoundError。
错误日志
App 2048818 output: /opt/cpanel/ea-ruby27/root/usr/share/passenger/helper-scripts/wsgi-loader.py:26: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses App 2048818 output: import sys, os, re, imp, threading, signal, traceback, socket, select, struct, logging, errno App 2048818 output: Traceback (most recent call last): App 2048818 output: File "/opt/cpanel/ea-ruby27/root/usr/share/passenger/helper-scripts/wsgi-loader.py", line 369, in <module> App 2048818 output: App 2048818 output: app_module = load_app() App 2048818 output: File "/opt/cpanel/ea-ruby27/root/usr/share/passenger/helper-scripts/wsgi-loader.py", line 76, in load_app App 2048818 output: App 2048818 output: return imp.load_source('passenger_wsgi', startup_file) App 2048818 output: File "/opt/alt/python38/lib64/python3.8/imp.py", line 171, in load_source App 2048818 output: App 2048818 output: module = _load(spec) App 2048818 output: File "<frozen importlib._bootstrap>", line 702, in _load App 2048818 output: File "<frozen importlib._bootstrap>", line 671, in _load_unlocked App 2048818 output: File "<frozen importlib._bootstrap_external>", line 843, in exec_module App 2048818 output: File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed App 2048818 output: File "/home/inbotioc/public_html/sitemap-checker/passenger_wsgi.py", line 8, in <module> App 2048818 output: App 2048818 output: wsgi = imp.load_source('wsgi', 'sitemap-checker-pycode.py') App 2048818 output: File "/opt/alt/python38/lib64/python3.8/imp.py", line 171, in load_source App 2048818 output: App 2048818 output: module = _load(spec) App 2048818 output: File "<frozen importlib._bootstrap>", line 702, in _load App 2048818 output: File "<frozen importlib._bootstrap>", line 671, in _load_unlocked App 2048818 output: File "<frozen importlib._bootstrap_external>", line 843, in exec_module App 2048818 output: File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed App 2048818 output: File "sitemap-checker-pycode.py", line 5, in <module> App 2048818 output: App 2048818 output: from flask import Flask, request App 2048818 output: File "/home/inbotioc/virtualenv/public_html/sitemap-checker/3.8/lib/python3.8/site-packages/flask/__init__.py", line 5, in <module> App 2048818 output: App 2048818 output: from . import json as json App 2048818 output: File "/home/inbotioc/virtualenv/public_html/sitemap-checker/3.8/lib/python3.8/site-packages/flask/json/__init__.py", line 6, in <module> App 2048818 output: App 2048818 output: from ..globals import current_app App 2048818 output: File "/home/inbotioc/virtualenv/public_html/sitemap-checker/3.8/lib/python3.8/site-packages/flask/globals.py", line 6, in <module> App 2048818 output: App 2048818 output: from werkzeug.local import LocalProxy App 2048818 output: File "/home/inbotioc/virtualenv/public_html/sitemap-checker/3.8/lib/python3.8/site-packages/werkzeug/__init__.py", line 6, in <module> App 2048818 output: App 2048818 output: from .test import Client as Client App 2048818 output: File "/home/inbotioc/virtualenv/public_html/sitemap-checker/3.8/lib/python3.8/site-packages/werkzeug/test.py", line 41, in <module> App 2048818 output: App 2048818 output: from .utils import cached_property App 2048818 output: ModuleNotFoundError: App 2048818 output: No module named 'werkzeug.utils'
已安装包列表
blinker==1.6.2 cachelib==0.10.2 certifi==2023.7.22 charset-normalizer==3.2.0 click==8.1.7 elementpath==4.1.5 exceptiongroup==1.1.3 Flask==3.0.0 Flask-Session==0.5.0 idna==3.4 importlib-metadata==6.8.0 iniconfig==2.0.0 itsdangerous==2.1.2 Jinja2==3.1.2 lxml==4.9.3 MarkupSafe==2.1.3 packaging==23.2 pluggy==1.3.0 pytest==7.4.2 requests==2.31.0 tomli==2.0.1 urllib3==2.0.5 Werkzeug==3.0.1 xmlschema==2.5.0 zipp==3.17.0
解决方案
锁定依赖版本并强制重装
在requirements.txt中固定Flask和Werkzeug的版本:Flask==3.0.0 Werkzeug==3.0.1执行命令强制重新安装所有依赖,确保没有损坏的文件:
pip install -r requirements.txt --force-reinstall修正虚拟环境加载路径
在passenger_wsgi.py开头添加虚拟环境的包路径,确保加载器使用正确的依赖:import sys sys.path.insert(0, '/home/inbotioc/virtualenv/public_html/sitemap-checker/3.8/lib/python3.8/site-packages')替换废弃的imp模块加载方式
日志提示imp模块已废弃,修改passenger_wsgi.py中的代码,用importlib替代imp.load_source:import importlib.util spec = importlib.util.spec_from_file_location('wsgi', 'sitemap-checker-pycode.py') wsgi = importlib.util.module_from_spec(spec) spec.loader.exec_module(wsgi)检查服务器自动清理机制
排查服务器是否存在定时清理脚本,确认虚拟环境目录/home/inbotioc/virtualenv/public_html/sitemap-checker/3.8/lib/python3.8/site-packages/werkzeug的文件权限,确保服务进程有读写权限,避免文件被意外删除。
内容的提问来源于stack exchange,提问作者Keivan Ghazalbash
相关产品推荐
相关产品推荐

