Serveur Web : Nginx et PHP (Serveur Web sur Debian Squeeze)

Publié le

Avant de commencer l'instalaltion de Nginx et PHP, quelques petits éléments.

J'ai décidé d'utiliser Nginx plutôt qu'Apache car il est beaucoup plus rapide et supporte des montées en charge beaucoup plus importantes qu'Apache.

Pour utiliser PHP avec Apache, il suffisait d'installer un module apache et tout fonctionnait directement. Avec Nginx, nous sommes obligés d'utiliser FastCGI Process Manager qui est plus ou moins un démon PHP qui va tourner sur le serveur et répondre à Nginx lorsqu'il le demandera. Plus de détails dans les configurations.

 

Pour installer PHP et pas mal d'extenstions à PHP (vous pouvez en supprimer si vous le souhaitez), une seule ligne de commande :

aptitude install nginx-extras php5-cgi php5-fpm php5 php5-mysql php5-dev php-pear php5-cli php5-gd php5-mcrypt php5-imap php5-curl php5-apc php5-fpm

php5-cli : Utilisation de php en ligne de commande (utile pour les tâche CRON)

php5-gd : Manipulation d'images en PHP

php5-imap : Connexion en Imap à un serveur de web en PHP

php5-curl : Utilisation de CURL en PHP (utile pour beaucoup d'API)

php5-apc : Mise en cache de l'OP code de PHP poru accélérer son fonctionnement (utilsiation totalement transparente)

php5-fpm : Pour obtenir le script init.d qui permettra de gérer php-fpm. Le démon est maintenant inclus directement dans PHP.

 

Lorsque tout est installé, commencons par configurer Nginx. Dans le fichier /etc/nginx/nginx.conf, dans la zone events :

worker_connections 1024;
multi_accept on;
use epoll;

Détails sur la configuration.

Puis dans la zone http :

tcp_nopush off;
server_tokens off;
client_max_body_size 30M;
client_body_buffer_size 128k;
expires 31d;

index index.php index.htm index.html;

Détails sur la confgiration.

Puis nous allons éditer les paramètres par défaut utiliser lors du passage au PHP-FPM. Dans le fichier /etc/nginx/fastcgi_params, ajoutez :

fastcgi_index index.php;
fastcgi_split_path_info ˆ((?U).+\.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;
fastcgi_pass unix:/var/run/php5-fpm.sock;

La dernière ligne indique le chemin du socket par lequel on va passer, que nous allons configurer un peu plus loin.

Editons le site par défaut /etc/nginx/sites-available/default de nginx pour y ajouter quelques éléments :

listen 80; ## listen for ipv4; this line is default and implied
listen [::]:80 default ipv6only=on; ## listen for ipv6

#comment index line

server_name localhost ks389877.kimsufi.com;
location = /nginx_status {
expires off;
stub_status on;
access_log off;
error_log off;
allow 176.31.102.83;
allow 127.0.0.1;
deny all;
}
location = /php_status {
expires off;
include fastcgi_params;
access_log off;
error_log off;
allow 127.0.0.1;
deny all;
}
location = /apc_info.php {
expires off;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /home/var/www/apc_info.php;
access_log off;
error_log off;
allow 127.0.0.1;
deny all;
}

location ~ \.php$ {
expires off;
include fastcgi_params;
}

les loctions nginx_status, php_status et apc_info.php seront utilisé plus tard pour le monitoring du serveur.

Pour la dernière section, on active le PHP. Ce ne sera pas plus compliqué que ça pour activer le PHP pour un autre site.

Enfin, pour être sûr que le site par défaut soit bien chargé en premier, exécutez :

rm /etc/nginx/sites-enabled/default
ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/000-default

 

Voilà pour ce qui est du Nginx. Passons maintenant à la configuration du PHP.

D'abord la configuration de base du FPM pour autoriser l'envoi de fichier jusqu'à 15 Mégas dans le fichier /etc/php5/fpm/php.ini :

post_max_size = 30M
upload_max_filesize = 15M

Puis configurons le FPM pour correspondre un peu plus à nos attentes dans le fichier /etc/php5/fpm/pool.d/www.conf :

listen = /var/run/php5-fpm.sock
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.status_path = /php_status

La dernière ligne permet de répondre à la configuration que nous avons faites dans Nginx pour connaître le nombre de process du PHP-Fpm par exemple.

Puis, nous avons installé un accélérateur de code PHP. La configuration par défaut n'est pas très satisfaisante et arrive très vite a des limitations. Modifié le fichier /etc/php5/fpm/conf.d/apc.ini pour y mettre :

[apc]
apc.shm_size=256M
; workaround for CLI
apc.enable_cli=1
; Symfony make lot of path lookups, try to optimize
apc.include_once_override=0
apc.canonicalize=1

Tous les détails de cette configuration.

Dans Squeeze, PHP est installé directement avec suhosin. Cette une extension qui rajoute une couche de sécuirté dans pas mal d'éléments du PHP. Pour ma part, je n'avais pas vraiment envie de corriger tous les sites installé sur ce serveur. J'ai donc modifié la configuration de suhosin pour loggé ses erreurs (afin de les comprendre et les corriger), mais aussi d'augmenter les limites qu'il met en place et de supprimer quelques sécurités. Dans le fichier /etc/php5/conf.d/suhosin.ini :

[suhosin]
suhosin.log.syslog.facility = LOG_LOCAL2

suhosin.executor.include.whitelist="phar"

suhosin.memory_limit = 4G

suhosin.post.max_value_length = 1280000
suhosin.request.max_value_length = 1280000

suhosin.session.encrypt = Off
suhosin.cookie.encrypt = Off

Tous les détails de cette configuration.

la première ligne de cette configuration utilise rsyslog, avec le numéro 2. Il faut donc créer le configuration correspondante dans le fichier /etc/rsyslog.d/php-suhosin.conf :

local2.*  /home/var/log/php-suhosin.log

Et comme on ne veut pas gardé ad vitam eternam ces logs, on ajoute dans le fichier /etc/logrotate.d/rsyslog juste en dessous de /var/log/messages :

/var/log/php-suhosin.log

 

Pour finir, on déplace le dossier www dans notre /home/var, on redémarre les démons dont la configuration a été modifié et notre serveur web est prêt !

mkdir /home/var/www/
ln -s /home/var/www/ /var/www
/etc/init.d/rsyslog restart
/etc/init.d/php5-fpm restart
/etc/init.d/nginx force-reload

 

La suite : Base de données MySQL.

Retour au sommaire du tutorial complet.