Обслуживание приложений Flask с помощью Gunicorn и Nginx в Ubuntu 16.04

Данное руководство поможет настроить простое приложение Python в микрофреймворке Flask на сервере Ubuntu 16.04. Также оно охватывает настройку сервера приложений Gunicorn и обратного прокси-сервера Nginx.

Требования

  • Сервер Ubuntu 16.04.
  • Пользователь с доступом к sudo.
  • Базовые знания спецификации WSGI.

1: Установка компонентов из репозиториев Ubuntu

Для начала нужно установить все зависимости из репозиториев: pip (пакетный менеджер Python), инструменты разработки и веб-сервер Nginx.

Обновите индекс пакетов и установите все необходимые пакеты:

Если вы используете Python 2, введите:

sudo apt-get update
sudo apt-get install python-pip python-dev nginx

В Python 3:

sudo apt-get update
sudo apt-get install python3-pip python3-dev nginx

2: Виртуальная среда

Теперь нужно изолировать приложение Flask от других файлов Python. Для этого используется виртуальная среда (virtual environment). Чтобы создать такую среду, нужно установить инструмент virtualenv:

В Python 2:

sudo pip install virtualenv

В Python 3:

sudo pip3 install virtualenv

Теперь нужно создать и открыть родительский каталог проекта Flask:

mkdir ~/myproject
cd ~/myproject

Создайте виртуальную среду для хранения файлов проекта Flask:

virtualenv myprojectenv

Это создаст локальную копию Python и pip в каталоге myprojectenv.

Теперь включите виртуальную среду:

source myprojectenv/bin/activate

Командная строка изменится:

(myprojectenv)user@host:~/myproject$

Это означает, что среда включена.

3: Создание приложения Flask

Включив виртуальную среду, можно установить Flask и Gunicorn, а затем приступить к разработке приложения.

Установка Flask и Gunicorn

Установить приложения Flask и Gunicorn можно при помощи пакетного менеджера pip.

Примечание: Вне зависимости от версии Python следует использовать команду pip, а не pip3.

pip install gunicorn flask

Создание приложения

Теперь создайте простое приложение Flask.

Поскольку Flask является микрофреймворком, он не предоставляет некоторых функций, которые есть в полноценных фреймворках. Flask используется в основном как модуль, который можно импортировать в проекты, чтобы ускорить инициализацию веб-приложения.

Для примера создайте приложение, состоящее из одного файла, myproject.py:

nano ~/myproject/myproject.py

В этом файле нужно поместить код приложения. В целом, нужно импортировать Flask и задать значение объекта Flask. Так можно определить функции, которые нужно выполнить при запросе определённых маршрутов.

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "<h1 style='color:blue'>Hello There!</h1>"
if __name__ == "__main__":
app.run(host='0.0.0.0')

Этот код определяет, какой контент выводить при запросе корневого домена. Сохраните и закройте файл.

Если вы следовали руководству по начальной настройке сервера Ubuntu 16.04, вы заблокировали все порты при помощи брандмауэра UFW. Теперь нужно открыть порт 5000, чтобы приложение могло работать.

Для этого введите:

sudo ufw allow 5000

Чтобы проверить работу приложения Flask, введите:

python myproject.py

Откройте домен или IP в браузере, добавив номер порта, указанный в выводе в терминале (как правило, это :5000). На экране появится:

Hello There!

Чтобы остановить сервер разработки, нажмите CTRL-C в окне терминала.

Создание точки входа WSGI

Теперь нужно создать точку входа приложения, чтобы сервер Gunicorn мог взаимодействовать с ним.

Создайте файл wsgi.py:

nano ~/myproject/wsgi.py

Этот файл очень простой; импортируйте Flask и запустите его:

from myproject import app

if __name__ == "__main__":
app.run()

Сохраните и закройте файл.

Тестирование Gunicorn

Теперь нужно убедиться, что Gunicorn может обслуживать страницы приложения.

Для этого передайте имя точки входа и укажите интерфейс и порт для подключения. Имя точки входа состоит из имени модуля (без расширения .py) и имени вызываемой функции приложения. В данном случае точка входа будет называться wsgi:app.

cd ~/myproject
gunicorn --bind 0.0.0.0:5000 wsgi:app

Посетите домен или IP-адрес сервера, указав порт :5000.

http://server_domain_or_IP:5000

На странице должно появиться:

Hello There!

Теперь можно остановить сервер приложений, нажав в окне терминала CTRL-C.

Приложение готово, можно отключить виртуальную среду:

deactivate

Теперь все операции будут выполняться в общей среде.

4: Создание unit-файла systemd

После этого нужно создать файл сервиса для системы инициализации systemd. Такой файл позволяет системе инициализации автоматически запускать Gunicorn и обслуживать приложение Flask.

Создайте unit-файл с расширением .service в каталоге /etc/systemd/system:

sudo nano /etc/systemd/system/myproject.service

Для начала добавьте раздел [Unit], который определяет метаданные и зависимости приложения. Внесите в него описание сервиса.

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

Затем нужно добавить раздел [Service]. В нем нужно указать пользователя и группу, с помощью которых будет запущен сервис. Передайте текущему пользователю права на процесс и соответствующие файлы. Также права должна иметь группа www-data, тогда веб-сервер Nginx сможет взаимодействовать с процессом Gunicorn.

Далее нужно установить переменную PATH, чтобы система инициализации знала, где искать исполняемые файлы (в виртуальной среде). Systemd требует полного пути к исполняемым файлам Gunicorn в виртуальной среде.

Система будет запускать три рабочих процесса (измените это в случае необходимости). Также она создаст и подключится к socket-файлу Unix в каталоге проекта (он будет называться myproject.sock). Установите значение umask 007, чтобы socket-файл был доступен только для владельца. После этого нужно задать имя файла точки входа WSGI и вызываемой функции Python.

[Unit] Description=Gunicorn instance to serve myproject
After=network.target
[Service] User=8host
Group=www-data
WorkingDirectory=/home/8host/myproject
Environment="PATH=/home/8host/myproject/myprojectenv/bin"
ExecStart=/home/8host/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app

В завершение нужно добавить раздел [Install], который определяет, к чему должен подключиться сервис во время автозапуска.

[Unit] Description=Gunicorn instance to serve myproject
After=network.target
[Service] User=8host
Group=www-data
WorkingDirectory=/home/8host/myproject
Environment="PATH=/home/8host/myproject/myprojectenv/bin"
ExecStart=/home/8host/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app
[Install] WantedBy=multi-user.target

Итак, сервис systemd готов. Сохраните и закройте файл.
Запустите сервис Gunicorn и включите его автозапуск.

sudo systemctl start myproject
sudo systemctl enable myproject

5: Настройка обратного прокси-сервера Nginx

Теперь приложение Gunicorn готово. Настройте Nginx для передачи запросов на сокет.

Создайте новый блок server в каталоге sites-available:

sudo nano /etc/nginx/sites-available/myproject

Добавьте блок server. Задайте порт, который должен прослушивать веб-сервер (в данном случае – стандартный порт 80) и укажите доменное имя или IP в директиве server_name.

server {
listen 80;
server_name server_domain_or_IP;
}

Затем нужно добавить блок location, который будет содержать файл proxy_params (в нем хранятся параметры проксирования). Отправьте запрос настроенному сокету при помощи директивы proxy_pass:

server {
listen 80;
server_name server_domain_or_IP;
location / {
include proxy_params;
proxy_pass http://unix:/home/8host/myproject/myproject.sock;
}
}

Это всё, что нужно для обслуживания приложения. Сохраните и закройте файл.

Чтобы включить блок server, нужно создать символьную ссылку в каталог sites-enabled:

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

Проверьте синтаксис на наличие ошибок.

sudo nginx -t

Если ошибок нет, перезапустите Nginx:

sudo systemctl restart nginx

Теперь нужно снова изменить настройки брандмауэра. Порт 5000 больше не используется, его можно заблокировать. Вместо этого нужно разблокировать доступ к Nginx.

sudo ufw delete allow 5000
sudo ufw allow 'Nginx Full'

Теперь откройте в браузере доменное имя или IP.

http://server_domain_or_IP

На странице появится:

Hello There!

Примечание: После настройки обратного прокси-сервера Nginx настоятельно рекомендуется защитить подключения при помощи сертификатов SSL/TLS. В противном случае все данные будут передаваться в виде простого текста и легко могут быть перехвачены злоумышленниками. Сервис Let’s Encrypt позволяет получить бесплатный сертификат. Подробнее об этом – в этом руководстве.

Заключение

Flask – очень простой, но чрезвычайно гибкий фреймворк.

Теперь на сервере есть полностью рабочее простое приложение Flask, хранящееся в виртуальной среде Python. Можно использовать его как шаблон для разработки более сложных приложений.

Tags: , , , , , , ,

Добавить комментарий