poloniumv's

Flask-приложение (python3) и Apache2 на debian-машине

6 сентября 2018 г. 12:09

Первым делом, если еще не установлен, ставим apache2 и, поскольку нужен python3, соответствующий модуль:

sudo apt-get install apache2 libapache2-mod-wsgi-py3
sudo a2enmod wsgi

 

По-умолчанию, в debian'е не установлен python3. А еще нам нужен pip для него, и venv для виртуального окружения, поэтому:

sudo apt-get install python3 python3-pip python3-venv

 

В /var/www создаем каталог проекта. Пускай будет обзываться Example. Внутри него также создадим каталог для логов, приложения, темплейтов и статики:

sudo mkdir /var/www/Example
sudo mkdir /var/www/Example/logs
sudo mkdir /var/www/Example/app /var/www/Example/app/templates /var/www/Example/app/static

 

Создадим скрипт app.wsgi, который позже скормим апачу:

sudo nano /var/www/Example/app.wsgi
#!/usr/bin/python

activate_this = "/var/www/Example/app/venv/bin/activate_this.py"
with open(activate_this) as file_:
    exec(file_.read(), dict(__file__=activate_this))

import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, "/var/www/Example/")

from app import app as application

 

Создадим еще два файла для простейшего Flask-приложения, __init__.py и routes.py:

sudo nano /var/www/Example/app/__init__.py
from flask import Flask

app = Flask(__name__)

from app import routes

sudo nano /var/www/Example/app/routes.py
from flask import render_template
from app import app

@app.route('/')
def index():
    return render_template(
        'index.html'
    )

 

И простенький index.html:

sudo nano /var/www/Example/app/templates/index.html
<!DOCTYPE html>
<html>
<head><title>Test</title></head>
<body>
  <h1>Hello, Flask!</h1>
</body>
</html>

 

Установим владельца и группу для /var/www/Example:

sudo chown -R username:www-data /var/www/Example

 

Установим виртуальное окружение для нашего проекта, войдем в него, установим Flask, покинем виртуальное окружение:

python -m venv /var/www/Example/app/venv
source /var/www/Example/app/venv/bin/activate
pip install Flask
deactivate

 

Положим в каталог /var/www/Example/app/venv/bin/ скрипт, необходимый для работы mod_wsgi с виртуальным окружением:

nano /var/www/Example/app/venv/bin/activate_this.py
try:
    __file__
except NameError:
    raise AssertionError(
        "You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))")
import sys
import os

old_os_path = os.environ.get('PATH', '')
os.environ['PATH'] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path
base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if sys.platform == 'win32':
    site_packages = os.path.join(base, 'Lib', 'site-packages')
else:
    site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')
prev_sys_path = list(sys.path)
import site
site.addsitedir(site_packages)
sys.real_prefix = sys.prefix
sys.prefix = base

new_sys_path = []
for item in list(sys.path):
    if item not in prev_sys_path:
        new_sys_path.append(item)
        sys.path.remove(item)
sys.path[:0] = new_sys_path

 

Создадим конфиг vhost'а для Apache2:

sudo nano /etc/apache2/sites-available/example-flask.conf
<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com

    ErrorLog /var/www/Example/logs/error.log
    CustomLog /var/www/Example/logs/access.log combined
    
    WSGIDaemonProcess Example user=www-data group=www-data threads=5 home=/var/www/Example
    WSGIScriptAlias / /var/www/Example/app.wsgi

    <Directory /var/www/Example>
        
        WSGIProcessGroup Example
        WSGIApplicationGroup %{GLOBAL}
        WSGIScriptReloading On
        Order deny,allow
        Allow from all
    </Directory>
    
    Alias /static /var/www/Example/app/static
    <Directory /var/www/Example/app/static>
    	Order allow,deny
    	Allow from all
    </Directory>
</VirtualHost>

 

Активируем его и перезапустим Apache2:

sudo a2ensite example-flask
sudo systemctl reload apache2

 

Готово.