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

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

Требования

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

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

Сначала нужно добавить репозиторий EPEL:

sudo yum install epel-release

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

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

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

Теперь нужно изолировать приложение 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: Создание файла Systemd

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

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

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

Начните с раздела [Unit], который позволяет определить метаданные и зависимости. Поместите здесь описание сервиса здесь и укажите сеть:

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

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

Затем задайте переменную PATH, указав, где хранятся исполнительные файлы. Добавьте команды для запуска сервиса. Укажите полный путь к исполнительным файлам сервера Gunicorn, установленного в виртуальной среде.

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

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

Осталось добавить раздел [Install]. Он будет запускать сервис при запуске системы:

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

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

Теперь можно включить сервис Gunicorn:

sudo systemctl start myproject
sudo systemctl enable myproject

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

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

Откройте стандартный конфигурационный файл Nginx:

sudo nano /etc/nginx/nginx.conf

Найдите пустой блок server:

http {
. . .
include /etc/nginx/conf.d/*.conf;
server {
}
server {
listen 80 default_server;
. . .

В этом блоке можно задать все параметры приложения Flask. Укажите порт, который нужно прослушивать, и доменное имя или IP в директиве server_name

server {
listen 80;
server_name server_domain_or_IP;
}

Затем нужно добавить блок location (в нем хранятся HTTP-заголовки и параметры проксирования) и передать весь трафик настроенному ранее сокету:

server {
listen 80;
server_name server_domain_or_IP;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://unix:/home/user/myproject/myproject.sock;
}
}

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

Пользователь nginx должен иметь доступ к каталогу приложения. По умолчанию CentOS блокирует домашние каталоги пользователей. Потому нужно добавить пользователя nginx в группу сетевого пользователя, которому принадлежат права на приложение.

Для этого используйте команду:

sudo usermod -a -G user nginx

Примечание: Вместо user укажите имя вашего пользователя.

Чтобы сервер Nginx мог получить доступ к к необходимому контенту, передайте группе права на выполнение:

chmod 710 /home/user

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

sudo nginx -t

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

sudo service nginx restart

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

Hello There!

Заключение

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

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

Tags: , , , ,

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