% 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 =$color?>
…
```
## 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 :
```