Установка flask-приложения на веб-сервер Ubuntu + Apache
В данной статье описывается разворачивание созданного на Flask сайта на удаленном виртуальном сервере (VPS) с операционной системой Ubuntu и программным веб-сервером Apache. Предполагается, что вы уже знаете, как установить Apache и настроить его на отдачу статичного сайта. Также мы не касаемся вопроса, под каким пользователем вы выполняете действия. Если это не root, большинство команд будут предполагать "префикс" sudo
.
Для запуска flask-приложений далеко не всегда используется Apache. Нередко используют связку Gunicorn и Nginx. Однако, если на одном VPS размещается несколько сайтов, и не все созданы на Python, бывает проще использовать Apache.
При этом связь между Apache и flask-приложением обеспечивает специальный модуль, представляющий собой WSGI-сервер, интегрированный в Apache, то есть является его модулем, а не пакетом Python. Модуль wsgi-сервера устанавливается следующей командой:
apt install libapache2-mod-wsgi-py3
Также надо установить сам микрофреймворк Flask (Python в Ubuntu уже должен быть по-умолчанию).
pip3 install Flask
или apt install python3-flask
Flask можно установить как в саму операционную систему, так и в виртуальное окружение, предварительно создав его в каталоге, где будут находиться файлы сайта. В последнем случае в файле настроек Apache под данный сайт (находится в каталоге /etc/apache2/sites-available) будут несколько другие инструкции (упомянем ниже).
На своем локальном компьютере, перед тем как создать архив для выгрузки на удаленный сервер, в корневом каталоге проекта (flask-приложения, сайта) создадим файл с расширением .wsgi и таким содержанием:
import sys sys.path.insert(0, '/var/www/html/') from project import app as application
Здесь /var/www/html/ ‒ адрес каталога на удаленном сервере, в котором будут размещены файлы нашего сайта. project ‒ имя основного python-файла приложения без расширения. app ‒ имя переменной, которой присваивается экземпляр Flask
. Если у вас каталог и имена другие, указываете их. Слово application
при данном способе настройки веб-сервера должно остаться как есть. Если вы назвали python-файл app.py, а переменную экземпляра Flask ‒ app, то импорт будет таким: from app import app as application
.
Имя файла .wsgi может быть любым. Важно запомнить его, оно понадобится позже. Пусть будет: siteapp.wsgi. Примечание: при использовании WSGIDaemonProcess нельзя для разных сайтов, размещенных на одном веб-сервере, одинаково именовать файлы .wsgi.
Для переноса файлов проекта на VPS можно создать архив и/или воспользоваться утилитой scp. Если же вы планируете часто обновлять сайт, то лучше настроить git.
Перейдите в каталог /etc/apache2/sites-available/. Откройте на редактирование конфигурационный файл вашего сайта. Если вы "работаете по живому" ‒ не меняете сервер и переводите работающий сайт, уже имеющий сертификат безопасности, на Flask, то править надо конфигурационный файл для порта 443, а не 80.
Вместо строчки с указанием корневой директории сайта:
DocumentRoot /var/www/html
вставляем такую:
WSGIScriptAlias / /var/www/html/siteapp.wsgi
Инструкции для директории могут выглядеть так:
<Directory /var/www/html> Order allow,deny allow from all </Directory>
Если устанавливалось виртуальное окружение Python, то инструкций будет больше:
WSGIDaemonProcess itapp python-home=/var/www/html/.env \ user=www-data group=www-data processes=2 threads=5 WSGIScriptAlias / /var/www/html/siteapp.wsgi <Directory /var/www/inf1.info/> WSGIProcessGroup itapp WSGIApplicationGroup %{GLOBAL} Order allow,deny allow from all </Directory>
Вариант с процессом, но без виртуального окружения:
WSGIDaemonProcess itapp user=www-data group=www-data processes=2 threads=5 WSGIScriptAlias / /var/www/html/siteapp.wsgi <Directory /var/www/html> WSGIProcessGroup itapp WSGIApplicationGroup %{GLOBAL} Order allow,deny allow from all </Directory>
Имя для WSGIDaemonProcess (в примере выше это itapp) должно быть уникально, и в разных файлах конфигурации даже одного сайта различаться. А при выпуске сертификата происходит копирование настроек. Поэтому прописывать его следует после установки сертификата, иначе возникает ошибка при выпуске. Из этого следует, что если вы используете виртуальное окружение, сертификат должен быть уже выпущен. Или при выпуске инструкции, связанные с WSGIDaemonProcess, надо закомментировать.
Опции processes
и threads
можно не указывать. В справке по Flask количество процессов рекомендуют устанавливать из расчета CPU*2. То есть если у вашего VPS одно ядро, следует указать 2 процесса. Исходя из ответа (stackoverflow.com/questions/49307704/multi-process-flask-application-on-apache) количество потоков по умолчанию вероятно 15. При указании процессов потоки между ними перераспределяются.
Опции user
и group
также могут отсутствовать.
Для вступления настроек в силу требуется перезапустить Apache:
systemctl restart apache2
Если после этого сайт не загружается, ошибка может быть связана с неверным владельцем файлов flask-приложения. Если в системе не создавался обычный пользователь, файлы принадлежат root, и сайт не работает, следует изменить владельца на www-data:
chown -R www-data:www-data /var/www/html/
После этого сайт должен заработать.
Отметим, что бывают ситуации, когда сайт работает на локальном компьютере, но не на VPS. Например, если вы использовали в коде flask-приложения функцию open
. На реальном сервере она не находит файл.
Если для статичного сайта редирект с www на без www, или наоборот, был прописан в файле .htaccess корневого каталога сайта, то в случае flask-приложения сделать это можно в конфигурационном файле Apache для данного сайта. Например, добавим в файл для порта 443 (перед закрывающим тегом VirtualHost
) такие команды:
RewriteEngine On RewriteCond %{HTTP_HOST} ^www.flask.website RewriteRule ^ https://flask.website%{REQUEST_URI} [R=301,L]
Это перенаправление с www на без www.