Upgrade en PHP 7 FastCGI

Suite à mes découvertes de la veille j’ai déployé hier une machine virtuelle avec une distribution Debian 8.3 (mise à jour ensuite en 8.4), Apache 2.4, MySQL 5.5 et PHP 5.6 en mode FastCGI.

Rien de bien sorcier, ce n’est que de l’installation standard d’un LAMP, hormis peut-être pour l’aspect FastCGI, et encore. Si besoin, voilà le fichier /etc/apache2/mods-available/fastcgi.conf correspondant (car c’est en général là qu’il y a des soucis) :

<IfModule mod_fastcgi.c>
	AddType application/x-httpd-fastphp5 .php
	Action application/x-httpd-fastphp5 /php5-fcgi
	Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
	FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization

	<Directory /usr/lib/cgi-bin>
		Require all granted
	</Directory>
</IfModule>

Et pour vérifier que le socket est au bon endroit :

grep -E '^\s*listen\s*=\s*[a-zA-Z/]+' /etc/php5/fpm/pool.d/www.conf

Qui doit retourner quelque chose comme :

listen = /var/run/php5-fpm.sock

Qu’on retrouve dans le fichier de config fastcgi.conf.

J’ai ensuite mappé le port 8080 vers le port 80 de la VM histoire de pouvoir accéder au serveur Apache. Dans le fichier de configuration Vagrantfile :

# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure(2) do |config|
  # The most common configuration options are documented and commented below.
  # For a complete reference, please see the online documentation at
  # https://docs.vagrantup.com.

  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://atlas.hashicorp.com/search.
  config.vm.box = "debian8-php5"

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  config.vm.network "forwarded_port", guest: 80, host: 8080

  # …
end

Puis, j’ai créé une connection avec Sequel Pro pour accéder au serveur MySQL, via une connection SSH, avec les paramètres suivants :

  • Hôte : 127.0.0.1
  • User : <mysql admin login>
  • Password : <mysql admin password>
  • Port : défaut (3306)
  • Hôte SSH : 127.0.0.1
  • User SSH : vagrant
  • Clé SSH : récupérer la clé dans le dossier caché .vagrant/machines/default/virtualbox/private_key
  • Port SSH : 2222

Me voilà paré avec une config LAMP qui tourne et sur laquelle j’ai installé un Dotclear tout neuf après avoir créé une base de données avec Sequel Pro.

Clonage de la VM

J’ai ensuite pris soin de cloner cette VM fonctionnelle pour pouvoir y revenir en cas de souci avec mes tests ultérieurs.

On commence par arrêter la VM :

vagrant halt

Suivi d’un :

vagrant package --output debian8-php5.box

Pour créer une copie compressée de la VM que j’ai ensuite déplacé dans un nouveau répertoire. J’ai ajouté la copie à la liste des VM connues par vagrant :

vagrant box add debian8-php5 debian8-php5.box

Une vérification suivie d’une initialisation :

vagrant box list
vagrant init

Puis modifier le nouveau fichier Vagrantfile en modifiant la ligne :

config.vm.box = "debian8-php5"

Et voilà, vous avez maintenant deux VM identiques, chacune dans son répertoire. Je vais donc conserver cette copie soigneusement et revenir à l’originale pour la suite…

Upgrade PHP 7

Je relance la première VM avec un vagrant up, suivi d’un vagrant ssh pour m’y connecter.

Cette récente version de PHP 7 n’étant pas encore dans les dépôts stable de Jessie (petit nom de la Debian 8), du coup il faut compléter les sources de dépôts (fichier /etc/apt/sources.list :

# Dotdeb stable
deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all

Puis récupérer et installer la clé GPG de Dotdeb :

wget https://www.dotdeb.org/dotdeb.gpg
apt-get add dotdeb.gpg

Puis un :

apt-get update && apt-get upgrade

Suppression de PHP 5

On commence par virer PHP 5 de la machine, puisque cette version ne servira plus :

apt-get purge php5-*

Pour info voilà les paquets qui ont été supprimés (ça peut servir s’il faut revenir en arrière) :

dh-php5* libapache2-mod-php5* php-pear* php5-cli* php5-common* php5-curl* php5-dev* php5-fpm* php5-gd* php5-imagick* php5-json* php5-mcrypt* php5-memcache* php5-mysql* php5-readline* php5-tidy* php5-xmlrpc* php5-xsl* pkg-php-tools*

Installation de PHP 7

On poursuit en installant PHP 7 (la liste des modules est à ajuster en fonction de vos besoins) :

apt-get install php7.0 php7.0-fpm php7.0-gd php7.0-cli php7.0-common php7.0-curl php7.0-opcache php7.0-json php7.0-mysql php7.0-mcrypt php7.0-xsl php7.0-imagick php7.0-tidy php7.0-xmlrpc

Puis on modifie le fichier de configuration de FastCGI, /etc/apache2/mods-available/fastcgi.conf :

<IfModule mod_fastcgi.c>
        AddType application/x-httpd-fastphp .php
        Action application/x-httpd-fastphp /php-fcgi
        Alias /php-fcgi /usr/lib/cgi-bin/php
        FastCgiExternalServer /usr/lib/cgi-bin/php -socket /run/php/php7.0-fpm.sock -pass-header Authorization

        <Directory /usr/lib/cgi-bin>
                Require all granted
        </Directory>
</IfModule>

Et on vérifie que le socket correspond :

grep -E '^\s*listen\s*=\s*[a-zA-Z/]+' /etc/php/7.0/fpm/pool.d/www.conf

Qui doit normalement retourner :

listen = /run/php/php7.0-fpm.sock

Qu’on retrouve dans le fichier de configuration de FastCGI.

Un petit redémarrage des services :

service apache2 restart
service php7.0-fpm restart

Et voilà ce que donne la vérif en ligne de la version de php

php --version

Qui retourne :

PHP 7.0.5-1~dotdeb+8.1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

Au passage le fichier de configuration de PHP a changé de place, il se trouve maintenant dans /etc/php/7.0/fpm/php.ini, donc pensez à y reporter les réglages faits pour la version précédente.

Et ça roule \o/

Haut de page