uWSGI, Flask, sqlalchemy, and postgres: SSL error: decryption failed or bad record mac

前端 未结 2 1908
灰色年华
灰色年华 2020-11-28 22:30

I\'m trying to setup an application webserver using uWSGI + Nginx, which runs a Flask application using SQLAlchemy to communicate to a Postgres database.

When I make

相关标签:
2条回答
  • 2020-11-28 22:57

    The issue ended up being uwsgi's forking.

    When working with multiple processes with a master process, uwsgi initializes the application in the master process and then copies the application over to each worker process. The problem is if you open a database connection when initializing your application, you then have multiple processes sharing the same connection, which causes the error above.

    The solution is to set the lazy configuration option for uwsgi, which forces a complete loading of the application in each process:

    lazy

    Set lazy mode (load apps in workers instead of master).

    This option may have memory usage implications as Copy-on-Write semantics can not be used. When lazy is enabled, only workers will be reloaded by uWSGI’s reload signals; the master will remain alive. As such, uWSGI configuration changes are not picked up on reload by the master.

    There's also a lazy-apps option:

    lazy-apps

    Load apps in each worker instead of the master.

    This option may have memory usage implications as Copy-on-Write semantics can not be used. Unlike lazy, this only affects the way applications are loaded, not master’s behavior on reload.

    This uwsgi configuration ended up working for me:

    [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
    
    0 讨论(0)
  • 2020-11-28 23:10

    As an alternative you might dispose the engine. This is how I solved the problem.

    Such issues may happen if there is a query during the creation of the app, that is, in the module that creates the app itself. If that states, the engine allocates a pool of connections and then uwsgi forks.

    By invoking 'engine.dispose()', the connection pool itself is closed and new connections will come up as soon as someone starts making queries again. So if you do that at the end of the module where you create your app, new connections will be created after the UWSGI fork.

    0 讨论(0)
提交回复
热议问题