uWSGI、Flask、sqlalchemy 和 postgres:SSL 错误:解密失败或坏记录 mac

2024-03-11

我正在尝试使用 uWSGI + Nginx 设置一个应用程序网络服务器,它使用 SQLAlchemy 运行 Flask 应用程序来与 Postgres 数据库进行通信。

当我向网络服务器发出请求时,所有其他响应都将是 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 method:

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

uwsgi正在由以下人员管理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

and 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 的分叉有关。但除此之外我不清楚还需要做什么。


这个问题最终是 uwsgi 的分叉。

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

解决方案是设置lazy uwsgi 的配置选项 http://uwsgi-docs.readthedocs.org/en/latest/Options.html,这会强制在每个进程中完全加载应用程序:

lazy

设置惰性模式(在工作进程而不是主进程中加载​​应用程序)。

此选项可能会影响内存使用,因为无法使用写入时复制语义。当启用lazy时,只有workers会被uWSGI的重载信号重载;主人将继续活着。因此,主服务器重新加载时不会拾取 uWSGI 配置更改。

还有一个lazy-apps option:

lazy-apps

在每个工作进程而不是主进程中加载​​应用程序。

此选项可能会影响内存使用,因为无法使用写入时复制语义。与惰性不同,这仅影响应用程序的加载方式,而不影响主程序重新加载时的行为。

这个 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uWSGI、Flask、sqlalchemy 和 postgres:SSL 错误:解密失败或坏记录 mac 的相关文章

随机推荐