#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
Если кто-нибудь может помочь, я был бы очень признателен. Я занимаюсь этим уже пару дней и не могу понять, в чем дело.