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

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

Требования

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

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

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

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

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

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

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

sudo pip 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:

pip install gunicorn flask

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

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

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

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

nano ~/myproject/myproject.py

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

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). На экране появится:

Hello There!

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

Создание точки входа 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. На странице должно появиться:

Hello There!

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

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

deactivate

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

4: Создание скрипта Upstart

Скрипт Upstart позволяет системе инициализации Ubuntu автоматически запускать Gunicorn и обслуживать приложение Flask.

Создайте скрипт с расширением .conf в каталоге /etc/init:

sudo nano /etc/init/myproject.conf

Начните скрипт с простой строки description, которая указывает, для чего предназначен данный файл. Затем определите системные уровни запуска, на которых этот сервис должен автоматически запускаться (как правило, для сервисов выбирают уровни запуска 2, 3, 4 и 5). Сервис будет запущен, когда система находится на любом из этих уровней; на каком-либо другом уровне запуска (например, при перезагрузке системы, выключении, в однопользовательском режиме и т.п.) сервис будет отключен.

description "Gunicorn application server running myproject"
start on runlevel [2345] stop on runlevel [!2345]

Добавьте в скрипт автоматическую перезагрузку сервиса в случае сбоя. Затем укажите пользователя и группу для запуска сервиса (в руководстве это стандартный системный пользователь – все файлы принадлежат ему). Также нужно разрешить доступ группе www-data, в которую входит пользователь Nginx. Также нужно указать каталог проекта, чтобы команды Gunicorn выполнялись правильно.

description "Gunicorn application server running myproject"
start on runlevel [2345] stop on runlevel [!2345] respawn
setuid user
setgid www-data

Теперь нужно добавить в скрипт команды для запуска процесса Gunicorn. Укажите путь к исполняющему файлу Gunicorn, который хранится в виртуальной среде.  Здесь можно указать количество рабочих процессов; в руководстве будет использоваться 3 процесса. Настройте Unix-сокеты вместо сетевых портов для взаимодействия с Nginx (это более быстрый и безопасный способ). Установите значение umask 007, чтобы доступ к файлу сокетов был только у владельца и группы. Затем укажите имя точки входа:

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

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

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

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

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

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

Задайте порт, который должен прослушивать веб-сервер (в данном случае – стандартный порт 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/user/myproject/myproject.sock;
}
}

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

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

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

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

sudo nginx -t

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

sudo service nginx restart

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

Hello There!

Заключение

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

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

Tags: , , , ,

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