Installer PHP 7.0 avec Apache2 sous Debian 8 (Jessie)
Comme je l'ai annoncé sur Twitter il y a quelques jours, j'effectue des opérations de maintenance en ce moment, en ce qui concerne l'hébergement du site. Ces opérations ont été motivées par la panne d'un disque dur du serveur hébergeant le site. Plutôt que d'interrompre le site pendant une heure (le temps de remplacer le disque) puis de resynchroniser le RAID, je me suis dis que j'allais en profiter pour faire quelques modifications sur cet hébergement. Du coup, j'ai temporairement migré le site chez moi, sur un serveur Debian avec le tout récent PHP 7.0 histoire de voir comme cela tourne et de déceler, pourquoi pas, quelques incompatibilités ou problèmes. Et, au passage, j'ai remplacé MySQL par MariaDB. Bon je vous passe tous les détails. Tout ça pour dire que j'ai un peu galéré avec la dernière version de PHP, n'ayant pas trouvé de tutoriel correspondant à ma situation. C'est la raison pour laquelle je vous propose ici un petit tuto.
Disque dur HS sur le RAID de mon serveur hébergeant le site. Perturbations prévues durant le week-end... désolé 🙁
— JusteGeek.fr (@Justegeek_fr) 8 avril 2016
PHP 7.0 : un peu d'histoire...
Quelques explications avant de passer au tutoriel. La version 7.0 de PHP est sortie en 2015. Elle succède à la version 5. La version 6 de PHP a, en effet, été abandonnée après de nombreux reports récurrents. Finalement, les développeurs ont décidé de repartir sur de bonnes bases et ont donc abandonné cette version PHP 6. PHP 7.0 apporte donc de nombreuses optimisations du langage PHP, permettant d'améliorer considérablement les performances de celui-ci. Ainsi, la version 7 de PHP permet de rivaliser avec les produits concurrents et notamment avec HHVM (qui reste légèrement meilleur en terme de performances dans de nombreux benchmarks).
J'avoue que je me suis posé la question pendant un temps : PHP 7 ou HHVM. J'ai finalement retenu PHP car HHVM ne supporte pas toutes les fonctions PHP (même s'il supporte la quasi totalité de celles-ci). Et puis PHP ne m'est pas inconnu contrairement à HHVM. Enfin, étant donné les réelles différences de performances avec la version 5, j'avais vraiment envie de tester cela.
L'environnement de ce tutoriel
Avant de vous lancer, lisez bien ce tutoriel jusqu'au bout afin de ne pas avoir de mauvaises surprises. Pour réaliser ce tutoriel, je me suis appuyé sur un serveur Debian 8.4 "Jessie". Malheureusement, les choses ne sont pas simples car PHP 7.0 est encore très jeune et il n'est donc pas intégré dans les dépôts officiels de Debian. Deux solutions sont alors envisageables : utiliser un dépôt alternatif, ou bien récupérer les sources de PHP 7.0 et les compiler avec les options nécessaires.
Je tiens à attirer votre attention sur l'utilisation de PHP 7.0. Le langage reprend beaucoup de fonctions de PHP 5, mais la compatibilité n'est pas de 100%. Il se peut donc que vous rencontriez des soucis. J'ai, par exemple, lu sur le net que Owncloud ne fonctionnait pas (ou mal) avec cette version de PHP. Il faut également ajouter que si vous utiliser PHPMyAdmin depuis les dépôts officiels, cela ne sera plus possible. PHPMyAdmin est lié à PHP 5 au niveau des paquets. Si vous voulez continuer à utiliser PHPMyAdmin, il vous faudra télécharger les sources et les compiler... Soyez prudent, donc, et testez au préalable PHP 7.0 dans un environnement de recette. Cela vous évitera des surprises !!!
Pour la partie serveur web, je suis resté fidèle à Apache2 (version 2.4.10). Sur le net, on trouve beaucoup de tutoriels concernant Nginx mais peu concernant Apache2. Je me suis dis donc que c'était l'occasion de proposer mon tuto sur le sujet. Certains seraient peut être tentés de me demander pourquoi Apache et pas Nginx ? Et bien tout simplement car la robustesse d'Apache2 n'est plus à démontrer. Ses performances sont largement à la hauteur de mes attentes et les modules sont très nombreux. De plus, on peut recenser quelques avantages d'Apache, comme par exemple l'utilisation des fichiers htaccess, chose que Nginx ne supporte pas. Nginx apporte un plus incontestable pour servir du contenu statique en cas de nombreuses requêtes simultanées (plusieurs milliers par secondes). Le jour où j'arriverai à un tel niveau d'audience sur JusteGeek.fr, je pourrai légitimement me reposer la question...
Enfin, pour ce qui est des bases de données, j'ai tenté l'expérience MariaDB en remplacement de MySQL. Ok, le changement n'est pas significatif, je vous le concède.
Installer PHP 7.0 avec Apache2
Pour mon test de PHP 7.0, j'ai décidé d'utiliser le dépôt Dotdeb, maintenu par Guillaume Plessis par "simplicité".
En premier lieu, et pour être tranquille, vérifiez que tous vos paquets sont à jour :
apt-get update && apt-get upgrade && apt-get dist-upgrade -y
Ensuite, puisque PHP 7.0 n'est pas dans les dépôts Debian (et ne le sera sans doute pas avant la version 9 de Debian), il va falloir commencer par ajouter ce dépôt Dotdeb aux sources logicielles.
echo "deb jessie all" > /etc/apt/sources.list.d/dotdeb.list
Attention, pensez à remplacer "jessie" par le nom de votre distribution si vous utilisez une autre version de Debian.
wget https://www.dotdeb.org/dotdeb.gpg && apt-key add dotdeb.gpg
On va maintenant mettre à jour les sources logicielles :
apt-get update
Je pars ici d'un serveur fraîchement installé. Si vous utilisez ce tutoriel sur un serveur possédant une autre version de PHP, il est préférable de désinstaller cette ancienne version :
apt-get --purge remove php5*
Nous sommes maintenant prêts pour installer PHP 7.0 :
apt-get install php7.0 php7.0-fpm
Si vous vous contentez de ces paquets, PHP 7.0 sera effectivement installé, mais il ne fonctionnera pas avec Apache2. Il vous faudra installer en plus le module adéquate :
apt-get install libapache2-mod-php7.0
Installer également tous les modules dont vous aurez besoin. Pour voir les modules disponibles, saisissez la commande suivante dans votre terminal :
apt-cache search PHP7.0*
Pour ma part, j'ai installé les modules suivants :
apt-get install php7.0-gd php7.0-mysql php7.0-bz2 php7.0-json php7.0-curl
Vous pouvez maintenant vérifier que PHP7.0 est bien installé avec la commande :
php -v
Une fois que c'est fait, on va passer à un peu de configuration, car oui, désolé mais il en faut un peu pour que ça marche.
Configurer PHP 7.0
À ce stade, PHP 7.0 est installé mais n'est pas encore fonctionnel. On va donc modifier un peu sa config. Ouvrez le fichier php.ini de php7.0-fpm avec votre éditeur de texte préféré (nano, vi...)
nano /etc/php/7.0/fpm/php.ini
Localisez la ligne
cgi.fix_pathinfo=1
Et modifiez-la pour obtenir :
cgi.fix_pathinfo=0
On va ensuite modifier le socket d'écoute de php7.0-fpm. Pour cela, utilisez une fois encore votre éditeur de texte préféré :
nano /etc/php/7.0/fpm/pool.d/www.conf
Localisez la ligne :
listen = /run/php/php7.0-fpm.sock
Et remplacez-la par :
listen = 127.0.0.1:9000
Voilà. Maintenant PHP 7.0 devrait être opérationnel. On va donc redémarrer les différents services et tester :
service php7.0-fpm restart
service apache2 restart
Pour vérifier que PHP est bien fonctionnel, créez simplement un fichier info.php à la racine de votre site, et collez le code suivant dedans :
<?php
phpinfo();
?>
Rendez-vous ensuite sur votre site : http://votresite/info.php et si vous voyez votre page de configuration PHP, c'est que c'est tout bon 🙂
Partager la publication "Installer PHP 7.0 avec Apache2 sous Debian 8 (Jessie)"
Salut, j'ai relevé deux erreurs
Il n'y a pas de majuscules à service: http://prntscr.com/bmk05u
Et, il vaut mieux utiliser les tags php complets, car en configuration fresh (Debian fresh + Apache Fresh + PHP Fresh), PHP ne reconnait pas les shorts opening tags http://prntscr.com/bmk0lh
Merci du tuto
Merci pour ton commentaire.
Les majuscules ont dû se glisser ici par erreur...
J'édite le tuto 😉
Salut,
Il est dommage d'utiliser PHP-FPM sur TCP plutôt que sur le socket unix qui est plus performant.
Perso, je conseille de conserver dans "/etc/php/7.0/fpm/pool.d/www.conf"
[code]listen = /run/php/php7.0-fpm.sock[/code]
Je vire le module PHP d'apache pour ajouter PHP-FPM (à travers un proxy)
[code]
a2dismod php7.0
a2enmod proxy_fcgi
a2enconf php7.0-fpm
[/code]
Le vhost apache ressemble ensuite à quelque chose comme :
[code]
ServerAdmin webmaster@localhost
ServerName example.tld
ServerAlias http://www.example.tld
SetHandler proxy:unix:/run/php/php7.0-fpm.sock|fcgi://127.0.0.1:9001
DocumentRoot /var/www/html/
...
[/code]
Bien que beaucoup continue à utiliser le module PHP d'apache (plus -simple- rapide à installer et configurer peut-être...), l'utilisation de PHP-FPM offre de nombreux atouts non négligeables (performance, possibilités d'avoir un utilisateur distinct par vhost à la manière de suexec par exemple, ...).
Ahh, au temps pour moi, me suis foiré :/
Vhost apache :
ServerAdmin webmaster@localhost
ServerName example.tld
ServerAlias www.example.tld
SetHandler proxy:unix:/run/php/php7.0-fpm.sock|fcgi://127.0.0.1:9001
DocumentRoot /var/www/html/
...
Non, ça veut pas...
Tant pis : https://gist.github.com/lucalbert/6a74807a4c8fff00fbdb7ba6825074ee
Bonjour, j'ai essayé plusieurs fois avec un vps sur OVH ( installation wordpress sur deb 8 ) , ça ne marche pas ...
Bonjour Paul,
Je peux essayer de t'aider, mais il va me falloir un peu plus d'infos. Qu'est ce qui ne fonctionne pas ? As-tu un message d'erreur ?
Job for apache2.service failed. See "systemctl status apache2.service" and "journalctl -xe" for details.
j'ai préféré migrer sur serverpilot finalement.
Bonjour,
Pour ma part il m'est désormais impossible d'accéder à PHPMyAdmin.
Cdt.
Bonjour.
J'ai suivi votre tuto, mais il semble qu'après le passage à PHP7, mysql ne réponde plus (erreur 503). :/ Auriez-vous une idée d'où peut venir le problème, s'il vous plaît ?
Par contre j'ai bien accès à phpmyadmn, aucun problème à signaler de ce côté là (désolé pour le double post).
Yop, pour ceux qui cherchent, j'ai finalement réussi à faire fonctionner MySQL ET PHPmyadmin, en m'inspirant de la solution décrite ici : https://ckon.wordpress.com/2015/08/06/put-mysql-functions-back-into-php-7/
Et là pour PHPmyadmin : http://www.dynamic-mess.com/php/installer-php7-debian/
Bonjour
Moi j'ai un serveur sous debian 8 avec webmin/virtualmin et avec mariadb10 et php5.6 et tout fonctionne, par contre quand je remplace php 5.6 par php 7, la j'ai acces aux pages html mais pour les pages php je me retrouve avec Internal Server Error.
J'ai essayé ca : https://www.developpez.net/forums/blogs/92421-poulain/b1257/virtualmin-php7-erreur-500/
Mais rien y fait
Cela fait 2 jours que j'essaye de trouver la solution mais sans succés
Merci par avance de votre aide
J'ai eu le même problème, mais j'ai pu le régler. Regarde si le premier lien donné dans mon commentaire précédent peut t'aider... Sinon, je ne sais pas. :/
Bonjour emz0
Merci pour ton aide, cependant les liens gitub présent sur le site sur lequeltu me renvoi ne fontionne pas : 404.
Peut tu me décrire en détail ce que tu a fait pour résoudre cette erreur 500 ?
Aïe, je voudrais bien mais ce n'est plus très frais dans ma tête - j'ai essayé pas mal de choses.
J'ai installé les paquets suivants :
php7.0 libapache2-mod-php7.0 php7.0-mysql php7.0-curl php7.0-json php7.0-gd php7.0-mcrypt php7.0-msgpack php7.0-memcached php7.0-intl php7.0-sqlite3 php7.0-gmp php7.0-geoip php7.0-mbstring php7.0-xml php7.0-zip
... Trouvé l'extension manquante ici, si je me souviens bien : https://github.com/php/pecl-database-mysql
J'ai du la compiler, puis ajouter la ligne suivante à mon php.ini pour l'activer :
extension = /usr/local/lib/php/extensions/no-debug-non-zts-20151012/mysql.so
Mais à vrai dire je ne suis pas bien sûr : j'ai du faire d'autres choses, et je bricole, étant loin d'être un pro.
j'ai suivi un autre tuto et tout fonctionne : https://angristan.fr/installer-php-7-debian-8-jessie-depot-dotdeb/
merci pour votre aide
Chouette, je suis content pour toi ! 🙂
De rien, je ne crois pas avoir été très utile, mais j'ai essayé. 😉
En plus, ce tuto m'a permis d'optimiser mon installation : merci à toi !
Je crois bien avoir suivi ce tuto. Mais apache2 ne veut pas demarer.
php7 s'est bien installé mais dans /etc/php c'est a dire au même niveau que apache2
Je vais essayer de corriger
je vous remercier infiniment je me suis débloque grâce a vous je me suis tombe sur une installation de pond a PHP et maintenant j'ai résoudre le problème