Сегодня опишу свой опыт по настройке Apache для запуска Flask-приложения на виртуальной машине.
Для получения доступа к гостевой ОС по IP-адресу необходимо настроить работу сетевого интерфейса на виртуальной машине в режиме моста:
Чтобы иметь возможность попасть по DNS-имени на виртуальный хост вэб-сервера, на нашем ПК ( host OS: Windows 10) вносим изменения в файл:
Подготовка
Итак, имеем гостевую ОС (guest OS) Xubuntu 14.04 на VirtualBox v.5.0. Устанавливаем вэб-сервер по руководству с форума ubuntu без особого труда. Попутно знакомимся с базовыми настройками виртуальных хостов и подключением к СУБД MySQL.Для получения доступа к гостевой ОС по IP-адресу необходимо настроить работу сетевого интерфейса на виртуальной машине в режиме моста:
Чтобы иметь возможность попасть по DNS-имени на виртуальный хост вэб-сервера, на нашем ПК ( host OS: Windows 10) вносим изменения в файл:
c:\windows\system32\drivers\etc\hostsв формате:
IP-адрес(guest OS) DNS-имя виртуального сервера настроенного на Apache.Проверить доступность виртуального хоста можно командой ping из консоли Windows cтандартной командой ping
Далее в посте будут описаны настройки Apache, mod_wsgi и Flask-приложения на гостевой ОС.
Установка и настройка mod_wsgi
WSGI (Web Server Gateway Interface) интерфейс между вэб-сервером и web-приложением python. Mod_wsgi модуль сервера Apache, позволяющий Apache работать с Flask-приложениями.Откройте терминал и для установки mod_wsgi наберите:
$ sudo apt-get install libapache2-mod-wsgi python-dev
Возможно, что для включения mod_wsgi, необходимо будет выполнить команду:
$ sudo a2enmod wsgi
Создание Flask-приложения
На этом шаге создадим простое Flask-приложение. Располагаться приложение будет в каталоге /var/www .В указанном каталоге создадим структуру:
|----FlaskApp
|---------FlaskApp
|--------------static
|--------------templates
Теперь создадим файл __init__.py в каталоге /var/www/FlaskApp/FlaskApp который и будет содержать логику приложения:
$ sudo nano __init__.pyсодержимое файла:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, this is Flask application!"
if __name__ == "__main__":
app.run()
Установка Flask
Сперва создадим виртуальное окружение, чтобы изолировать окружение приложения от системного.Используем pip для установки virtualenv и Flask. Если pip еще не установлен, установим с помощью apt-get:
$ sudo apt-get install python-pipЕсли virtualenv не установлен, используем pip для его установки:
$ sudo pip install virtualenvЗапуск следующей команды создаст виртуальное окружение ( venv название нашего временного окружения):
$ sudo virtualenv venvТеперь активируем окружение:
$ source venv/bin/activateУстановим в окружение Flask:
$ sudo pip install FlaskПроверим установку и работу нашего приложения:
$ sudo python __init__.pyВ консоли мы должны увидеть “Running on http://localhost:5000/” или "Running on http://127.0.0.1:5000/".
Отлично! Приложение запустилось. Перейдя в брауpере по ссылке http://localhost:5000/ вы попадете на страницу приложения.
Для деактивации окружения введите:
$ deactivate
Настройка и создание нового виртуального хоста
Учитывая, что документация по настройке Flask с Apache предполагает знакомство с WSGI приложениями, пришлось достаточно долго вникать, перечитывать официальное руководство, чтобы понять "Flask way" интеграции приложения с Apache. Далее я привожу вольный перевод найденного мной поста о настройке Flask приложения на Apache.Создаем пользователя без шелла (оболочки), от имени которого будет запускаться приложение. Можно, конечно, использовать пользователя Apache (www-data), но для упрощения определения файлов, которые использует/создает приложение, лучше создать отдельного пользователя.
Создаем пользователя без домашнего каталога:
$ useradd -M flaskОтключаем шелл:
$ usermod -s /bin/false flaskБлокируем аккаунт для доступа с консоли:
$ usermod -L flaskДобавляем пользователя в группу Apache www-data. Это позволит упростить управление правами к файловой системе, позволив сохранить владельца файлов, но предоставив доступ к ним группе www-data.
$ adduser flask www-dataВ каталоге с приложением создадим файл flaskTest.wsgi:
#!/usr/bin/pythonНаконец, создаем конфигурацию нового виртуального хоста в каталоге /etc/apache2/sites-available.
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/FlaskApp/")
from FlaskApp import app as application
application.secret_key = 'Add your secret key'
Запустите в терминале:
$ sudo nano /etc/apache2/sites-available/FlaskApp.confВведите следующий код для конфигурации виртуального хоста:
<VirtualHost *:80>
ServerName flaskapp.test.local
ServerAdmin email@domain.com
WSGIDaemonProcess flaskapp user=flask group=www-data threads=5 home=/var/www/FlaskApp/FlaskApp
WSGIScriptAlias / /var/www/FlaskApp/flaskapp.wsgi
<Directory /var/www/FlaskApp/FlaskApp/>
WSGIProcessGroup flaskapp
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Директива WSGIScriptReloading означает, что при любом изменении файлов приложения, достаточно выполнить:
$ touch flaskTest.wsgiи приложение будет перезапущено с применением изменений.
Более подробно с настройками WSGI Вы можете ознакомиться здесь: https://code.google.com/p/modwsgi/wiki/ConfigurationDirectives
Теперь структура каталогов должна выглядеть следующим образом:
Вносим изменения для получения возможности попасть на сервер по его имени в hosts файл (/etc/hosts):
|--------FlaskApp
|----------------FlaskApp
|-----------------------static
|-----------------------templates
|-----------------------venv
|-----------------------__init__.py
|----------------flaskapp.wsgi
127.0.0.1 localhost flaskapp.test.local
Перезапуск Apache
$ sudo service apache2 restartВот и все! Теперь Вы можете проверить доступ к приложению как на виртуальном, так и реальном хостах, перейдя по адресу: http://flaskapp.test.local в вашем браузере.
Жду Ваших комментариев. До новых встреч. В дальнейших статьях я расскажу о том, как занимаюсь проектированием своей информационной системы. с радостью отвечу на все вопросы. Пишите, плюсуйте и добавляйтесь в друзья!
ОтветитьУдалитьЭкзотические растения семена адениума и другие комнатные цветы.
сегодня
Статья с ошибкой
ОтветитьУдалитьВ каталоге с приложением создадим файл flaskTest.wsgi
при этом в конфиге Апача указывается иное имя wsgi
WSGIScriptAlias / /var/www/FlaskApp/flaskapp.wsgi
Поправьте эту неточность.