
Configurer un webservice Python Flask sur Apache HTTPD
J’ai créé un webservice en Python pour une application maison. J’ai donc utilisé Flask, qui est parfait pour créer très rapidement un webservice. Seulement sur le serveur de production, c’est Apache HTTPD qui tourne. J’ai donc commence par utiliser mod_proxy pour faire un pont entre Flask et HTTPD. Je ne sais pas pourquoi, je n’ai pas réussi à garder le referer dans les requêtes GET / POST, du coup la sécurité CORS m’empêchait de passer par cette méthode.
Comment configurer un webservice Python avec Apache HTTPD ?
En fait c’est plutôt simple, mod_wsgi permet de créer un démon qui va se charger de lancer notre application Python.
Installer mod_wsgi
Installer Python 2 sous CentOS 7
yum -y install mod_wsgi
Installer Python 3 sous CentOS 7
Installer Python2 sous Debian / Ubuntu
apt install libapache2-mod-wsgi
Configurer mod_wsgi pour son webservice Python Flask
Créer un fichier app.wsgi à la racine du dossier de votre dossier Python.
import sys
sys.path.insert(0, '/var/www/melico-back')
from app import app as application
Voici un extrait de mon fichier app.py.
from config import Config
from flask import Flask
import daemon
app = Flask(__name__)
if __name__ == "__main__":
# test
if Config.DEBUG:
app.run(debug=True)
# prod
else:
with daemon.DaemonContext():
app.run(threaded=True)
Configurer mod_wsgi sur Apache HTTPD 2.4 avec Python 3
Voici mon fichier de configuration pour vhost.conf.
WSGISocketPrefix run/wsgi
<VirtualHost 0.0.0.0:443>
ServerName back.melico.fr
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/back.melico.fr/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/back.melico.fr/privkey.pem
LogLevel Debug
ErrorLog /var/log/httpd/back.melico.fr/error.log
WSGIDaemonProcess app user=httpd group=httpd threads=5
WSGIScriptAlias / /var/www/melico-back/app.wsgi
WSGIPassAuthorization On
<Directory /var/www/melico-back>
WSGIProcessGroup app
WSGIApplicationGroup %{GLOBAL}
Require all granted
</Directory>
<Files app.wsgi>
Require all granted
</Files>
SSLCertificateChainFile /etc/letsencrypt/live/back.melico.fr/chain.pem
</VirtualHost>
On peut voir qu’Apache HTTPD se charge de créer un démon Python pour exécuter notre application.