Первым делом, если еще не установлен, ставим 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
Готово.