Ceci est une ancienne révision du document !
Table des matières
Comment programmer un serveur web ?
Côté client (c'est à dire ce qui s'affiche dans le navigateur du visiteur du site), on fait du HTML (contenu) + CSS (mise en page) + Javascript (aspect dynamique des pages).
Mais comment programmer ce qu'il se passe côté serveur ? Exemple : lorsqu'on poste sur Faceb**k, Twitter, lorsqu'on uploade une photo en ligne, il faut bien que du code s'exécute sur un serveur distant pour enregistrer tout cela dans une base de données, etc.
C'est ce que nous allons voir ici.
PHP
PHP est le langage par excellence pour programmer côté serveur. Statistique 2018 :
According to W3Techs' data, PHP is used by 78.9% of all websites with a known server-side programming language.
Pour démarrer avec PHP, la méthode est assez simple :
Avoir un hébergement web (et un serveur web qui tourne dessus, comme par exemple Apache ou Nginx, mais c'est souvent le cas pré-installé)
Créer un fichier
index.php
à la racine de son site :<?php echo "Hello world"; ?>
C'est tout! Il suffit d'ouvrir
https://example.com/monsite/index.php
dans son navigateur et ce "code" est executé pour en faire une page web.
Avantages :
Il y a souvent rien à installer, car Apache et PHP sont installés par défaut sur les hébergements webs mutualisés. En gros, que se passe-t-il ? Lorsque Apache reçoit une requête pour
http://example.com/monsite/index.php
, il voit que c'est un .php et il passe la requête à PHP (via https://stackoverflow.com/questions/2712825/what-is-mod-php/2712839#2712839) qui exécute le code et produit une chaîne de caractères (string) en sortie, et Apache livre cela au "client" dans son navigateur.Cela est très rapide (à chaque requête, le process Apache qui s'occupe de cette requête démarre un nouveau thread pour PHP et cela se fait très rapidement, lire aussi cet article pour plus de détails)
Python
Méthode simple (mais bizarrement assez peu connue)
Il y a une méthode toute simple pour faire de la programmation web en Python, avec une logique un peu similaire à PHP :
Installer le module
mod_python
:apt-get install libapache2-mod-python
Créer un fichier
.htaccess
à la racine du site, pour indiquer que les fichiers .py doivent être traités par Python, contenant ceci :AddHandler mod_python .py PythonHandler mod_python.publisher
Créer un fichier
test.py
:def index(req): return("<html><body>Hello world</body></html>")
Ouvrir
https://www.example.com/test.py
dans le navigateur, ça marche !
Avantages :
logique toute simple, identique à ce qu'on fait en PHP
pas de librairie / framework à utiliser
Inconvénients :
- il doit y en avoir mais j'ai pas encore trouvé (j'éditerai ultérieurement)
Todo :
- mesurer le timing précis pour voir si c'est performant
La méthode classique
La méthode "classique" pour faire du web en Python est assez différente des méthodes présentées précédemment.
Contrairement à avoir, comme précédemment, pour chaque requête, un module (mod_php
ou mod_python
) qui "passe le relais" entre Apache et PHP ou Apache et Python, il s'agit ici d'avoir un process Python qui tourne en permanence, et attend les requêtes au fur et à mesure, dans une boucle infinie (Event loop).
Exemple :
from bottle import route, run, template @route('/hello/<name>') def hello(name): return template('<b>Bonjour {{name}}</b>!', name=name) @route('/') def index(): return template('Bienvenue sur le site!') run(host='localhost', port=8080) # boucle infinie, qui attend des événements (des requêtes)
On utilise classiquement un framework pour ça :
- bottle.py, c'est le plus simple que j'ai testé et il marche super bien. Avantage: c'est un micro-framework en 1 seul fichier .py.
- Flask, grosso modo pareil, peut-être un peu plus complet
- Django, réputé comme très complet, jamais testé
Le code précédent fonctionne bien, mais "écoute" sur le port 8080, donc on peut y accéder avec https://example.com:8080/
. Comment donc relier ce process Python avec Apache qui écoute sur le port 80 ?
soit en faisant un
.htaccess
qui indique à Apache de rediriger une requête vers le serveur PythonRewriteEngine On RewriteRule /(.*) http://localhost:8080/$1 [P,L]
Il faut manuellement se débrouiller pour que le script Python tourne sans arrêt, même si on ferme la fenêtre du terminal / le SSH. Exemple dans Bash:
nohup python mysever.py &
ou avec
screen
(voir un tuto à ce sujet) :screen -S pythonserver
,python myserver.py
, puis CTRL+A+D pour "détacher" le terminalsoit avec
mod_wsgi
(méthode souvent recommandée)Faire:
apt-get install libapache2-mod-wsgi
puis mettre ça dans la config Apache:
<VirtualHost *:80> ServerName example.com WSGIDaemonProcess yourapp user=www-data group=www-data processes=5 threads=5 WSGIScriptAlias / /var/www/wsgi_test/app.wsgi <Directory /var/www/wsgi_test> WSGIProcessGroup yourapp WSGIApplicationGroup %{GLOBAL} Require all granted </Directory> </VirtualHost>
(à améliorer / retester)
Javascript
Oui on peut faire du Javascript côté serveur, c'est le cas notamment avec le framework très populaire NodeJS.
Le principe est le même que dans le paragraphe précédemment, on a un process qui tourne en permanence, avec une boucle d'événements (event loop) :
node app.js
Voici le code pour app.js
:
var express = require('express'); var app = express(); app.get('/', function (req, res) { res.send('Hello World!'); }); app.listen(8080, function () { console.log('Example app running!'); });
C
Pour les puristes ! In progress...