TL; DR编辑:我没有设置正确的文件夹权限.
当我运行烧瓶时,一切正常source venv/bin/activate && python run.py
.
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, world!"
if __name__ == "__main__":
app.debug = True
app.run(host='0.0.0.0', port=8080)
Run Code Online (Sandbox Code Playgroud)
但是当我使用nginx/emperor.uwsgi运行相同的应用程序时,每次命中服务器都会返回500.如果我注释掉SQLAlchemy导入,那么页面会按预期加载.
根据这个线程我尝试启用lazy/lazy-app,但它没有任何效果.Flask正在引发异常,因此nginx/uwsgi没有记录任何内容.
我尝试过使用from werkzeug.debug import DebuggedApplication
但仍然只是在我的浏览器中获得绝对的"内部服务器错误".
配置:
[uwsgi]
uid = http
gid = http
socket = /var/run/project.uwsgi.sock
chown-socket = http
chmod-socket = 664
pidfile = /var/run/project.master.pid
master = true
lazy = true
lazy-apps = true
chdir = /srv/http/project
python-path = …
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个 Python 模型,该模型能够使用多线程模块和 peewee 在 PostgreSQL 数据库中进行一些处理。
但是,在单核模式下,代码可以工作,但是,当我尝试使用多核运行代码时,我遇到了 SSL 错误。
我想发布我的模型的结构,希望有人可以建议如何以适当的方式设置我的模型。目前,我选择使用面向对象的方法,在该方法中我建立一个在池中共享的连接。为了澄清我所做的,我现在将展示我目前拥有的源代码
我有三个文件:main.py、models.py 和 parser.py。内容如下
models.py 定义了 peewee postgresql 表并连接到 postgres 服务器
import peewee as pw
from playhouse.pool import PooledPostgresqlExtDatabase
KVK_KEY = "id_number"
NAME_KEY = "name"
N_VOWELS_KEY = "n_vowels"
# initialise the data base
database = PooledPostgresqlExtDatabase(
"testdb", user="postgres", host="localhost", port=5432, password="xxxx",
max_connections=8, stale_timeout=300 )
class BaseModel(pw.Model):
class Meta:
database = database
only_save_dirty = True
# this class describes the format of the sql data base
class Company(BaseModel):
id_number = pw.IntegerField(primary_key=True) …
Run Code Online (Sandbox Code Playgroud) 我正在尝试设置django的conn_max_age
设置.
我从uwsgi那里得到错误
django.db.utils.DatabaseError: SSL error: decryption failed or bad record mac
它似乎与uWSGI,Flask,sqlalchemy和postgres有关:SSL错误:解密失败或错误记录mac
该帖子说打开lazy-apps
选项.
我想确保找到问题的正确解决方案并且我用Google搜索,uwsgi conn_max_age
但没有其他文档提及此问题或解决方案.
如果django + uwsgi是一个流行的组合,conn_max_age也是一个很好的选择用于生产,为什么没有多少提到警告.
我正在使用在 docker 容器中运行的 uWSGI 部署 Flask 应用程序。在有 4 个工作人员的应用程序中,有一些内存字典存储应用程序使用的“缓存值”,以防止每次都需要查询数据库。这些字典是在工作人员初始化时创建的,我正在尝试使用 uWSGI 的信号框架来强制更新所有工作人员中的缓存。
我最初的想法是:
例子:
def update_dicts(sig):
# Update dictionaries here
print('Received signal {}: updating dicts in worker {}'.format(sig, uwsgi.worker_id()))
uwsgi.register_signal(100, "workers", update_dicts)
Run Code Online (Sandbox Code Playgroud)
并在需要时在任何工人中触发信号:
uwsgi.signal(100)
Run Code Online (Sandbox Code Playgroud)
然而,即使信号以“工人”为目标,信号也只能由一名工人接收和处理,就好像它有“工人”作为目标一样。
我还尝试为每个工人注册一个信号(使用目标“workerN”)并触发所有这些信号,但信号被发送给任何工人,而不是指定的工人:
# Each worker executes this
# Signal registrations: 111, 112, 113, 114
uwsgi.register_signal(110 + uwsgi.worker_id(), "worker{}".format(uwsgi.worker_id()), update_service_dicts)
# To trigger the signals:
for i in [1,2,3,4]:
uwsgi.signal(110 + i)
Run Code Online (Sandbox Code Playgroud)
应用程序日志:
[uwsgi-signal] signum 113 registered (wid: 3 modifier1: 0 …
Run Code Online (Sandbox Code Playgroud) 我一直在我的Flask应用程序中遇到持久性错误:
OperationalError: (_mysql_exceptions.OperationalError) (2006, 'MySQL server has gone away')
Run Code Online (Sandbox Code Playgroud)
我正在使用mySQL服务器实例和Flask-SQLAlchemy模块.我仔细检查了mySQL实例上的连接的到期时间以及SQLAlchemy配置中的重置时间.没有问题,在mySQL连接到期之前重置连接池.我得出结论,必须有一些问题导致连接关闭,然后该连接的下一个用户窒息.
我正在使用生成四个进程的uWSGI来运行Flask应用程序.如果我切换到单个进程,我无法重现错误.我猜测进程是通过共享连接池相互踩踏的.每当uWSGI分叉进程时,我都会添加以下函数.
from uwsgidecorators import postfork
@postfork
def reset_db_connections():
db.engine.dispose()
Run Code Online (Sandbox Code Playgroud)
在启动时工作正常,并且当多个请求同时进入时似乎解决了问题.但是,现在当一个进程被重置时,该进程的下一个请求会以类似但不一样的方式爆炸,SQL Server已经消失了.这是数据库的初始设置代码
def configure_db():
from my_application.models import SomeModel
db.create_all()
db = SQLAlchemy(app, session_options={'expire_on_commit': False})
configure_db()
Run Code Online (Sandbox Code Playgroud)
数据库的典型用法如下所示:
def save(self):
try:
db.session.add(self)
db.session.commit()
except Exception, ex:
app.logger.error("Error saving campaign: %s" % ex)
db.session.rollback()
Run Code Online (Sandbox Code Playgroud)
读取是以下两种风格之一:
user = db.session.query(User).filter(User.email == email).scalar()
user = User.query.filter(User.email == email).scalar()
Run Code Online (Sandbox Code Playgroud)
我的理解是Flask-SQLAlchemy使用范围会话,因此他们应该在多进程环境中提供一些保护.我需要在fork上重置连接池吗?在分叉时我是否也应该检查实时会话?
我把fork更改为:
@postfork
def reset_db_connections():
db.session.close_all()
db.engine.dispose()
db.create_scoped_session()
Run Code Online (Sandbox Code Playgroud)
我仍然得到OperationalError,但它只发生在fork中,并且似乎不会干扰请求.堆栈跟踪不包括fork,但不允许我捕获它.
Traceback(最近一次调用最后一次):
在_finalize_fairy fairy._reset(pool)中输入文件"/home/vagrant/env/local/lib/python2.7/site-packages/sqlalchemy/pool.py",第636行
在_reset self._reset_agent.rollback()中输入文件"/home/vagrant/env/local/lib/python2.7/site-packages/sqlalchemy/pool.py",第774行
文件"/home/vagrant/env/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",第1563行,回滚self._do_rollback()
在/do_rollback self.connection._rollback_impl()中输入文件"/home/vagrant/env/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",第1601行
文件"/home/vagrant/env/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",第670行,_rollback_impl …
python ×4
flask ×3
uwsgi ×3
postgresql ×2
django ×1
frameworks ×1
mysql ×1
nginx ×1
peewee ×1
python-3.x ×1
signals ×1
sqlalchemy ×1