Un simple site en PHP avec Docker et Nginx
Utiliser Docker pour faire tourner simplement un serveur Nginx et servir du contenu dynamique en PHP.
J’ai récemment revu l’organisation des containers Docker présents sur mon serveur et j’ai essayé d’utiliser le plus possible les images “officielles” des technos dont j’avais besoin. Ici, nous allons mettre en place un Nginx pour servir des pages statique (HTML et autres ressources) mais également en mesure de gérer du contenu PHP.
Objectif de l’infra
Le but est d’avoir un container avec Nginx pour servir du contenu statique et dynamique (PHP). Il faudra configurer Nginx pour rediriger les requêtes de ressources PHP vers un second container qui embarquera PHP-FPM (FastCGI Process Manager).
Nous aurons donc besoin de deux images Docker :
- Nginx, j’ai choisi de prendre la version Alpine stable (1.14.2 à la date de cet article) ;
- PHP-FPM, là encore avec Alpine et avec la dernière version disponible (7.3.2 à la date de cet article).
Par préférence personnelle, nous allons utiliser docker-compose pour configurer les containers (Installer Docker Compose).
Le container Nginx
Tout d’abord, il nous faut créer l’arborescence de répertoire dont nous allons avoir besoin, ainsi que les fichiers de journalisation avec les privilèges adéquats :
host:~# mkdir -p docker-web/www # Webroot dans lequel sera stocké le contenu statique du site
host:~# mkdir -p docker-web/log # Pour enregistrer les journaux de Nginx
host:~# touch docker-web/log/{error,access}.log # Journaux pour Nginx
host:~# chmod a+rw docker-web/log/* # Accessible en lecture/écriture pour tous (ce n'est pas l'idéal, si quelqu'un a une autre idée je suis preneur)
Nous aurons également besoin du fichier de configuration de Nginx. Il remplacera celui par défaut présent dans le container Nginx et permettra de facilement modifier la configuration du serveur sans avoir en entrer dans le container.
|
|
Pour gérer nos containers, nous allons utiliser docker-compose plutôt que de multiples docker run .... Docker Compose utilise un fichier de configuration YAML docker-compose.yml dans lequel sont définis nos containers et leurs options de démarrage.
docker-compose.yml et le répertoire docker-web doivent être placés dans le même répertoire parent. Vous pouvez aussi le placer dans un répertoire quelconque et remplacer les chemins relatifs des volumes partagés par des chemins absolus.
On peut à présent configurer et démarrer le container Nginx :
- Le port TCP/80 (HTTP) est mappé sur l’hôte (pour les tests, le port est mappé en local uniquement, veillez si possible à mettre en place du TLS sur le port TCP/443 si vous exposez le serveur sur Internet) ;
- Le container est nommé
web-nginx; - Le répertoire
./docker-web/wwwest monté en lecture seule pour y stocker le contenu statique du site Web ; - Le répertoire
./docker-web/logest monté pour y stocker les journaux Nginx ; - Le fichier
./docker-web/nginx.confest mappé en lecture seule sur le fichier de configuration Nginx du container.
|
|
host:~# docker-compose up -d
Le site est maintenant accessible sur le port TCP/80 de l’hôte, en local. Cependant, si vous vous rendez à l’adresse http://localhost/, vous obtiendrez une erreur 403 Forbidden car notre répertoire www est vide. Pour simplement vérifier que tout fonctionne, il suffit de créer un fichier index.html :
host:~# echo 'hello world!' > docker-web/www/index.html
Le container PHP
Ne perdons pas de vu l’objectif : disposer d’un environnement Web capable d’interpréter PHP pour servir du contenu dynamique. Pour cela, nous allons mettre en place un second container qui embarquera PHP.
Tout d’abord, il faut modifier le fichier de configuration de Nginx pour lui préciser de rediriger les requêtes de ressources PHP vers le container que nous venons de mettre en place. Nous ajoutons index.php dans la directive index du serveur, et les instructions fastcgi pour les fichiers PHP (i.e. les fichiers dont l’extension est .php : location ~ \.php$).
|
|
Nous aurons besoin également d’un fichier index.php afin de pouvoir tester que tout fonctionne une fois que le container sera en place.
host:~# echo '<?php phpinfo();' > docker-web/www/index.php
On peut à présent configurer et démarrer le container PHP :
- Le container est nommé
web-php, ce nom doit être le même que celui utilisé dans le fichiernginx.confpour la directivefastcgi_pass; - Le répertoire
./docker-web/wwwest monté en lecture seule pour y stocker les fichiers PHP.
|
|
host:~# docker-compose up -d
Références
Cet article est mis à disposition selon les termes de la Licence Creative Commons Attribution-ShareAlike 4.0 International.
Cet article a été publié il y a 438 jours, son contenu peut être inexact, voire erroné, et l'application des conseils ou consignes présents dans cet article doit être fait à votre propre appréciation. L'auteur de l'article ne pourra être tenu responsable des inconvénients pouvant résulter de l'application des conseils et consignes énoncés dans cet article.





Share this post
Twitter
Google+
Facebook
Reddit
LinkedIn
StumbleUpon
Pinterest
Email