% Introduction au web dynamique % Sylvain Eliade — S.C.O.P. Cadoles ## Introduction web dynamique * Dans le web *statique*, le serveur web ne fait que renvoyer le contenu d'un fichier existant * Dans le web *dynamique*, le serveur web délègue la génération du contenu à un sous-programme * Ce sous-programme peut réagir aux demandes de l'utilisateur, retourner des données d'une base de données, etc. --- ## Script CGI À l'origine, le serveur web interagissait avec des scripts CGI (Common Gateway Interface) : il exécutait un programme, auquel il passait les données de la requête HTTP, et retournait ce que le script lui renvoyait. --- Configuration Apache : ``` Options +ExecCGI AddHandler cgi-script .cgi ``` --- Exemple de script basique `date.cgi` ``` #!/bin/bash echo "Content-type: text/html" echo "" echo "Nous sommes le " date ``` Résultat : ``` Nous sommes le mercredi 15 mai 2019, 14:38:57 (UTC+0200) ``` --- Exemple d'interaction avec la requête `methode.cgi` : ``` #!/bin/bash echo "Content-type: text/html" echo "" echo "Méthode de requête utilisée : " echo "$REQUEST_METHOD" ``` Résultat : ``` Méthode de requête utilisée : GET ``` --- Avantage : très simple ! Inconvénient : peu performant, chaque requête crée un nouveau processus qui est détruit à la fin de la requête. --- ## FastCGI * Un second serveur (FastCGI), qui communique avec le serveur web * Il garde le processus lancé en permanence * Il reçoit les requêtes du serveur web * Il lui envoie des requêtes et reçoit des réponses * Il renvoie les réponses au serveur web Ainsi il n'y a plus de création/destruction de processus, plus rapide. De plus le serveur FastCGI peut avoir plusieurs processus lancés en même temps, et répartir les requêtes. C'est un modèle similaire aux *workers* Apache ! --- ## Présentation de PHP * Langage de programmation * Créé en 1994 * Originellement conçu comme proche de Perl et C * Pour faire des pages web dynamiques (en CGI !) * Mal considéré (à tort) * Utilisé sur 79% des sites web (WordPress sur 32% des sites !) --- ### Les versions * PHP 7 est 2-3 fois plus rapide que PHP 5.6 * PHP 5 n'est plus supporté (plus de mises à jour de sécurité), PHP 7.0 non plus ! Les versions de PHP sont supportées environ 3 ans (mais les distributions peuvent allonger ce délai en backportant les correctifs). Moralité : beaucoup de boîtes sont à la ramasse, et se traînent des PHP qui ne sont pas à jour… Et ça peut durer longtemps. --- ### A quoi ça ressemble ? ```

My favorite unicorn color is

… ``` ## Installation et configuration de PHP Il existe plusieurs versions de PHP : * En ligne de commande : CLI (`apt install php-cli`), utile pour lancer des scripts, tester rapidement avec le serveur web intégré… * mod_php pour Apache (`apt install libapache2-mod-php`) * FPM (FastCGI Process Manager) pour serveur web (`apt install php-fpm`) --- ### PHP CLI Cette version en ligne de commande permet de lancer un script (`php monscript.php`) ou un serveur web de test pour essayer un site, etc. (`php -S localhost:8080 /var/www/monsite` et le site sera joignable sur http://localhost:8080/). Le serveur web ne peut traiter qu'une seule requête en même temps… pas très indiqué pour un vrai site web ! --- ### mod_php * Très simple à mettre en place * Nécessite mpm-prefork = pas très rapide * Convient pour des petits sites Rien à configurer dans Apache : les fichiers `.php` seront exécutés directement. --- ### Rappel sur MPM-ITK Pour configurer MPM-ITK sur un vhost pour qu'il se limite à utilisateur : ``` AssignUserId USER GROUP ``` --- ### FPM * Basé sur FastCGI * Crée un serveur d'application PHP * Un peu de configuration à faire * Permet de créer plusieurs *pools* pour des sites/utilisateurs différents * Rapide ! --- ## Configuration FPM Création de pool dans `/etc/php/7.0/fpm/pool.d/cesi.conf` : ``` [cesi] … user = cesi group = cesi … listen = /run/php/php7.0-fpm-cesi.sock ``` --- Configuration du VHost : ``` SetHandler "proxy:unix:/run/php/php7.0-fpm-cesi.sock" ``` --- ## Exercice 1 Faire un script PHP qui va afficher la date du jour. L'exécuter avec `php` en ligne de commande. --- ## Exercice 2 Installer `mod_php`. Déplacer le script créé dans un répertoire d'un vhost existant. Vérifier sa bonne exécution avec curl, ou un navigateur. --- ## Exercice 3 Prérequis : avoir au moins deux vhosts actifs différents. * Créer un utilisateur par vhost avec `useradd -G www-data USER` * Installer et activer le MPM ITK de Apache. * Pour chaque vhost, configurer le vhost pour utiliser ITK et l'utilisateur du vhost et le groupe *www-data* (via `AssignUserId`) Puis : Dans chaque répertoire de chaque vhost mettre un fichier `compteur.php` dont le contenu est : ```