Flask Applikation auf einem Apache2 (WSGI) Server hosten

Einleitung

Flask ist ein lightweight Framework für Webapplikationen in Python. Während der Entwicklung in Flask wird meist der eingebaute Development Server genutzt. Für die produktiv Nutzung danach sollte jedoch ein robusterer Webserver, wie z.B. der Apache2 genutzt werden, da dieser ein besseres Logging und bessere Performance bietet. Außerdem ist es deutlich einfacher den Apache2 als Systemdienst zu verwalten, als ein Skript, dass den Flask Development Server startet.

Installation

Zu beginn muss der Apache2 installiert werden.

sudo apt install apache2

Außerdem brauchen wird das WSGI Modul für den Apache2, welches ihm ermöglicht Python Code zu hosten.

sudo apt install libapache2-mod-wsgi-py3

Danach muss das Modul auch aktiviert werden.

sudo a2enmod wsgi

Konfiguration

Wichtig ist bei der Konfiguration die Ordnerstruktur. Um Berechtigungsprobleme zu umgehen, ist es sinnvoll, den Ordner mit der Flask Applikation in das Verzeichnis /var/www/ zu verschieben.

Im Fall meiner Confgen Seite sah die Ordnerstruktur wie folgt aus:

|-/var/www/
|---confgen/
|-----app/
|-------static/
|-------templates/

Damit der Apache weiß, wie er nun mit der Applikation umgehen soll, müssen wir nun eine .wsgi Datei anlegen. Der Name kann beliebig gewählt werden, in meinem Fall wähle ich confgen.wsgi. Diese platzieren wir in dem Ordner Confgen.

|-/var/www/
|---confgen/

|-----confgen.wsgi
|-----app/
|-------static/
|-------templates/
#/var/www/confgen/confgen.wsgi
#!/usr/bin/python
import sys
sys.path.insert(0,"/var/www/confgen/") #Dadurch findet Python die App im PATH

from app import app as application

Jetzt müssen wir noch einen Virtual Host für die Website anlegen, ansonsten wird der Apache2 weiterhin nur seiner Startseite anzeigen.

Dazu erstellen wir folgende Datei /etc/apache2/sites-available/confgen.conf. Der Name confgen.conf kann natürlich geändert werden, solange die Endung .confg erhalten bleibt.

#/etc/apache2/sites-available/confgen.conf
<VirtualHost *:80> #*:443 für HTTPS
    ServerName confgen.jrehkemper.de #IP oder Domain des Servers
    WSGIScriptAlias / /var/www/confgen/confgen.wsgi #Pfad zur WSGI Datie
    <Directory /var/www/confgen/app/>
        Order allow,deny #Prüfe erst Allow und dann Deny Statements
        Allow from all #Kein beschränkter Zugriff
    </Directory>
    Alias /static /var/www/confgen/app/static/
    <Directory /var/www/confgen/app/static/>
        Order allow,deny #Prüfe erst Allow und dann Deny Statements
        Allow from all #Kein beschränkter Zugriff
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Diese Konfiguration berücksichtigt nur eine unverschlüsselte HTTP Verbindung. Wenn eine verschlüsselte HTTPS Verbindung erwünscht ist, muss der Port 80 auf 443 gewechselt werden und ein SSL Zertifikat installiert werden.

Nun muss der Virtual Host auch aktiviert werden.

sudo a2ensite /etc/apache2/sites-available/confgen.conf

Wenn nur diese Webapplikation auf dem Server gehostet wird, ist es sinnvoll alle andern Virtualhosts zu deaktivieren.

ls -l /etc/apache2/sites-enabled # zeigt aktivierte VirtualHosts
sudo a2dissite /etc/apache2/sites-available/<Name>.conf

Zu guter Letzt muss der Apache2 nun einmal neugestartet werden.

systemctl restart apache2

Danach sollte die Flask Applikation unter der IP oder Domain des Webservers erreichbar sein.

Sollte das nicht der Fall sein, sollten die Konfiguration geprüft werden

sudo apachectl configtest

oder das Error-Log untersucht werden.

nano /var/log/apache2/error.log

Troubleshooting

Apache gibt 404 Fehler

Die Datei, in der die Flask Applikation geschrieben wurde, sollte nicht app.py benannt werden. Da in der __init__.py eine app Variable erstellt wird. Wenn nun die Datei genauso heißt treten beim importieren Probleme auf.

Apache Error: Module not callable

Im Ordner mit der Flask Applikation muss eine __init__.py Datei angelegt werden. Diese kann wie folgt aussehen:

from flask import Flask

app = Flask(__name__)

from app import yourapplication.py #import your application file with all the routing
Kommentare anzeigen

Wir nutzen Cookies

Um die Nutzung der Website zu verbessern, nutzen wir Cookies.
Desweiteren werden Google-Dienste für das schalten von Werbung verwendet. Mit der Nutzung der Website geben Sie ihr Einverständnis.
Sollte die Nutzung von Cookies abgelehnt werden, kann dies Auswirkung auf die Nutzung der Website haben.