Развертывание приложения Flask — это важный шаг в обеспечении доступности вашего веб-приложения для всего мира. Хотя Flask поставляется со встроенным сервером разработки, он не подходит для производства. Для надежной, масштабируемой и готовой к производству установки вам понадобится сочетание Gunicorn, Nginx и Ubuntu. В этом руководстве вы узнаете, как развернуть приложение Flask с Gunicorn и Nginx на сервере Ubuntu.
Развертывание приложений Flask на сервере может показаться сложной задачей, если вы новичок в разработке бэкенда, но в этом подробном руководстве вы разберете каждый шаг. В конце у вас будет готовое приложение Flask на Ubuntu, обслуживаемое Gunicorn и Nginx.
Понимание стека развертывания: Flask, Gunicorn и Nginx
Прежде чем погрузиться в процесс развертывания, важно понять, какие инструменты мы будем использовать.
Flask: микровебфреймворк
Flask — это легкий веб-фреймворк, написанный на языке Python. Он спроектирован как простой, гибкий и легкий для начала работы, что делает его популярным выбором для создания веб-приложений. Однако встроенный сервер Flask не подходит для производственных сред, поскольку не может обрабатывать более одного запроса за раз.
Gunicorn: HTTP-сервер Python WSGI
Gunicorn (Green Unicorn) — это HTTP-сервер WSGI на языке Python, который обслуживает ваше приложение Flask. Это рабочая модель pre-fork, что означает, что он запускает несколько рабочих процессов для обработки нескольких запросов одновременно. Это делает его идеальным для обслуживания приложений Flask в производстве. Gunicorn находится между вашим приложением Flask и веб-сервером (в данном случае Nginx), выполняя тяжелую работу по управлению запросами и обслуживанию ответов.
Nginx: Веб-сервер и обратный прокси
Nginx — это высокопроизводительный веб-сервер, который также выполняет функции обратного прокси, балансировщика нагрузки и HTTP-кэша. В этой установке Nginx будет сидеть перед Gunicorn, обрабатывая клиентские соединения и статический контент, а затем перенаправляя динамические запросы в Gunicorn. Такое разделение задач помогает повысить безопасность, производительность и масштабируемость.
Настройка сервера Ubuntu
Первоначальная настройка сервера
Во-первых, вам нужен доступ к серверу Ubuntu. Это может быть физическая машина, виртуальная машина или облачный экземпляр от таких провайдеров, как AWS, DigitalOcean или Google Cloud Platform.
- Войдите на свой сервер:
$ ssh username@your_server_ip
- Обновите индекс пакетов:
$ sudo apt update
- Обновление установленных пакетов:
$ sudo apt upgrade
Установка необходимых пакетов
Для запуска приложения Flask вам понадобятся Python, pip и virtualenv.
- Установите Python и pip:
$ sudo apt install python3 python3-pip
- Установите virtualenv:
$ sudo pip3 install virtualenv
Подготовка приложения для Flask
Создание приложения Flask
Если у вас еще нет приложения Flask, вы можете создать простое приложение. Вот пример:
- Создайте каталог для вашего проекта:
$ mkdir ~/myflaskapp
$ cd ~/myflaskapp
- Создайте виртуальную среду:
$ virtualenv venv
- Активируйте виртуальную среду:
$ source venv/bin/activate
- Установите Flask:
$ pip install Flask
- Создайте простое приложение Flask:
Создайте файл с именем app.py
:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
- Протестируйте свое приложение:
Запустите приложение, чтобы убедиться, что все работает:
$ python app.py
Вы должны увидеть результаты, указывающие на то, что сервер разработки Flask запущен. Посетите http://your_server_ip:5000
в вашем браузере, и вы должны увидеть «Hello, World!».
Структурирование приложения Flask
В производственной среде рекомендуется структурировать приложение Flask по модульному принципу. Вот простой пример того, как вы можете структурировать свое приложение:
myflaskapp/
│
├── app/
│ ├── __init__.py
│ ├── routes.py
│ ├── models.py
│ └── templates/
│
├── venv/
├── config.py
├── requirements.txt
└── wsgi.py
Создание точки входа WSGI
Gunicorn нужна точка входа WSGI для обслуживания вашего приложения Flask. Обычно это файл с именем wsgi.py
:
- Создать
wsgi.py
файл:
from app import app
if __name__ == "__main__":
app.run()
- Установите дополнительные зависимости:
Если у вашего приложения есть дополнительные зависимости, перечислите их в файле requirements.txt
файле и установите их:
$ pip freeze > requirements.txt
$ pip install -r requirements.txt
Развертывание Flask с помощью Gunicorn
Установка Gunicorn
Gunicorn — это пакет для Python, поэтому его можно установить с помощью pip.
- Установите Gunicorn:
$ pip install gunicorn
Запуск Gunicorn
Чтобы проверить, что Gunicorn может обслуживать ваше приложение, выполните следующую команду:
$ gunicorn --bind 0.0.0.0:8000 wsgi:app
Эта команда указывает Gunicorn обслуживать ваше приложение Flask, используя wsgi.py
файл, привязываясь к порту 8000. Вы должны иметь доступ к своему приложению по адресу http://your_server_ip:8000
.
Настройка Gunicorn для производства
Для производства обычно требуется запустить Gunicorn с несколькими рабочими процессами для одновременной обработки множества запросов.
- Создайте файл службы systemd для Gunicorn:
Это позволит вам управлять Gunicorn с помощью systemd, системы init, используемой в Ubuntu.
$ sudo nano /etc/systemd/system/gunicorn.service
Добавьте следующее содержание:
[Unit]
Description=Gunicorn instance to serve myflaskapp
After=network.target
[Service]
User=yourusername
Group=www-data
WorkingDirectory=/home/yourusername/myflaskapp
Environment="PATH=/home/yourusername/myflaskapp/venv/bin"
ExecStart=/home/yourusername/myflaskapp/venv/bin/gunicorn --workers 3 --bind unix:myflaskapp.sock -m 007 wsgi:app
[Install]
WantedBy=multi-user.target
Заменить yourusername
на ваше настоящее имя пользователя.
- Запустите и включите службу Gunicorn:
$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn
- Проверьте состояние службы Gunicorn:
$ sudo systemctl status gunicorn
Если все настроено правильно, Gunicorn должен быть запущен и обслуживать ваше приложение Flask.
Настройка Nginx
Установка Nginx
Если у вас не установлен Nginx, вы можете установить его с помощью следующей команды:
$ sudo apt install nginx
Настройка Nginx в качестве обратного прокси
Nginx будет работать как обратный прокси, передавая запросы Gunicorn и обслуживая статические файлы напрямую.
- Создайте новый серверный блок:
$ sudo nano /etc/nginx/sites-available/myflaskapp
Добавьте следующее содержимое:
server {
listen 80;
server_name your_domain_or_IP;
location / {
include proxy_params;
proxy_pass http://unix:/home/yourusername/myflaskapp/myflaskapp.sock;
}
location /static/ {
alias /home/yourusername/myflaskapp/app/static/;
}
error_log /home/yourusername/myflaskapp/error.log;
access_log /home/yourusername/myflaskapp/access.log;
}
Заменить yourusername
на ваше настоящее имя пользователя и your_domain_or_IP
с IP-адресом или доменным именем вашего сервера.
- Включите новый блок сервера:
$ sudo ln -s /etc/nginx/sites-available/myflaskapp /etc/nginx/sites-enabled
- Проверьте конфигурацию Nginx:
$ sudo nginx -t
Если проверка прошла успешно, вы должны увидеть вывод, указывающий на то, что конфигурация в порядке.
- Перезапустите Nginx, чтобы применить изменения:
$ sudo systemctl restart nginx
Разрешение Nginx через брандмауэр
Если вы используете UFW (Uncomplicated Firewall), вам нужно разрешить Nginx через брандмауэр.
$ sudo ufw allow 'Nginx Full'
Защита приложения с помощью SSL
Чтобы защитить приложение, можно настроить SSL с помощью Let’s Encrypt.
Установка Certbot
Certbot — это инструмент для автоматизации процесса получения и обновления SSL-сертификатов.
- Установите Certbot и плагин для Nginx:
$ sudo apt install certbot python3-certbot-nginx
- Получите SSL-сертификат:
Выполните следующую команду, заменив your_domain_or_IP
на ваш домен или IP-адрес:
$ sudo certbot --nginx -d your_domain_or_IP
- Проверьте обновление сертификата SSL:
Certbot автоматически обновляет ваши SSL-сертификаты. Вы можете имитировать обновление, чтобы проверить, работает ли оно:
$ sudo certbot renew --dry-run
Мониторинг и ведение журналов
Журналы Gunicorn
Gunicorn будет записывать свои выходные данные в журнал systemd. Чтобы просмотреть журналы:
$ sudo journalctl -u gunicorn
Журналы Nginx
Nginx записывает запросы и ошибки в файлы журналов в /var/log/nginx/
. Вы можете просмотреть их с помощью:
$ sudo tail -f /var/log/nginx/access.log
$ sudo tail -f /var/log/nginx/error.log
Устранение общих проблем
Gunicorn не запускается
- Проверьте состояние службы Gunicorn:
$ sudo systemctl status gunicorn
Найдите в выводе сообщения об ошибках.
- Проверьте журналы Gunicorn:
$ sudo journalctl -u gunicorn
Nginx не удается запустить или перезагрузить
- Проверьте конфигурацию Nginx:
$ sudo nginx -t
Эта команда выделит все синтаксические ошибки в ваших конфигурационных файлах.
- Проверьте журналы Nginx:
$ sudo tail -f /var/log/nginx/error.log
Автоматизация развертывания с помощью конвейера CI/CD
Для больших или часто обновляемых приложений вы можете захотеть автоматизировать процесс развертывания с помощью конвейера непрерывной интеграции/непрерывного развертывания (CI/CD). Это подразумевает настройку таких сервисов, как Jenkins, GitLab CI или GitHub Actions, для автоматического развертывания вашего приложения Flask при каждом внесении изменений в репозиторий.
Настройка базового конвейера CI/CD
- Выбор инструмента CI/CD: Jenkins, GitLab CI, GitHub Actions, CircleCI и т. д.
- Настройте конвейер: Определите этапы сборки, тестирования и развертывания.
- Интеграция с системой контроля версий: Автоматически запускайте развертывание при внесении изменений в репозиторий.
Развертывание с помощью Git Hooks
Если вы предпочитаете более простой подход, вы можете использовать Git-хуки для запуска сценариев развертывания при каждом внесении изменений на сервер.
- Создайте на сервере хук после получения изменений:
$ mkdir -p ~/myflaskapp.git/hooks
$ nano ~/myflaskapp.git/hooks/post-receive
Добавьте следующее содержание:
#!/bin/bash
git --work-tree=/home/yourusername/myflaskapp --git-dir=/home/yourusername/myflaskapp.git checkout -f
source /home/yourusername/myflaskapp/venv/bin/activate
pip install -r /home/yourusername/myflaskapp/requirements.txt
sudo systemctl restart gunicorn
Сделайте хук исполняемым:
$ chmod +x ~/myflaskapp.git/hooks/post-receive
- Передача обновлений на ваш сервер:
С локальной машины добавьте удаленный репозиторий:
$ git remote add production ssh://username@your_server_ip/home/username/myflaskapp.git
Внесите изменения на рабочий сервер:
$ git push production master
Часто задаваемые вопросы
Какова роль Gunicorn в развертывании Flask?
Gunicorn служит в качестве WSGI HTTP-сервера, который обрабатывает входящие запросы к вашему приложению Flask. Он запускает несколько рабочих процессов для одновременного управления этими запросами, что делает его критически важным компонентом в производственной среде.
Почему Nginx используется в качестве обратного прокси?
Nginx используется в качестве обратного прокси для обработки клиентских соединений, управления статическими файлами и перенаправления динамических запросов в Gunicorn. Это повышает безопасность, производительность и масштабируемость вашего приложения.
Как обеспечить безопасность моего приложения Flask?
Обеспечение безопасности приложения Flask включает в себя использование сертификатов SSL/TLS, применение HTTPS, установку правильных разрешений и регулярное обновление зависимостей сервера и приложения.
Могу ли я использовать другие веб-серверы вместо Nginx?
Да, вы можете использовать другие веб-серверы, например Apache. Однако Nginx предпочтительнее благодаря своей производительности, простоте и удобству использования в качестве обратного прокси.
Что делать, если приложение падает после развертывания?
Проверьте журналы Gunicorn и Nginx, чтобы определить причину сбоя. Убедитесь, что ваше приложение правильно настроено и что все зависимости установлены. Также проверьте наличие синтаксических ошибок в конфигурационных файлах.
Как масштабировать приложение Flask?
Вы можете масштабировать свое приложение Flask, увеличивая количество рабочих Gunicorn, балансируя нагрузку на нескольких серверах и оптимизируя код и запросы к базе данных.
Заключение
Развертывание приложения Flask с помощью Gunicorn и Nginx на Ubuntu — это мощный способ обеспечить надежность, масштабируемость и безопасность вашего приложения. Следуя шагам, описанным в этом руководстве, вы сможете уверенно развернуть свое приложение Flask в производственной среде. В этом руководстве вы найдете все, что вам нужно знать: от установки сервера и настройки приложения до защиты сайта с помощью SSL и устранения типичных проблем.