formations/cesi/hebergement_web/04-dynamique.md

6.0 KiB

% 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.