Обслуживание приложений Flask с помощью Gunicorn и Nginx в CentOS 7
Centos, Python | Комментировать запись
Данное руководство поможет настроить простое приложение 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: CentOS 7, Flask, Gunicorn, NGINX, Python