Installer Nginx avec php-fpm
Vous qui avez l’habitude de fonctionner avec Apache, vous allez voir une alternative intéressante avec Nginx, qui peut à la différence de Apache jouer plusieurs rôles, reverse proxy, load balancer, mise en cache.
Nous allons partir d’une image docker debian de base officielle
docker pull debian docker run -it debian
Nous aurions pu faire un dockerfile pour installer les packages nécessaire mais nous allons essayer de faire une configuration minimaliste, sans systemd ni supervisor.
Installation des packages
nous aurons besoin de curl nginx vim php-fpm etc (on découvrira au fur et à mesure)
apt update apt install nginx php-fpm curl vim
configuration du fichier vhost de phpsite
Ce fichier est à placer dans le répertoire /etc/nginx/sites-available/
server {
listen 80;
server_name phpsite;
root /var/www/phpsite;
index index.php index.html;
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
la ligne include fastcgi_params est important, car permet à Nginx d’exécuter le PHP, sinon un curl vous renvoit le texte du code.
La ligne fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
Vous testez ce script avec la commande nginx -t qui vérifiera s’il n’y a pas d’erreur.
Pour rendre ce site actif il faut créer un lien symbolic dans le répertoire /etc/nginx/sites-enabled/ qui pointe vers ce fichiers de configuration de vhsot qu’on appelera phpsite.conf
sudo ln -s /etc/nginx/sites-available/phpsite.conf /etc/nginx/sites-enabled/phpsite.conf
Le fichier php info.php
cd /var/www/phpsite touch info.php nano info.php <?php echo "Hello"; ?>
Vous devez démarrer php-fpm pour prendre en charge l’exécution du php et démarrer nginx aussi
Démarrage des services pour accéder à un site en php
Démarrage de php-fpm
le fait qu’on n’utilise pas systemd ni supervisor nécessite qu’on démarre à la main php-fpm et utiliser le socket TCP et non le socket Unix
/usr/sbin/php-fpm8.2 -F
le -F fait démarrer php-fpm en foreground.
Démarrage de Nginx
nginx -g "daemon off;"
Cette commande évite de démarrer nginx en tâche de fond, comme ça on a les logs si jamais il y a une erreur.
Erreurs et problèmes possibles
Si vous essayez d’atteindre une page php avec curl
curl http://phpsite/info.php // n'oubliez pas d'ajouter dans le fichier /etc/hosts/ le vhost phpsite vim /etc/hosts // contenu du fichier
et que vous avez un erreur 502 Bad Gateway, c’est que php-fpm écoute sur un socket Unix et que Nginx est paramétré sur un socket TCP. Pour savoir quel type de configuration a php-fpm:
// commande pour savoir quel type de socket php-fpm utilise grep -E "^listen" /etc/php/8.2/fpm/pool.d/www.conf //Dans le fichier /etc/php/8.2/fpm/pool.d/www.conf, remplacez le socket Unix par le socket TCP. listen = /run/php/php8.2-fpm.sock # socket Unix listen = 127.0.0.1:9000 # socket TCP
Dans notre cas (fonctionnement sans systemd et supervisor, on va choisir les socket TCP.)
On va donc changer la configuration de php-fpm
vim /etc/php/8.2/fpm/pool.d/www.conf on cherche la ligne où on a listen = /run/php/php8.2-fpm.sock pour remplacer par listen = 127.0.0.1:9000 et on redémarre php-fpm et nginx
PHP ne s’exécute pas mais affiche le code à la place, Nginx n’arrive pas à communiquer avec php-fpm. Vérifiez que ce dernier soit bien démarré.
cela veut dire que le fichier est traité comme un fichier texte, vérifiez que vous avez inclus
Note : Créer une nouvelle image avec ces modifications
Créer une image avec toutes ces modifications, afin de ne pas avoir à refaire les manipulations, en somme préparer une image pour un usage.
Quittez tous les process à l’intérieur du docker, quittez le docker et vérifiez que le process docker en question est stoppé avec docker ps. Ensuite on va commiter le docker avec son id selon la syntaxe suivante:
docker ps -a // pour voir l'id du container docker commit <nom_ou_id_du_conteneur> monimage:1.0 docker commit b425 monimage:1.0
Sauver l’image docker dans le repository distant (hub de docker)
Ensuite vous devez sauver cete image dans un repository, le plus commun est le hub de docker.com
// connexion avec le hub docker login // tagging de l'image avant de pouvoir l'envoyer dans le repository docker tag debian-nginx refschool/debian-nginx:1.0 ^ debian-nginx est l'image qu'on vient de créer // push de l'image docker docker push refschool/debian-nginx:1.0
Rappel de commandes Nginx sans Systemd et sans supervisor
- démarrer en avant plan : nginx -g « daemon off »; »
- test du fichier de configuration : nginx -t
- arrêt : nginx -s stop
- arrêt graceful : nginx -s quit (nginx arrête les connexions avant de s’arrêter
- redémarrer : nginx -s reload
- savoir si nginx tourne : ps aux | grep nginx


