formations/cesi/hebergement_web/04-dynamique.md

272 lines
6.0 KiB
Markdown
Raw Permalink Normal View History

2019-05-15 12:23:31 +02:00
% 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 :
```
<Directory "/var/www/cesi.test">
Options +ExecCGI
AddHandler cgi-script .cgi
</Directory>
```
---
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 ?
```
<?php
echo "Aujourd'hui nous sommes le ";
echo date('d/m/Y');
```
---
```
<?php
$colors = ['blue', 'white', 'rainbow', 'yellooooollipop'];
$color = $colors[array_rand($colors)];
?>
<p>My favorite unicorn color is <?=$color?></p>
```
## 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 :
```
<IfModule mpm_itk_module>
AssignUserId USER GROUP
</IfModule>
```
---
### 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 :
```
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php7.0-fpm-cesi.sock"
</FilesMatch>
```
---
## 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 :
```
<?php
if (file_exists('stats.txt')) {
$nb_visites = file_get_contents('stats.txt');
}
else {
$nb_visites = 0;
}
$nb_visites++;
file_put_contents('stats.txt', $nb_visites);
echo "Vous êtes le visiteur n° " . $nb_visites;
```
Vérifier que les permissions de chaque répertoire de chaque vhost sont restreintes à l'utilisateur du vhost ! (et les fichiers du répertoire)
Enfin : visiter le fichier `compteur.php` de chaque vhost. Vérifier les utilisateurs propriétaires des fichiers `stats.txt`.
---
## Exercice 4
Installer `php-fpm`.
Activer avec `a2enmod proxy_fcgi setenvif` et `a2enconf php7.0-fpm`.
Créer un fichier `fcgi.php` contenant `<?php echo php_sapi_name();` et vérifier qu'il renvoie bien `fpm-fcgi` quand il est consulté.
---
## Exercice 5 (facultatif)
Mettre en place au moins deux pools FPM avec deux utilisateurs différents pour deux vhosts différents, comme avec ITK, mais avec FPM.