Установка и настройка Flask, Nginx и Gunicorn в Ubuntu 14.04

Я публикую перевод статьи “Kickstarting Flask on Ubuntu – Setup and Deployment” но со своими дополнениями и изменениями, которые могут быть отличными от оригинала. Мне Flask и Nginx понадобились для создания RestAPI и дальнейшего использования в своих проектах.

От себя скажу, что штука эта невероятно быстрая, удобная, но требует внимательного подхода к конфигурации и терпения во время настройки. Для реализации задуманного мы будем использовать целый ряд интересных продуктов, таких как Supervisor, gunicorn, Pip, virtualenv и другие. Картинки заимствованы из оригинальной статьи и автор вроде бы не против =)

Краткое вступление

Для чистоты эксперемента я буду использовать виртуальную машину на Ubuntu 14.04, но вы можете прибегнуть к услугам Vagrant или одного из многочисленных VPS, таких как Digital Ocean, Linode, or Amazon EC2.

Идея нашего сетапа такова, всю статику на сайте будет обрабатывать nginx, он же будет фронтом, а всю динамику будет обрабатывать Python/Flask. Передавать всю динамику Python/Flask будет gunicorn который поддержывает WSGI и может “общаться” с Flask или Django.
pop_

Еще раз. Все HTTP запросы приходят к Nginx, в случае если ему необходимо отдать статику (html,js,css,png,jpg,etc..), он сам обрабатывает запрос, в случае если необходимо динамическое исполнение кода, Nginx передает запрос Flask через посредника Gunicorn, Flask его выполняет и возвращает Nginx, а тот в свою очередь пользователю.
pop_1

Установка и настройка Flask, Nginx и Gunicorn

Давайте начнем с обновления системы и установки необходимых пакетов.

sudo apt-get update
sudo apt-get install -y python python-pip python-virtualenv nginx gunicorn
sudo apt-get update
sudo apt-get install -y python python-pip python-virtualenv nginx gunicorn

Теперь подготовим директорию для Flask

mkdir -p /var/www/html 
cd /var/www/html
mkdir -p /var/www/html 
cd /var/www/html

Теперь подготовим virtualenv:

sudo virtualenv env
source env/bin/activate
sudo virtualenv env
source env/bin/activate

Теперь установим Flask

sudo pip install Flask
sudo mkdir flask_project && cd flask_project
sudo vim app.py
sudo pip install Flask
sudo mkdir flask_project && cd flask_project
sudo vim app.py

Содержимое файла

from flask import Flask, jsonify
app = Flask(__name__)
 
@app.route('/')
def index():
    return 'Flask is running!'
 
@app.route('/data')
def names():
    data = {"names": ["John", "Jacob", "Julie", "Jennifer"]}
    return jsonify(data)
 
if __name__ == '__main__':
    app.run()
from flask import Flask, jsonify
app = Flask(__name__)

@app.route('/')
def index():
    return 'Flask is running!'

@app.route('/data')
def names():
    data = {"names": ["John", "Jacob", "Julie", "Jennifer"]}
    return jsonify(data)

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

Теперь создадим папку в которую будем складывать всю статику:

sudo mkdir static
sudo vim static/index.html
sudo mkdir static
sudo vim static/index.html

Содержимое файла

<h1>Test!</h1>
<h1>Test!</h1>

Запускаем сервер

sudo /etc/init.d/nginx start
sudo /etc/init.d/nginx start

Создаем файл виртуального хоста

sudo rm /etc/nginx/sites-enabled/default
sudo touch /etc/nginx/sites-available/flask_project
sudo ln -s /etc/nginx/sites-available/flask_project /etc/nginx/sites-enabled/flask_project
sudo rm /etc/nginx/sites-enabled/default
sudo touch /etc/nginx/sites-available/flask_project
sudo ln -s /etc/nginx/sites-available/flask_project /etc/nginx/sites-enabled/flask_project

Откройте файл

sudo vim /etc/nginx/sites-enabled/flask_project
sudo vim /etc/nginx/sites-enabled/flask_project

Содержимое файла

server {
    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
    location /static {
        alias  /var/www/html/flask_project/static;
    }
}
server {
    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
    location /static {
        alias  /var/www/html/flask_project/static;
    }
}

Перезапускаем сервер

sudo /etc/init.d/nginx restart
sudo /etc/init.d/nginx restart

Заводим gunicorn

cd /var/www/html/flask_project
gunicorn app:app -b localhost:8000
cd /var/www/html/flask_project
gunicorn app:app -b localhost:8000

И проверяем что Flask работает в браузере
FLASK

А также, проверяем что Питон корректно выдает нам наш json
FLASK@22222

Пожалуй, единественное что осталось, это автоматизировать запуск gunicorn, а не делать это вручную. Для этого мы будем использовать Supervisor. Установим и сконфигурируем его.

sudo apt-get install -y supervisor
sudo vim /etc/supervisor/conf.d/flask_project.conf
sudo apt-get install -y supervisor
sudo vim /etc/supervisor/conf.d/flask_project.conf

Содержимое файла

[program:flask_project]
command = gunicorn app:app -b localhost:8000
directory = /var/www/html/flask_project
user = www-data
[program:flask_project]
command = gunicorn app:app -b localhost:8000
directory = /var/www/html/flask_project
user = www-data

где app:app – app.py

Управлять им просто

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start flask_project
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start flask_project