Поиск по сайту:

Как обслуживать приложения Flask с помощью Gunicorn и Nginx в Ubuntu 14.04


Введение

В этом руководстве мы настроим простое приложение Python с использованием микрофреймворка Flask в Ubuntu 14.04. Основная часть этой статьи будет посвящена настройке сервера приложений Gunicorn для запуска приложения и Nginx для работы в качестве внешнего обратного прокси-сервера.

Предпосылки

Прежде чем приступить к работе с этим руководством, на вашем сервере должен быть настроен пользователь без полномочий root. Этот пользователь должен иметь привилегии sudo, чтобы он мог выполнять административные функции. Чтобы узнать, как это настроить, следуйте нашему руководству по начальной настройке сервера.

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

Когда будете готовы продолжить, читайте дальше.

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

Нашим первым шагом будет установка всех необходимых нам частей из репозиториев. Мы установим pip, менеджер пакетов Python, чтобы установить и управлять нашими компонентами Python. Мы также получим файлы разработки Python, необходимые для создания некоторых компонентов Gunicorn. Сейчас мы также установим Nginx.

Обновите локальный индекс пакетов, а затем установите пакеты, набрав:

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

Создайте виртуальную среду Python

Далее мы настроим виртуальную среду, чтобы изолировать наше приложение Flask от других файлов Python в системе.

Начните с установки пакета virtualenv с помощью pip:

sudo pip install virtualenv

Теперь мы можем создать родительский каталог для нашего проекта Flask. Перейдите в каталог после его создания:

mkdir ~/myproject
cd ~/myproject

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

virtualenv myprojectenv

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

Прежде чем устанавливать приложения в виртуальной среде, нам необходимо ее активировать. Вы можете сделать это, набрав:

source myprojectenv/bin/activate

Ваше приглашение изменится, чтобы показать, что вы сейчас работаете в виртуальной среде. Это будет выглядеть примерно так: (myprojectenv)user@host:~/myproject$.

Настройте приложение Flask

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

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

Мы можем использовать локальный экземпляр pip для установки Flask и Gunicorn. Введите следующие команды, чтобы получить эти два компонента:

pip install gunicorn flask

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

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

Хотя ваше приложение может быть более сложным, мы создадим наше приложение Flask в одном файле, который назовем myproject.py:

nano ~/myproject/myproject.py

В этом файле мы разместим код нашего приложения. По сути, нам нужно импортировать flask и создать экземпляр объекта Flask. Мы можем использовать это для определения функций, которые должны запускаться при запросе определенного маршрута. Мы назовем наше приложение Flask в коде application, чтобы воспроизвести примеры, которые вы найдете в спецификации WSGI:

from flask import Flask
application = Flask(__name__)

@application.route("/")
def hello():
    return "<h1 style='color:blue'>Hello There!</h1>"

if __name__ == "__main__":
    application.run(host='0.0.0.0')

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

Вы можете протестировать свое приложение Flask, набрав:

python myproject.py

Посетите доменное имя или IP-адрес вашего сервера, за которым следует номер порта, указанный в выводе терминала (скорее всего, :5000) в вашем веб-браузере. Вы должны увидеть что-то вроде этого:

Когда вы закончите, несколько раз нажмите CTRL-C в окне терминала, чтобы остановить сервер разработки Flask.

Создайте точку входа WSGI

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

Назовем файл wsgi.py:

nano ~/myproject/wsgi.py

Файл невероятно прост, мы можем просто импортировать экземпляр Flask из нашего приложения, а затем запустить его:

from myproject import application

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

Сохраните и закройте файл, когда закончите.

Тестирование способности Gunicorn обслуживать проект

Прежде чем двигаться дальше, мы должны проверить, что Gunicorn может правильно.

Мы можем сделать это, просто передав ему имя нашей точки входа. Мы также укажем интерфейс и порт для привязки, чтобы он запускался на общедоступном интерфейсе:

cd ~/myproject
gunicorn --bind 0.0.0.0:8000 wsgi

Если вы посещаете доменное имя или IP-адрес вашего сервера с добавлением :8000 в конце в веб-браузере, вы должны увидеть страницу, которая выглядит следующим образом:

Когда вы убедитесь, что он работает правильно, нажмите CTRL-C в окне терминала.

Теперь мы закончили с нашей виртуальной средой, поэтому мы можем ее деактивировать:

deactivate

Любые операции теперь будут выполняться в среде Python системы.

Создайте сценарий Upstart

Следующим элементом, о котором нам нужно позаботиться, является сценарий Upstart. Создание скрипта Upstart позволит системе инициализации Ubuntu автоматически запускать Gunicorn и обслуживать наше приложение Flask при каждой загрузке сервера.

Создайте файл сценария, заканчивающийся на .conf, в каталоге /etc/init, чтобы начать:

sudo nano /etc/init/myproject.conf

Внутри мы начнем с простого описания назначения скрипта. Сразу после этого мы определим условия, при которых этот скрипт будет запускаться и останавливаться системой. Обычные номера времени выполнения системы — 2, 3, 4 и 5, поэтому мы скажем ему запустить наш сценарий, когда система достигнет одного из этих уровней выполнения. Мы скажем ему остановиться на любом другом уровне выполнения (например, когда сервер перезагружается, выключается или находится в однопользовательском режиме):

description "Gunicorn application server running myproject"

start on runlevel [2345]
stop on runlevel [!2345]

Мы скажем системе инициализации, что она должна перезапустить процесс, если он когда-либо выйдет из строя. Далее нам нужно определить пользователя и группу, от имени которой должен запускаться Gunicorn. Все файлы нашего проекта принадлежат нашей собственной учетной записи пользователя, поэтому мы настроим себя в качестве пользователя для запуска. Сервер Nginx работает в группе www-data. Нам нужно, чтобы Nginx мог читать и записывать в файл сокета, поэтому мы предоставим этой группе право собственности на процесс:

description "Gunicorn application server running myproject"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
setuid user
setgid www-data

Далее нам нужно настроить процесс так, чтобы он мог корректно находить наши файлы и обрабатывать их. Мы установили все наши компоненты Python в виртуальную среду, поэтому нам нужно установить переменную среды с этим в качестве нашего пути. Нам также нужно перейти в каталог нашего проекта. После этого мы можем просто вызвать приложение Gunicorn с параметрами, которые мы хотели бы использовать.

Мы скажем ему запустить 3 рабочих процесса (при необходимости отрегулируйте это). Мы также скажем ему создать и связать файл сокета Unix в каталоге нашего проекта с именем myproject.sock. Мы установим значение umask 007, чтобы файл сокета был создан, предоставляя доступ владельцу и группе, ограничивая при этом доступ остальных. Наконец, нам нужно передать имя файла точки входа WSGI:

description "Gunicorn application server running myproject"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
setuid user
setgid www-data

env PATH=/home/user/myproject/myprojectenv/bin
chdir /home/user/myproject
exec gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi

Сохраните и закройте файл, когда закончите.

Вы можете начать процесс немедленно, набрав:

sudo start myproject

Настройка Nginx для прокси-запросов

Теперь наш сервер приложений Gunicorn должен быть запущен и работать, ожидая запросов к файлу сокета в каталоге проекта. Нам нужно настроить Nginx для передачи веб-запросов в этот сокет, внеся небольшие дополнения в его файл конфигурации.

Начните с создания нового файла конфигурации блока сервера в каталоге Nginx sites-available. Мы просто назовем этот myproject, чтобы соответствовать остальной части руководства:

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

Откройте блок сервера и скажите Nginx прослушивать порт 80 по умолчанию. Нам также нужно указать ему использовать этот блок для запросов доменного имени или IP-адреса нашего сервера:

server {
    listen 80;
    server_name server_domain_or_IP;
}

Единственное, что нам нужно добавить, это блок местоположения, который соответствует каждому запросу. В этот блок мы включим файл proxy_params, в котором указаны некоторые общие параметры проксирования, которые необходимо установить. Затем мы будем передавать запросы в сокет, который мы определили с помощью директивы proxy_pass:

server {
    listen 80;
    server_name server_domain_or_IP;

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/user/myproject/myproject.sock;
    }
}

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

Чтобы включить конфигурацию блока сервера Nginx, которую мы только что создали, свяжите файл с каталогом sites-enabled:

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

С файлом в этом каталоге мы можем проверить наличие синтаксических ошибок, набрав:

sudo nginx -t

Если это возвращается без каких-либо проблем, мы можем перезапустить процесс Nginx, чтобы прочитать нашу новую конфигурацию:

sudo service nginx restart

Теперь вы сможете перейти к доменному имени или IP-адресу вашего сервера в своем веб-браузере и увидеть свое приложение:

Заключение

В этом руководстве мы создали простое приложение Flask в виртуальной среде Python. Мы создаем точку входа WSGI, чтобы любой сервер приложений с поддержкой WSGI мог взаимодействовать с ней, а затем настроили сервер приложений Gunicorn для обеспечения этой функции. После этого мы создали скрипт Upstart для автоматического запуска сервера приложений при загрузке. Мы создали серверный блок Nginx, который пропускает трафик веб-клиента на сервер приложений, ретранслируя внешние запросы.

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