Разверните приложение 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 не может использовать супервизор
2. Подготовка
Прежде чем начать, убедитесь, что на вашем сервере развернут пользователь без полномочий root, этот пользователь должен использоватьsudo
выполнять команды администратора.
Примечание FindHao: пользователи без полномочий root используются из соображений безопасности, но поскольку приобретенная система vps обычно по умолчанию является пользователем root, после установки lnmp через lnmp.org будут созданы пользователь www и группа пользователей www, поэтомуПриведенная ниже конфигурация основана на конфигурации пользователя root.Например, но между ними вставлен шаг для изменения прав доступа к каталогу.
3. Установите необходимое программное обеспечение
Мы постараемся пройтиpip
orpip3
установить пакет вместо использования инструментов в исходном коде дистрибутива, чтобы избежать проблем, вызванных слишком низкой версией инструмента в исходном коде.
Обновите исходный код и установите 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, чтобы прекратить выполнение образца и перейти к следующему шагу.
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 не может использовать супервизор