postgresql nginx sqlalchemy flask uwsgi

postgresql - uWSGI, Flask, sqlalchemy y postgres: error de SSL: descifrado fallido o mal mac de registro



nginx (2)

Estoy intentando configurar un servidor web de aplicación usando uWSGI + Nginx, que ejecuta una aplicación Flask con SQLAlchemy para comunicarse con una base de datos de Postgres.

Cuando realizo solicitudes al servidor web, cualquier otra respuesta tendrá un error de 500.

El error es:

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

El error se desencadena por un simple método Flask-SQLAlchemy :

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

uwsgi está siendo administrado por un supervisor , que tiene una configuración:

[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

y la configuración de uwsgi ve así:

[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

Lo más lejos que puedo llegar es que tiene algo que ver con la bifurcación de uwsgi. Pero más allá de eso, no tengo claro qué se debe hacer.


Como alternativa, puede tirar el motor. Así es como resolví el problema.

Tales problemas pueden suceder si hay una consulta durante la creación de la aplicación, es decir, en el módulo que crea la aplicación. Si eso indica, el motor asigna un grupo de conexiones y luego uwsgi tenedores.

Al invocar ''engine.dispose ()'', el grupo de conexiones en sí mismo se cierra y aparecerán nuevas conexiones tan pronto como alguien comience a hacer consultas nuevamente. Entonces, si lo hace al final del módulo donde crea su aplicación, se crearán nuevas conexiones después del fork UWSGI.


El problema terminó siendo la bifurcación de uwsgi.

Al trabajar con procesos múltiples con un proceso maestro, uwsgi inicializa la aplicación en el proceso maestro y luego copia la aplicación en cada proceso de trabajo. El problema es que si abre una conexión de base de datos al inicializar su aplicación, entonces tiene múltiples procesos que comparten la misma conexión, lo que causa el error anterior.

La solución es establecer la opción de configuración lazy para uwsgi , lo que obliga a una carga completa de la aplicación en cada proceso:

lazy

Establecer el modo perezoso (cargar aplicaciones en trabajadores en lugar de maestro).

Esta opción puede tener implicaciones en el uso de la memoria ya que no se puede usar la semántica de Copiar en la escritura. Cuando lazy está habilitada, solo los trabajadores serán recargados por las señales de recarga de uWSGI; el maestro permanecerá vivo. Como tal, los cambios de configuración de uWSGI no se recogen al volver a cargar por el maestro.

También hay una opción de lazy-apps :

lazy-apps

Cargue aplicaciones en cada trabajador en lugar de en el maestro.

Esta opción puede tener implicaciones en el uso de la memoria ya que no se puede usar la semántica de Copiar en la escritura. A diferencia de lazy, esto solo afecta la forma en que se cargan las aplicaciones, no el comportamiento del maestro al volver a cargar.

Esta configuración de uwsgi terminó trabajando para mí:

[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