我正在try 使用uWSGI+Nginx设置一个应用程序Web服务器,它使用SQLAlchemy运行一个Flask应用程序,以与Postgres数据库通信.

当我向Web服务器发出请求时,每隔一次响应都会出现500个错误.

错误是:

Traceback (most recent call last):
  File "/var/env/argos/lib/python3.3/site-packages/sqlalchemy/engine/base.py", line 867, in _execute_context
    context)
  File "/var/env/argos/lib/python3.3/site-packages/sqlalchemy/engine/default.py", line 388, in do_execute
    cursor.execute(statement, parameters)
psycopg2.OperationalError: SSL error: decryption failed or bad record mac


The above exception was the direct cause of the following exception:

sqlalchemy.exc.OperationalError: (OperationalError) SSL error: decryption failed or bad record mac

该错误由一个简单的Flask-SQLAlchemy方法触发:

result = models.Event.query.get(id)

uwsgisupervisor管理,supervisor有一个配置:

[program:my_app]
command=/usr/bin/uwsgi --ini /etc/uwsgi/apps-enabled/myapp.ini --catch-exceptions
directory=/path/to/my/app
stopsignal=QUIT
autostart=true
autorestart=true

uwsgi的配置如下所示:

[uwsgi]
socket = /tmp/my_app.sock
logto = /var/log/my_app.log
plugins = python3
virtualenv =  /path/to/my/venv
pythonpath = /path/to/my/app
wsgi-file = /path/to/my/app/application.py
callable = app
max-requests = 1000
chmod-socket = 666
chown-socket = www-data:www-data
master = true
processes = 2
no-orphans = true
log-date = true
uid = www-data
gid = www-data

我能得到的最远结果是,这与uwsgi的Forking 有关.但除此之外,我不清楚需要做什么.

推荐答案

问题最终变成了uwsgi的Forking .

当使用主进程处理多个进程时,uwsgi会在主进程中初始化应用程序,然后将应用程序复制到每个工作进程.问题是,如果在初始化应用程序时打开数据库连接,那么多个进程共享同一个连接,这会导致上述错误.

解决方案是设置lazy configuration option for uwsgi,强制在每个进程中完全加载应用程序:

lazy

设置惰性模式(在workers而不是master中加载应用程序).

此选项可能会影响内存使用,因为无法使用写时复制语义.启用lazy时,uWSGI的重新加载信号只会重新加载工作进程;主人会活着的.因此,在主机重新加载时,不会拾取uWSGI配置更改.

还有lazy-apps个选项:

lazy-apps

在每个辅助程序而不是主程序中加载应用程序.

此选项可能会影响内存使用,因为无法使用写时复制语义.与lazy不同,这只会影响应用程序的加载方式,而不会影响master在重新加载时的行为.

这个uwsgi配置最终对我有效:

[uwsgi]
socket = /tmp/my_app.sock
logto = /var/log/my_app.log
plugins = python3
virtualenv =  /path/to/my/venv
pythonpath = /path/to/my/app
wsgi-file = /path/to/my/app/application.py
callable = app
max-requests = 1000
chmod-socket = 666
chown-socket = www-data:www-data
master = true
processes = 2
no-orphans = true
log-date = true
uid = www-data
gid = www-data

# the fix
lazy = true
lazy-apps = true

Postgresql相关问答推荐

端口5432失败:致命:数据库xxx&不存在.在PostgreSQL数据库中

为什么Postgres优化器切换到嵌套循环进行连接?

当条件的计算结果为假(或真)时停止执行查询

使用FastAPI和PostgreSQL进行测试

使用Helm设置PostgreSQL配置

如何创建一个触发器来传播对主键表的更新?

postgres 的密码

如何为 JavaEE 应用程序中的 PostgreSQL 热备设置配置连接故障转移?

postgresql中的外键可以被触发器违反

如何从 postgresql Select 查询中的 age() 函数中仅获取年份

Rails 重置所有 Postgres 序列?

如何使用 SpringBoot + JPA 存储 PostgreSQL jsonb?

如何使用 pg_dump 或 psql 从 *.sql 恢复 PostgreSQL 表?

如何在可选参数上查询 postgres?

判断值是否存在于列中

如何禁用 postgresql缓存优化?

Postgresql - 更新规则 - 可能有一个最后修改日期,自动更新该行的on update?

按任意时间间隔计算行数的最佳方法

Array Push的 Postgres 数组追加和数组长度

PostgreSQL - 如何将数字字段中的秒数转换为 HH:MM:SS