Blog de Norore
Geek en perdition dans un monde qui va trop vite

PluXML, Nginx et PHP 7 sont dans un bateau

30 Dec 2016 - Norore
Un bateau de pêche dans un port.

Et j’ai bien galéré pour tout refaire fonctionner !

Alors oui, c’est amusant d’être son propre administrateur système. C’est également très formateur. Mais quand vous êtes seul et sans formation, ben, vous galérez bien comme il faut pour comprendre ce qui ne va pas :) ! Mais l’essentiel c’est que j’ai réussi à refaire tourner le blog, en l’ayant placé dans un sous-domaine, tout en en profitant pour passer à PHP 7, puisque de toute façon PHP 5 ne sera plus maintenu à partir du 31 Décembre 2016.

Comme je me dis que je ne serai peut-être pas la seule, parmi les francophones, à me casser les dents, je vous propose de trouver ici ma solution.

Installer php7.0-fpm

Dans un premier temps, il a fallu installer PHP 7 avec le gestionnaire de processus pour FastCGI. Pour cela, la manœuvre est très simple à réaliser pour le moment :

sudo apt-get install php7.0-fpm

Pour lancer le serveur PHP 7.0 FPM, vous devez saisir dans le terminal :

sudo service php7.0-fpm start

Pour l’arrêter, remplacez start par stop. Et pour le redémarrer, remplacez start par restart. C’est tout simple !

Cependant, il peut être perturbant de ne pas avoir de message de confirmation comme quoi le service est bien lancé. Pour ma part, je n’ai pas de message, que celui-ci ce soit bien lancé ou qu’il ne soit pas en service. Vous allez donc devoir faire appel à la commande netstat :

sudo netstat -lntp

Vous voyez votre service, noté php-fpm.org) ? Non ? C’est normal :D ! Par défaut celui-ci se lance sur les sockets UNIX. Pour pouvoir voir le service, il faut ajouter l’option -x à la commande netstat :

sudo netstat -lntpx

Vous voulez un aperçu de mon netstat ? Le voici :

Connexions Internet actives (seulement serveurs)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat       PID/Program name
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      21960/php-fpm.conf)
tcp        0      0 127.0.0.1:9001          0.0.0.0:*               LISTEN      21960/php-fpm.conf)
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      19759/nginx -g daem
tcp6       0      0 :::80                   :::*                    LISTEN      19759/nginx -g daem

Comment ? Je vous ai menti et enduit d’erreur ? Absolument pas, j’ai tout simplement configuré php7.0-fpm pour qu’il utilise les adresses IP et les ports que je souhaite plutôt que les sockets.

Configurer PHP 7.0 FPM

Afin de pouvoir utiliser une adresse IP, ici l’adresse locale 127.0.0.1, ainsi qu’un numéro de port, ici le port par défaut est le 9000, vous devez modifier le fichier /etc/php/7.0/fpm/pool.d/www.conf. Pour ma part, j’utilise l’éditeur vim afin de le modifier directement. Notez que vous devez modifier ce fichier en étant root. Soyez donc prudent dans votre manipulation !

La ligne à modifier commence par listen, cherchez-là puis remplacez-là par :

;listen = /run/php/php7.0-fpm.sock
listen = 127.0.0.1:9000

Vous pouvez aussi la remplacer directement mais je préfère garder la ligne d’appel vers le socket par mesure de sécurité. Vous pouvez également décommenter les lignes :

  • listen.owner
  • listen.group
  • listen.allowed_clients

Vous pouvez aussi en profiter pour personnaliser les logs d’accès :

access.log = /var/log/php7/$pool.access.log

C’est toujours utile au cas où votre site ne s’afficherait pas. Vous pourrez ainsi voir si vous avez une erreur d’accès où si quelque chose ne va pas dans votre configuration.

Création du pool blog.conf

Une fois que vous avez configuré le pool principal, vous pouvez créer des pools personnalisés, dans /etc/php/7.0/fpm/pool.d/, qui reprendront en partie celui inclus dans www.conf. Ceci vous permettra de créer et de gérer de façon plus fine les différents sites que vous pourriez mettre en place par la suite. J’ai appelé ce nouveau pool blog.conf mais vous pouvez lui donner le nom de votre choix :

[blog]
listen = 127.0.0.1:9001
listen.allowed_clients = 127.0.0.1
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
chdir = /

Et ça veut dire quoi toutes ces lignes ? Comme je suis encore novice, plutôt que de vous dire des bêtises, je préfère vous orienter vers l’article de Papy Geek sur l’Installation et la Configuration de PHP-FPM.

N’oubliez pas de (re)lancer le service PHP avant de passer à la suite.

Configurer Nginx

Je vais partir du principe que vous avez déjà installé le serveur Nginx (prononcer Engine-X). Si ce n’est pas fait, un bête apt-get install nginx devrait faire l’affaire. Vous êtes des grands maintenant :) !

Création du sous-bloc blog

Pour le moment, je ne me sers de PHP que pour mon blog. Cependant, il se pourrait qu’à l’avenir je souhaite de nouveau utiliser PHP sur un autre projet. Comme il est de manière générale recommandé de créer des sous-bloc (ou virtual-host, mais je trouve sous-bloc plus juste et plus mignon), et que la méthode est plus simple, selon moi, avec Nginx qu’avec Apache, j’ai créé un sous-bloc uniquement pour mon blog :

server {
    listen 80; # en écoute sur le port 80, adresse IP v4
    listen [::]:80; # en écoute sur le port 80, adresse IP v6
    server_name blog.norore.fr; # nom du serveur, ici le sous-domaine
    
    root /site/blog; # racine des fichiers du serveur
    index index.php index.html index.htm; # les fichiers d'index à utiliser, par ordre de priorité

    access_log /var/log/nginx/blog/access.log; # chemin où les logs d'accès seront écrits
    error_log /var/log/nginx/blog/error.log; # chemin où les logs d'erreurs seront écrits

    # Rewrite to index
    location @handler {
        rewrite /(.*)$ /index.php? last;
    }

    location / {
        try_files $uri $uri/ @handler;
    }

    # Directory protection
    # Pour éviter qu'un petit malin aille fouiner partout ;)
    location ~ /(data/configuration|version|update|\.ht) {
        deny all;
    }
    
    # réécriture des flux RSS
    location /feed/ {
        rewrite ^/feed\/.(.*)$ /feed.php? last;
    }

    # c'est ici que toute la magie de PHP va opérer
    location ~ \.php$ {
        fastcgi_split_path_info (.+\.php)(/.+)$; # expression régulière pour savoir comment traiter un chemin vers un fichier PHP un peu tordu
        include fastcgi_params; # on inclut les paramètres de FastCGI
        # si on n'a pas de fichier correspondant, on affiche une erreur 404
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }
        fastcgi_pass 127.0.0.1:9001; # adresse IP locale et numéro de port utilisés par PHP
        fastcgi_index index.php; # fichier index utilisé par FastCGI
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # paramètre pour savoir quels fichiers utiliser
    }

}

Une fois que j’ai terminé, je sauvegarde le fichier, et je n’oublie pas de faire un lien symbolique vers les instructions avant de démarrer Nginx :

cd /etc/nginx/sites-enabled
sudo ln -s /etc/nginx/sites-available/blog blog
sudo service nginx start

Bibliothèques manquantes

Pour ma part, après avoir relancé les services php7.0-fpm et nginx, je me suis retrouvée avec cette magnifique erreur dans les logs :

2016/12/30 14:53:31 [error] 19631#19631: *1 FastCGI sent in stderr: "Unable to open primary script: /site/blog/index.php (No such file or directory)" while reading response header from upstream, client: 2.6.166.152, server: blog.norore.fr, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9001", host: "blog.norore.fr"
2016/12/30 14:56:32 [error] 19760#19760: *1 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Uncaught Error: Call to undefined function xml_parser_create() in /site/blog/core/lib/class.plx.motor.php:338
Stack trace:
#0 /site/blog/core/lib/class.plx.motor.php(69): plxMotor->getConfiguration('./data/configur...')
#1 /site/blog/core/lib/class.plx.motor.php(53): plxMotor->__construct('./data/configur...')
#2 /site/blog/index.php(30): plxMotor::getInstance()
#3 {main}
  thrown in /site/blog/core/lib/class.plx.motor.php on line 338" while reading response header from upstream, client: 2.6.166.152, server: blog.norore.fr, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9001", host: "blog.norore.fr"

Après avoir cherché quelques minutes sur internet, j’ai fini par trouver qu’il me manquait tout simplement la bibliothèque PHP pour pouvoir découper les fichiers XML. Ce qui est dommage lorsque l’on utilise un moteur de blog qui est essentiellement basé sur le XML :) ! J’en ai donc profité pour installer également la bibliothèque GD qui est recommandée pour une utilisation optimale de PluXML :

sudo apt-get install php7.0-xml php7.0-gd

Une fois les bibliothèques manquantes installées, j’ai tout simplement redémarré le service php7.0-fpm, puis j’ai rafraîchit la page de mon blog.


Sources d’inspiration :

Source de l’image d’accroche : un bateau de pêche dans un port. Photographié par 44833, sous licence CC0 sur Pixabay