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/www
est monté en lecture seule pour y stocker le contenu statique du site Web ; - Le répertoire
./docker-web/log
est monté pour y stocker les journaux Nginx ; - Le fichier
./docker-web/nginx.conf
est 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.conf
pour la directivefastcgi_pass
; - Le répertoire
./docker-web/www
est monté en lecture seule pour y stocker les fichiers PHP.
|
|
host:~# docker-compose up -d
Share this post
Twitter
Google+
Facebook
Reddit
LinkedIn
StumbleUpon
Pinterest
Email