PHP FPM est une implémentation alternative à PHP FastCGI que l'on va pouvoir faire communiquer avec Nginx. Lorsque l'on rencontre des fichiers PHP on va indiquer à nginx de passer par PHP FPM pour les interpréter.
Installation
Vous l'aurez compris, pour installer PHP FPM il faut passer par le gestionnaire de paquet
sudo apt-get install php5-fpm
Et c'est tout...
Configuration
La configuration de PHP se trouve dans le dossier /etc/php5
, à l'intérieur de ce dossier vous aurez plusieurs sous-dossiers correspondant aux multiples versions de PHP que vous aurez installé sur votre système.
- cli, configuration utilisée lorsque l'on appelle PHP en ligne de commande
- fpm, configuration utilisée pour PHP FPM
Dans notre cas il faudra donc modifier le fichier /etc/php5/fpm/php.ini
. La configuration proposée par défaut est relativement correcte et vous ne devriez pas avoir grand-chose à changer. On remarquera que la propriété display_errors
est à off par défaut, ce qui veut dire qu'en cas d'erreur rien ne sera affiché à l'utilisateur. Il faudra alors regarder les fichiers de logs pour comprendre les problèmes.
Comme d'habitude la configuration est morcelée en plusieurs fichier et on retrouve dans le dossier conf.d
les fichiers permettant de configurer les modules PHP. Par défaut, vous ne devriez avoir qu'un fichier correspondant à la configuration d'opcache. Si vous installez de nouveaux modules, il faudra passer par ce dossier pour les configurer.
Enfin, nous avons la possibilité de gérer le nombre de processus PHP qui seront lancés en ajoutant ou modifiant les configurations situées dans le dossier /etc/php5/fpm/pool.d/
. Si vous comptez héberger plusieurs applications différentes il peut être intéréssant de créer plusieurs ressources fonctionnant avec des utilisateurs différents.
- listen, permet d'indiquer le fichier de socket qui sera utilisé pour communiquer avec le processus
- user et group, permet d'indiquer l'utilisateur qui sera le propriétaire de votre processus. Il faudra bien vérifier que l'utilisateur (ou le groupe) en question ait les bons droits.
Si vous modifiez la configuration il faudra redémarrer PHP5 FPM pour qu'elle soit prise en compte.
sudo service php5-fpm restart
Configuration de Nginx
Maintenant que notre PHP FPM est lancé il faut dire à Nginx comment traiter les fichiers PHP. Pour cela on va modifier la configuration de notre serveur virtuelle et rajouter un filtre pour les fichier finissant par l'extension php.
server {
...
index index.php index.html index.htm;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Avant de redémarrer nginx, faites bien attention à ce que vous ayez les droits de lecture sur le fichier sock. Si vous avez installez nginx en passant par le dépôt nginx.org, il y a de forte chance que nginx utilise l'utilisateur nginx
alors que FPM crée le socket avec l'utilisateur www-data
. Pour solutionner ce problème vous pouvez changer la configuration d'nginx pour utiliser le même utilisateur www-data
.
Maintenant votre nginx utilisera votre ressource PHP FPM lorsqu'il rencontrera des fichiers PHP.
Installation de modules PHP
Certaines fonctionnalités de PHP ne sont pas incluses dans le core et il faudra installer des modules pour les faire fonctionner. À vous d'installer les modules dont vous avez besoin.
Voici quelques exemples :
php -m # affiche la liste des modules disponibles (compilés avec php)
sudo apt-get install php5-mcrypt # pour CakePHP
sudo apt-get install php5-curl # on a tjrs besoin de curl ^^
sudo apt-get install php5-gd # Librairie pour le traitement d'image
Les modules sont automatiquement activés, et les fichiers de configurations sont placés dans le dossier conf.d
. N'oubliez pas de redémarrer Nginx pour que vos modifications soient prises en compte.
Framework PHP
Dans le cadre de l'utilisation d'un framework PHP on va souvent vouloir rediriger toutes les requêtes vers un fichier index.php
qui se chargera de gérer le routing. Dans ce cas là il faudra adapter le try_files de votre serveur virtuel.
server {
....
location / {
try_files $uri $uri/ /index.php?$query_string;
# Il faudra utiliser app.php si vous utilisez symfony
}
}