Не удается подключиться к базе данных MySQL (RDS) с помощью flask, gunicorn, nginx

#mysql #nginx #flask #amazon-rds #gunicorn

Вопрос:

У меня есть приложение flask, работающее на экземпляре AWS EC2 с использованием gunicorn и nginx. У приложения возникли проблемы с подключением к моей базе данных MySQL (которая является экземпляром AWS RDS). Я вижу это сообщение в фоновом режиме (при использовании sudo journalctl -u website.service ), когда пытаюсь войти в свое приложение:

 sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2006, "MySQL server has gone away (TimeoutError(110, 'Connection timed out'))")
 

Если я запущу приложение вручную (с помощью python app.py ) на порту 5000 на том же экземпляре EC2, сайт будет работать просто отлично. Я могу увидеть приложение и войти в систему без проблем. Чтобы убедиться, что мой экземпляр RDS работает правильно, я подключился к нему с помощью MySQL Workbench с моей локальной физической машины (это должно исключить любые проблемы с портом или группой безопасности).

Как ни странно, этот сбой подключения RDS может быть временно исправлен, если я перезагрузлю экземпляр EC2 своего веб-сайта. После перезагрузки приложение, похоже, работает для одного входа в систему, затем, если я выхожу из приложения и пытаюсь снова войти в систему, оно перестает работать и больше не может подключиться к RDS. Самое неприятное, что все работало нормально, когда я использовал сервер разработки (несмотря на WARNING: This is a development server. Do not use it in a production deployment. ) Когда я подумал, что приложение готово к удалению с сервера разработчиков, я последовал отличным инструкциям от https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-ubuntu-18-04, но RDS перестал работать….

Это моя настройка systemd:

 [Unit]
Description=Gunicorn instance to serve web site
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/dev/website
Environment="PATH=/home/ubuntu/miniconda3/bin"
ExecStart=/home/ubuntu/miniconda3/bin/gunicorn --workers 3 --bind unix:web.sock -m 007 app:app

[Install]
WantedBy=multi-user.target
 

Настройка nginx:

 server {
    server_name exmample.com;

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/ubuntu/dev/website/web.sock;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


}
server {
    if ($host = www.example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name example.com;
    return 404; # managed by Certbot

 

Если кто-нибудь может помочь, я был бы очень признателен. Я занимаюсь этим уже пару дней и не могу понять, в чем дело.