272 lines
6.0 KiB
Markdown
272 lines
6.0 KiB
Markdown
|
% 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.
|