Flask+Gunicorn部署配置supervisor时No module found异常求助
Flask + Supervisor 部署报错:找不到flask模块
问题描述
开发Flask应用后尝试部署到Linux服务器,参照官方部署文档操作时,在supervisor配置环节遇到阻塞。
当前环境为Python 3.7版本虚拟环境,已安装全部项目依赖,手动激活虚拟环境后执行以下命令可正常启动服务:
source venv/bin/activate gunicorn -w 3 flask_app:app
按照文档指引在虚拟环境内通过pip安装supervisor,完成配置后启动服务抛出如下错误:
[2022-06-06 02:44:54 +0000] [9205] [INFO] Using worker: sync [2022-06-06 02:44:54 +0000] [9209] [INFO] Booting worker with pid: 9209 [2022-06-06 02:44:54 +0000] [9209] [ERROR] Exception in worker process Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 583, in spawn_worker worker.init_process() File "/usr/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 129, in init_process self.load_wsgi() File "/usr/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 138, in load_wsgi self.wsgi = self.app.wsgi() File "/usr/lib/python2.7/dist-packages/gunicorn/app/base.py", line 67, in wsgi self.callable = self.load() File "/usr/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load return self.load_wsgiapp() File "/usr/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp return util.import_app(self.app_uri) File "/usr/lib/python2.7/dist-packages/gunicorn/util.py", line 375, in import_app __import__(module) File "/var/www/app/__init__.py", line 3, in <module> from app.db import db_session File "/var/www/app/db.py", line 1, in <module> from flask import current_app, g ImportError: No module named flask
故障原因
报错日志明确显示,supervisor启动时调用了系统Python 2.7路径下的全局gunicorn,没有加载项目Python 3.7虚拟环境的依赖,因此抛出找不到flask模块的错误。
解决步骤
- 首先获取虚拟环境内gunicorn的绝对路径,进入项目根目录执行如下命令,记录输出的路径:
readlink -f venv/bin/gunicorn
- 编辑supervisor对应的项目配置文件(通常存放在
/etc/supervisor/conf.d/目录下,以.conf为后缀),调整配置:command项直接使用刚才查到的gunicorn绝对路径,不要写source venv/bin/activate && gunicorn这类shell激活命令,supervisor不会加载shell交互环境,这类写法无法正常生效- 显式在配置中添加虚拟环境的环境变量,指定PATH优先级
参考配置如下,替换成自己的项目实际路径即可:
[program:flask_app] command=/var/www/your_project/venv/bin/gunicorn -w 3 flask_app:app directory=/var/www/your_project user=www-data autostart=true autorestart=true redirect_stderr=true stdout_logfile=/var/log/flask_app/gunicorn.log environment=PATH="/var/www/your_project/venv/bin",VIRTUAL_ENV="/var/www/your_project/venv"
- 保存配置后,重新加载supervisor配置并重启服务:
supervisorctl reread supervisorctl update supervisorctl restart flask_app
- 校验启动结果:执行
ps aux | grep gunicorn查看进程启动路径,确认gunicorn是从虚拟环境目录启动、没有调用系统Python2.7路径下的版本,即修复完成。
补充说明:不建议在虚拟环境内安装supervisor,直接用系统包管理器安装全局supervisor即可,只要配置中指定了虚拟环境内的gunicorn路径和环境变量,就不会出现环境混用的问题。
内容的提问来源于stack exchange,提问作者Stefan Radonjic
相关产品推荐
相关产品推荐

