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.