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 报错

按钮单击在后续启动时会出现不同的错误

通过主管监督 virtualenv django 应用程序

在 Gunicorn / Flask 应用程序中的进程之间共享静态全局数据

CMFCLinkCtrl 在 VC++ 中与 dll 一起使用时会引发运行时错误

为啥 AVR-GCC 编译器在使用相同的变量但作为 PROGMEM 重载时会引发错误?