Ca y est , voici la deuxième partie certainement attendu .. non !! ha .. bon .. spa grave ..
Je disais donc , nginx est maintenant en place , mais il faudrait peut être penser à le rendre compatible avec les 90% des sites sur le net aujourd'hui , c'est à dire php .. et pourquoi pas python tant que l'on y est .
Pour mettre en place cette liaison , nous allons utiliser php en fast-cgi .
Nginx ne possédant pas de mod_php comme apache , les requêtes php seronts donc transmises aux process php que nous aurons lancés en tâche de fond .
Je ne vais pas débattre des avantages et des inconvénients d'utiliser php en fastcgi , ce n'est pas le but de ce topic , mais sachez juste qu'aujourd'hui php en fastcgi est très apprécié , pour sa stabilité et sa sécurité , c'est pourquoi l'on retrouve souvent ce mode de fonctionnement chez les hébergeurs aujourd'hui ...
Vous n'étiez pas au courant ? ..
Note du 24/08/10 : Depuis php 5.3.3 il est bien plus simple et performant d'utiliser php-fpm , voir le tuto à ce sujet
PHP compilation
Et oui encore , il nous faut compiler php spécialement pour le mod fast-cgi ( ne vous inquiétez pas , il est maintenant impossible de repasser en mode cgi simple , vous aurez forcement du Fastcgi ).
Comme d'hab voici les étapes ,
- Récupération des source
- décompactage
- création du fichier de config à la compilation
- trio : ./configure make / make / install
Récupération de php
Voilà les lignes de commande correspondantes ( PHP 5.3.2 )
wget http://fr2.php.net/get/php-5.3.2.tar.gz/from/this/mirror
tar xzf php-5.3.2.tar.gz
cd /usr/local/src/php-5.3.2/
vim my_configure
Config de compilation
Voici un exemple , de config de php ( celui de ma machine de dev ) je vous laisse ajuster selon vos besoins ..
#!/bin/sh
export OPTIM=-02
./configure --prefix=/usr/local \
--with-xsl \
--enable-soap \
--with-gettext \
--enable-mbstring --with-mbstring=all \
--disable-debug \
--enable-memory-limit \
--enable-ftp \
--with-mcrypt \
--enable-zip \
--enable-calendar \
--enable-exif \
--enable-pdo \
--with-pdo-mysql \
--with-mysql \
--with-pdo-sqlite \
--with-sqlite \
--with-zlib \
--with-jpeg-dir \
--with-gd \
--enable-bcmath \
--with-curl \
Compilation , go go go
make
make install
Vérification
Nous voilà avec normalement un exécutable nommé php-cgi dans /usr/local/bin_
Process FastCgi
Nous allons donc maintenant créer un script qui sera chargé de lancer X process , qui ont pour mission de répondre aux requêtes php envoyées par nginx.
Création
cd /etc/init.d/
vim php-fastcgi
Le script peut exister sous des formes plus ou moins différentes , voici celui que j'utilise :
php-fastcgiwrapper php-fastcgi
Là encore les script est adapté , si vous avez suivi à la lettre mon tutoriel , si vous avez effectué des modification vérifiez les paramètres , notamment:
Ajout au RC
Il faut lui aussi le rendre exécutable , et le mettre dans le RC , afin que les process soient lancés au démarrage de la machine .
chmod 777 php-fastcgi
update-rc.d php-fastcgi defaults
Concernant le nombre de process fils lancés , il faudra adapter selon la charge de votre site ... en production , la commande
netstat -atup
Vous donnera des indications sur l'état de vos process , n'en ajoutez pas trop ! travaillez de façon logique .
Vous pouvez démarrer les process :
/etc/init.d/php-fastcgi start
Liaison avec Nginx
Et bien voilà , il ne nous reste plus qu'à lui indiquer de transmettre les requêtes php aux process que nous avons lancés .
fastcgi_params
Dans un premier temps il faudra éditer le fichier de configuration fastcgi_params de nginx .
cd /etc/nginx/
vim fastcgi_params
A la fin de ce fichier , ajouter les lignes suivantes :
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
Ces lignes permettent entre autre d'indiquer aux process quel script executer , ainsi que son chemin .
Vhost ou Nginx.conf
Selon l'utilisation ou non de vhost , il vous faut ajouter ( en fait elles y sont déjà dans le conf principale si vous avez utilisé mon fichier de config nginx.conf ) les lignes suivantes dans les accolades de server .
location ~ \.php$ {
include /etc/nginx/fastcgi_params; #or whatever you named it
fastcgi_pass 127.0.0.1:9000;
index index.php;
}
Exemple d'un vhost:
server{
listen 8282;
server_name lindev.fr;
root /home/apache2/lindev.fr;
location / {
index index.php;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params; #or whatever you named it
fastcgi_pass 127.0.0.1:9000;
index index.php;
}
}
Et voilà votre serveur peut maintenant gérer les fichiers .php
Restart Nginx
Pour que les modifications prennent effet, il vous faut demander à Nginx de relire sont/ses fichiers de conf .
/usr/local/nginx/sbin -s reload
Et bien voilà pour php .. On fait la même chose avec perl ? aller .. go !
Perl CPAN
Certains sites demandent la gestion de perl , principalement pour des site de graph , tel qu'eluna , je vais donc faire en sorte que notre serveur puisse gérer ce genre de site .. même pas peur !
FCGI
Il nous faut dans un premier temps installer le paquet FCGI par cpan :
perl -MCPAN -e 'install FCGI'
Wrapper perl fastcgi
Il faut ensuite , créer le script qui ( comme pour php ) lance des process en fastcgi en attente de script à traiter .
vim /usr/bin/fastcgi-wrapper.pl
Voilà le contenu de ce script : fastcgi-wrapper.zip
Il faut maintenant le rendre exécutable
chmod 755 /usr/bin/fastcgi-wrapper.pl
Ok maintenant , nous allons créer le script qui se situe dans le RC , pour lancer les process :
vim /etc/init.d/perl-fastcgi
Voici le fichier perl-fastcgiperl-fastcgi
On le rend exécutable , et on l'ajoute au RC
chmod 755 /etc/init.d/perl-fastcgi
update-rc.d perl-fastcgi defaults
/etc/init.d/perl-fastcgi start
Liaison perl - Nginx
Nous y voilà , les process perl sont lancés , il écoutent sur le port 8999 , il ne nous reste plus qu'à ajouter dans les Vhost qui en ont besoin , les lignes suivantes :
location ~ \.pl$ {
gzip off;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:8999;
fastcgi_index index.pl;
}
Cette fois , pas besoin de modifier les fichier fcgi_params car les modifications à apporter sont les même que précédemment avec php .
Nginx restart
Et bien oui comme pour php , on relance la lecture des fichiers de conf de nginx , afin de prendre en compte les modifications .
/usr/local/nginx/sbin/nginx -s reload
Good job
Ca y est , Nginx est maintenant capable de gérer les script php et perl en plus des fichiers statiques ...
Il reste encore quelques petites choses utiles à voir , comme la gestion du SSL , les redirections automatique , les réécritures d'url, pour du 301 ou l'utilisation de framework tel que symphony , Zend ou autre basé sur la réécriture d'url et un peut de sécurité en plus ...
Voilà le programme de la troisième partie sur nginx ..