Разверните приложение Python Flask на Nginx

Nginx Flask uWSGI
Разверните приложение Python Flask на Nginx

Разверните приложение Python Flask на Nginx

Зависит отFind · 11 просмотрено

1. Introduction

Эта статья в основном представляет собой учебное пособие, переведенное с сайта digitalocean.How To Serve Flask Applications with uWSGI and Nginx on Ubuntu 16.04, частично изменен.

Он в основном вводит этапы развертывания приложения Flask на Nginx Server с использованием UWSGI.

Ранее написанный связанный контент:

uwsgi настраивает https, а python2 не может использовать супервизор

nginx настроить https

2. Подготовка

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

Примечание FindHao: пользователи без полномочий root используются из соображений безопасности, но поскольку приобретенная система vps обычно по умолчанию является пользователем root, после установки lnmp через lnmp.org будут созданы пользователь www и группа пользователей www, поэтомуПриведенная ниже конфигурация основана на конфигурации пользователя root.Например, но между ними вставлен шаг для изменения прав доступа к каталогу.

3. Установите необходимое программное обеспечение

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

Обновите исходный код и установите python.

python2:

apt update
apt install python-pip python-dev

python3:

apt update
apt install python3-pip python3-dev

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

4.1 Установите виртуальную среду

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

использоватьpipУстановитьvirtualenv:

# python2
pip install virtualenv
# python3
pip3 install virtualenv

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

mkdir ~/myproject
cd ~/myproject

Или прямо в каталоге LNMP, клонируют ваш проект:

cd /home/wwwroot/
git clone XXXX/myproject.git
# 或者直接拷贝你的项目到对应的域名目录下

FindHao Примечание:

Поскольку мы работаем под root, мы должны передать права собственности на файл проекта www.

chown -R www.www ./*

Потому что lnmp создаст каталог под доменным именем.user.ini, поэтому вы не можете удалить каталог, созданный lnmp, запустите следующий код и удалите его:

chattr -i ``/home/wwwroot/yoursite/``.user.ini

Если вам нужно изменить файл, не забудьте запустить после модификации:

chattr +i ``/home/wwwroot/yoursite/``.user.ini

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

Создайте каталог для виртуальной среды:

virtualenv myenv

myenvКаталог используется для хранения образа локального питона, а в дальнейшем черезpipУстановленные пакеты будут установлены вmyenvкаталог, а не системный каталог.

Перед установкой необходимо активировать только что созданную виртуальную среду:

source myenv/bin/activate

Перед вашей командной строкой будет несколько подсказок, указывающих, что вы работаете в виртуальной среде:

(myenv)user@host:~/myproject#.

5. Настройка приложения Flask

5.1 Установить FLAKS и UWSGI

Обратите внимание, что независимо от того, какую версию Python вы используете, после входа в виртуальную среду вы должны использоватьpip, вместоpip3

(myenv) # pip install uwsgi flask

5.2 Создать образец

Теперь давайте создадим простую программу-пример, чтобы проверить правильность работы flask и uwsgi.

(myenv) # vim index.py

FindHao Примечание:

Изменить права доступа к файлам:

chown www.www index.py

Содержание следующее:

from flask import Flask
app = Flask(__name__)

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

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

Если у вас включен брандмауэр, отключите порт 5000 в правилах брандмауэра.

Запустите наш образец фляги:

(myenv) # python index.py

Получите доступ к порту vps ip+:5000 в браузере:

http://server_domain_or_IP:5000

Если вы видите следующее содержимое, это означает, что операция прошла нормально, вы можете нажать клавишу CTRL C, чтобы прекратить выполнение образца и перейти к следующему шагу.

Flask sample app

6. Настройте uWSGI

6.1 Тестирование uWSGI

Во-первых, нам нужно проверить правильность работы uWSGI:

(myenv) # uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app

Вы должны снова увидеть вышеприведенную подсказку.

CTRL C для завершения иdeactivateВыйти из виртуальной среды

6.2 Создайте файл конфигурации uWSGI

Чтобы сделать запуск и настройку нашего проекта более гибкими, мы создаем файл конфигурации uWSGI:

# vim myproject.ini

Содержание следующее:

[uwsgi]
module = wsgi:app

master = true
processes = 5

socket = myproject.sock
chmod-socket = 660
vacuum = true

die-on-term = true

logto = /var/log/myproject.log

[uwsgi]В заголовке указано, что мы являемся конфигурацией uwsgi.moduleнаправлениеwsgi.pyфайл, обратный вызов в файле — app.

В следующем разделе показано, что проект работает в основном режиме и что запросы обрабатываются пятью рабочими процессами.

В приведенном выше тесте наш uWSGI доступен через сетевой порт, но поскольку позже мы будем использовать nginx для обработки фактического клиентского подключения, а затем передадим его в uwsgi, и поскольку все эти операции выполняются на одной машине, поэтому здесь мы меняем на режим сокета, который безопаснее и быстрее. Указываем, что файл сокета находится в текущей директории проектаmyproject.sock.

Мы также должны изменить разрешения сокета. Позже мы перенесем группу процесса uWSGI в группу nginx, поэтому мы должны убедиться, что пользователь группы сокета может читать и записывать информацию из него. При этом, когда процесс завершится, нужно еще и очистить сокет (vacuum).

die-on-term, чтобы убедиться, что система инициализации и uWSGI имеют одинаковую среду.

logtoзаключается в сохранении файла журнала.

Вы можете заметить, что мы не указали протокол, как в предыдущей командной строке, потому что uWSGI использует протокол по умолчанию.uwsgiпротокол, быстрый бинарный протокол, этот протокол встроен в nginx, использование этого протокола быстрее, чем протокол http.

6.3 Журналы

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

В то же время, поскольку журнал по умолчанию всегда записывается, файл будет продолжать расти, поэтому также необходимо использовать системныеlogrotateИнструмент ведения журнала справляется с этим.

Создайте файл конфигурации журнала

# vim /etc/logrotate.d/myproject-log-file

Содержание следующее:

/var/log/myproject.log {
    monthly
    rotate 5
    compress
    delaycompress
    missingok
    notifempty
    create 644 root root
    postrotate
        /usr/bin/killall -HUP rsyslogd
    endscript
}
  • ежемесячно: файлы журналов будут меняться ежемесячно. Другие доступные значения: «ежедневно», «еженедельно» или «ежегодно».
  • rotate 5: 5 архивных журналов будут храниться одновременно. Для шестого архива будет удален самый старый архив.
  • сжатие: после завершения задачи циклического перебора опрашиваемый архив будет сжат с помощью gzip.
  • delaycompress: всегда используется с параметром compress, параметр delaycompress указывает logrotate не сжимать самый последний архив, сжатие будет выполнено в следующем цикле циклического перебора. Это полезно, когда вам или любому программному обеспечению все еще нужно прочитать последний архив.
  • missingok: во время ротации журналов любые ошибки, такие как ошибки «файл не найден», будут игнорироваться.
  • notifempty: если файл журнала пуст, циклический перебор не будет выполняться.
  • создать 644 root root: создать новый файл журнала с указанными разрешениями, и logrotate также переименует исходный файл журнала.
  • postrotate/endscript: команды, указанные в postrotate и endscript, будут выполнены после завершения всех остальных команд. В этом случае процесс rsyslogd немедленно снова прочитает свою конфигурацию и продолжит работу.

7. Создайте системные файлы

Systemd — это системный инструмент Linux, используемый для запуска демонов и ставший стандартным для большинства дистрибутивов.

Далее мы создадим служебный файл, чтобы система автоматически запускала uWSGI и наше приложение Flask.

Взяв в качестве примера Debian, создайтеmyproject.serviceдокумент:

# vim /lib/systemd/system/myproject.service

Содержание следующее:

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

[Service]
User=www
Group=www
WorkingDirectory=/home/sammy/myproject
Environment="PATH=/home/sammy/myproject/myprojectenv/bin"
ExecStart=/home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini

PIDFile=/run/findyoutube.net.pid
ExecReload=/home/wwwroot/www.findyoutube.net/ftbenv/bin/uwsgi --reload /run/findyoutube.net.pid
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/findyoutube.net.pid
TimeoutStopSec=3
KillMode=mixed

[Install]
WantedBy=multi-user.target

7.1 Поле единиц измерения

[Unit]Блок обычно является первым блоком файла конфигурации и используется для определения метаданных модуля и того, как конфигурация связана с другими модулями.

  • Description: Краткое описание
  • After: Если модуль, указанный в этом поле, также должен быть запущен, он должен быть запущен до текущего модуля.

7.2 Служебное поле

[Service]Блок используется для настройки Сервиса, этот блок есть только у Объекта типа Сервис.

  • ExecStart: команда для запуска текущей службы
  • ExecReload: команда для выполнения при перезапуске текущей службы
  • ExecStop: команда для выполнения, когда текущая служба остановлена.
  • Environment: указать переменные среды
  • KillMode:mixed: основной процесс получит сигнал SIGTERM, а дочерний процесс получит сигнал SIGKILL

user и group используются для указания пользователя и группы, к которой принадлежит процесс. lnmp по умолчанию www.www. Установите рабочий каталог и путь, чтобы сообщить системе инициализации, где находится наш проект и как выглядит виртуальная среда. Затем выполните uwsgi, чтобы запустить приложение Flask.

FindHao Примечание:

В этом служебном файле я добавилPIDFile,ExecReload,ExecStopПодождите несколько полей, потому что, если нет полей перезагрузки и остановки, чтобы перезапустить наше приложение Flask, мы можем только перезапустить vps или убить процесс uwsgi.

PIDFileУказывает файл процесса нашего приложения Flask, который можно передать для остановки и перезагрузки позже.

Reload использует перезагрузку, поставляемую с uwsgi.

stop находит указанный процесс и завершает его, блокируя файл процесса.

7.3 Поле установки

[Install]Обычно это последний блок конфигурационного файла, он используется для определения того, как запускать и нужно ли запускать при загрузке.

  • WantedBy: его значение — одна или несколько целей, в которые будет помещена символическая ссылка при активации текущего юнита (включить)/etc/systemd/systemНиже каталога находится название Target+.wantsподкаталоги, образованные суффиксом

7.4 Эксплуатация

После сохранения приведенного выше файла конфигурации часто используемые команды systemd:

systemctl start myproject # 开启应用
systemctl enable myproject # 添加开机自启动
systemctl disable myproject # 取消开机启动
systemctl restart myproject # 重启应用
systemctl reload myproject # 重新加载配置
systemctl stop myproject # 停止应用
systemctl status myproject # 查看应用状态

После открытия приложения проверьте статус приложения.Если оно активно, это говорит о том, что оно успешно запущено и работает.Если оно не удалось, вы можете пройтиjournalctlПросмотрите журнал выполнения иG(Просмотреть форму vim, т.е. Shift + g до последней строки), чтобы увидеть, что такое ошибка запуска.

8. Настройте Nginx для обработки запросов

Если это nginx, установленный lnmp, каталог конфигурации nginx/usr/local/nginx/conf/vhost.

Если он не был установлен ранее, вы можете установить nginx напрямую через apt, но версия nginx в исходниках может быть старой, и некоторые новые возможности не поддерживаются, рекомендуется установить его в официальные исходники nginx, см. к«конфигурация nginx https» 3.6 nginx поддерживает HTTP2. Отдельно установленный каталог файла конфигурации nginx обычно/etc/nginx/sites-available

Создайте новый файл конфигурации nginx в каталоге конфигурации nginx.myproject, содержание следующее:

server {
    listen 80;
    server_name server_domain_or_IP;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/sammy/myproject/myproject.sock;
    }
}

listen означает прослушивание порта 80, а server_name — это ваше доменное имя или IP-адрес.

localtion /Это означает, что для доменного имени или ip/способ обработки запроса. Сначала включивuwsgi_paramsдля загрузки некоторых параметров uWSGI по умолчанию. потомuwsgi_passНаправить запрос в сокет, который мы определили.

Это просто создает пригодный для использования файл конфигурации, если вы хотите включить его, вам также необходимо создать символическую ссылку на каталог enable:

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

Проверяем правильность написания нашего конфигурационного файла:

# nginx -t

Если будет предложено, перезапустите nginx:

systemctl restart nginx

Доступ к нашему доменному имени или IP-адресу можно рассматривать как нормальную операцию.

Reference

lnmp не может удалить каталог, каталог содержит .user.ini

How To Serve Flask Applications with uWSGI and Nginx on Ubuntu 16.04

uwsgi настраивает https, а python2 не может использовать супервизор

Начало работы с Systemd: команды

Менеджер файлов журналов Linux — logrotate