вторник, 4 августа 2015 г.

День 1. Настройка Apache, mod_wsgi и Flask-приложения на виртуальном хосте

Сегодня опишу свой опыт по настройке Apache для запуска Flask-приложения на виртуальной машине.

Подготовка

Итак, имеем гостевую ОС (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
После установки, как правило модуль сразу подключается и перезагружается Apache
Возможно, что для включения 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
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'
Наконец, создаем конфигурацию нового виртуального хоста  в каталоге /etc/apache2/sites-available.
Запустите в терминале:
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

Теперь структура каталогов должна выглядеть следующим образом:

|--------FlaskApp
|----------------FlaskApp
|-----------------------static
|-----------------------templates
|-----------------------venv
|-----------------------__init__.py
|----------------flaskapp.wsgi
Вносим изменения для получения возможности попасть на сервер по его имени в hosts файл (/etc/hosts):
127.0.0.1 localhost  flaskapp.test.local

Перезапуск Apache

Для применения изменений перезапустите Apache:
$ sudo service apache2 restart  
Вот и все! Теперь Вы можете проверить доступ к приложению как на виртуальном, так и реальном хостах, перейдя по адресу: http://flaskapp.test.local в вашем браузере.

Жду Ваших комментариев. До новых встреч. В дальнейших статьях я расскажу о том, как занимаюсь проектированием своей информационной системы. с радостью отвечу на все вопросы. Пишите, плюсуйте и добавляйтесь в друзья!

2 комментария:


  1. Экзотические растения семена адениума и другие комнатные цветы.

    сегодня

    ОтветитьУдалить
  2. Статья с ошибкой
    В каталоге с приложением создадим файл flaskTest.wsgi
    при этом в конфиге Апача указывается иное имя wsgi
    WSGIScriptAlias / /var/www/FlaskApp/flaskapp.wsgi
    Поправьте эту неточность.

    ОтветитьУдалить