gunicorn 使用主管启动时会引发数据库错误,手动启动时是不是正常工作?
Posted
技术标签:
【中文标题】gunicorn 使用主管启动时会引发数据库错误,手动启动时是不是正常工作?【英文标题】:gunicorn when started using supervisor throws database error, works properly when manually started?gunicorn 使用主管启动时会引发数据库错误,手动启动时是否正常工作? 【发布时间】:2021-02-22 01:56:58 【问题描述】:我创建了一个简单的 Flash 网站,并将其部署在服务器中,使用 nginx 作为前端,gunicorn 作为后端来运行 python 代码。使用此设置,一切正常。但是,如果我使用主管模块运行服务器,则会出现以下错误。我已经确保所有的环境变量都是可访问的,它们被放置在主目录下的 .bashrc 中。
不确定缺少什么。我的 python 代码部署在 pipenv 虚拟环境中的服务器中。主管仅在 virtualenv 中启动。不确定它是否有任何相关性。
主管的错误日志
[2020-11-10 05:45:29,604] 应用程序中的错误:/home [GET] 上的异常 Traceback(最近一次通话最后一次):文件 “/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/sqlalchemy/util/_collections.py”, 第 1020 行,在 调用 return self.registry[key] KeyError: 139749229659968
在处理上述异常的过程中,又发生了一个异常:
Traceback(最近一次调用最后一次):文件 “/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/flask/app.py”, 第 2447 行,在 wsgi_app 中 响应 = self.full_dispatch_request() 文件“/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/flask/app.py”, 第 1952 行,在 full_dispatch_request 中 rv = self.handle_user_exception(e) 文件“/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/flask/app.py”, 第 1821 行,在 handle_user_exception 中 reraise(exc_type,exc_value,tb)文件“/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/flask/_compat.py”, 第 39 行,在再加注中 提高价值文件“/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/flask/app.py”, 第 1950 行,在 full_dispatch_request 中 rv = self.dispatch_request() 文件“/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/flask/app.py”, 第 1936 行,在 dispatch_request 中 返回 self.view_functionsrule.endpoint 文件“/home/anandraj/FlaskProject/Proj2/main/routes.py”,第 12 行,在 home 帖子 = Post.query.order_by(Post.date_posted.desc()).paginate(page=page, per_page=7) 文件 "/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/flask_sqlalchemy/init.py", 第 514 行,在 get 返回 type.query_class(mapper, session=self.sa.session()) 文件“/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/sqlalchemy/orm/scoping .py", 第 78 行,在 调用 返回 self.registry() 文件“/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/sqlalchemy/util/collections.py”, 第 1022 行,在 调用 返回 self.registry.setdefault(key, self.createfunc()) 文件“/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/sqlalchemy/orm/session.py ", 第 3300 行,在 调用 return self.class(**local_kw) 文件 "/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/flask_sqlalchemy/init.py", 第 138 行,在 init 中 bind = options.pop('bind', None) 或 db.engine File "/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/flask_sqlalchemy/init .py", 第 943 行,在引擎中 返回 self.get_engine() 文件“/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/flask_sqlalchemy/init.py”, 第 962 行,在 get_engine 返回 connector.get_engine() 文件“/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/flask_sqlalchemy/init.py”, 第 555 行,在 get_engine options = self.get_options(sa_url, echo) 文件 "/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/flask_sqlalchemy/init.py ", 第 570 行,在 get_options 中 self._sa.apply_driver_hacks(self._app, sa_url, options) 文件 "/home/anandraj/.local/share/virtualenvs/FlaskProject-tLcktdEC/lib/python3.8/site-packages/flask_sqlalchemy/init强>.py", 第 883 行,在 apply_driver_hacks if sa_url.drivername.startswith('mysql'): AttributeError: 'NoneType' object has no attribute 'drivername'
主管配置
cat /etc/supervisor/conf.d/supervisord.conf [program:Proj2] directory=/home/<user>/FlaskProject command=/home/<user>/.local/share/virtualenvs/FlaskProject->tLcktdEC/bin/gunicorn -w 3 run:app user=<user> autostart=true autorestart=true stopasgroup=true killasgroup=true stderr_logfile=/var/log/flaskblog/Proj2Flask.err.log stdout_logfile=/var/log/flaskblog/Proj2Flask.out.log
查询数据库时出错
~/FlaskProject/Proj2/main$ cat routes.py
from flask import render_template, request, Blueprint
from Proj2.models import Post
main = Blueprint('main', __name__)
@main.route("/")
@main.route("/home")
def home():
page = request.args.get('page', 1, type=int)
posts = Post.query.order_by(Post.date_posted.desc()).paginate(page=page, per_page=7)
return render_template('home.html', posts=posts)
@main.route("/about")
def about():
return render_template('about.html', title='Anandraj')
我的应用是如何初始化的?
~/FlaskProject/Proj2$ cat __init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
from flask_mail import Mail
from Proj2.config import Config
db = SQLAlchemy()
bcrypt = Bcrypt()
login_mgr = LoginManager()
login_mgr.login_view = 'users.login'
login_mgr.login_message_category = 'info'
mail = Mail()
def create_app(config_class=Config):
app = Flask(__name__)
app.config.from_object(Config)
db.init_app(app)
bcrypt.init_app(app)
login_mgr.init_app(app)
mail.init_app(app)
from Proj2.users.routes import users
from Proj2.posts.routes import posts
from Proj2.main.routes import main
from Proj2.errors.handler import errors
app.register_blueprint(users)
app.register_blueprint(posts)
app.register_blueprint(main)
app.register_blueprint(errors)
return app(FlaskProject)
【问题讨论】:
您是否正确检查了您的环境设置? 欢迎来到 SO。请格式化您的回溯并包括您如何运行脚本和代码的相关部分,特别是在第 12 行附近 按要求更新了信息。我仔细检查了我的代码,环境变量是 .bashrc 的一部分,它们总是可以访问的。 【参考方案1】:你能发布你的主管配置文件吗?我的猜测是它与您的PATH
定义有关...
编辑(11 月 12 日):看到您是主管配置文件后,我注意到您尚未设置环境路径。
KEY="val",KEY2="val2" 形式的键/值对列表,将放置在 supervisord 进程的环境中(并因此放置在其所有子进程的环境中)
来自:https://docs.red-dove.com/supervisor/configuration.html
您可以尝试将其添加到您的配置文件中吗?这会将您的 PATH
定义为运行 gunicorn 的环境的“/usr/bin/”。如果这不起作用,请尝试使用运行 virtualenv 的路径。
environment=PATH="/usr/bin"
【讨论】:
这也没有帮助:(以上是关于gunicorn 使用主管启动时会引发数据库错误,手动启动时是不是正常工作?的主要内容,如果未能解决你的问题,请参考以下文章
Nginx+Gunicorn+Supervisor+Django 报错
在 Gunicorn / Flask 应用程序中的进程之间共享静态全局数据