Nginx et PHP
Nginx est un serveur web concurrent d’Apache très populaire, mais il est bien plus encore. Il peut aussi être utilisé comme reverse-proxy, load-balancer, terminaison ssl etc. Personnellement, je le trouve bien plus simple et cohérent à configurer qu’Apache. Ce post va proposer et expliquer une configuration basique pour faire tourner nginx avec du php sous Debian.
Concernant les configurations que l’on peut trouver dans les tutos sur internet, j’appellerai à la plus grande méfiance (à commencer par le mien) ! Pour vous en convaincre, je vous conseille de faire un tour sur la page des pièges de config du wiki nginx. La erreurs référencées se retrouvent fréquemment dans la plupart des tutos quand ces derniers n’utilisent pas des éléments de config obsolètes. Bien évidemment, je m’inspire des docs officielles (ici et là) pour mes propres configurations.
Environnement
OS : Debian 7.5 stable (Wheezy) (64bits)
Nginx : nginx/1.2.1
PHP : 5.4.4
Installation des Packages sous Debian
Pour le moment, seuls ces deux packages suffisent pour une installation minimale:
1 | root@server:~# apt-get install nginx php5-fpm |
Bien sûr, par la suite de nombreux modules peuvent être nécessaires selon ce que vous faite tourner. S’il s’agit d’un CMS comme WordPress, une base de donnée comme MySql sera obligatoire!
Création de la Racine du Serveur Web
On va à titre de démonstration créer un simple ficher php basique à l’aide de nano:
1 2 3 4 5 6 7 8 | root@server:~# mkdir /var/www/mondomaine -p root@server:~# nano /var/www/mondomaine/index.php root@server:~# cat /var/www/mondomaine/index.php <?php phpinfo(); ?> |
Voilà! Le contenu de votre premier serveur web est créé. Il ne reste plus qu’à réaliser la configuration de nginx.
Configuration Nginx et php5-fpm
La première chose à vérifier est le socket utilisé par php5-fpm
1 2 | root@server:~# cat /etc/php5/fpm/pool.d/www.conf | grep php5-fpm.sock listen = /var/run/php5-fpm.sock |
Il s’agit ici de la valeur par défaut sur un Debian 7.4. Mais, elle peut varier selon le linux utilisé.
Pour Nginx, créez à l’aide de nano un premier fichier /etc/nginx/php_params qui servira de template pour le traitement des requêtes php dans vos différentes configurations de serveur web. Faites attention à la ligne 25 justement qui doit correspondre au socket utilisé par php5-fpm.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | root@server:~# cat /etc/nginx/php_params fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # Debian use use a socket for php # for TCP just use 127.0.0.1:port fastcgi_pass unix:/var/run/php5-fpm.sock; |
Ensuite, créez le fichier même de configuration du serveur web toujours à l’aide de nano, ici /etc/nginx/sites-available/mondomaine. Le « ln -s » crée le lien symbolique qui active le serveur virtuel dans nginx.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | root@server:~# nano /etc/nginx/sites-available/mondomaine root@server:~# cat /etc/nginx/sites-available/mondomaine server { server_name www.mondomaine.com; # Keep a root path in the server level, this will help automatically fill # Information for stuff like FastCGI Parameters root /var/www/mondomaine; # You can set access and error logs at http, server and location level # Likewise means you turn them off at specific locations access_log /var/log/nginx/mondomaine.access.log; error_log /var/log/nginx/mondomaine.error.log; # will serve by default index.php index index.php; # Simply using try_files, tests the request uri against a file, then folder # then if neither can be found, the request is sent to index.php # try_files checks the existence of the PHP file before passing the request to the FastCGI server location / { try_files $uri $uri/ /index.php ; } # send bad requests to 404 fastcgi_intercept_errors on; # Includes my PHP location parameters location ~ \.php { include /etc/nginx/php_params; try_files $uri /index.php; fastcgi_index index.php; } # this prevents hidden files (beginning with a period) from being served location ~ /\. { deny all; } } root@server:~# ln -s /etc/nginx/sites-available/mondomaine /etc/nginx/sites-enabled/mondomaine root@server:~# ls -alh /etc/nginx/sites-enabled/mondomaine lrwxrwxrwx 1 root root 36 Apr 27 08:24 /etc/nginx/sites-enabled/mondomaine -> /etc/nginx/sites-available/mondomaine |
Quelques Explications
Les « try_files » à la ligne 21 et 30 sont important. C’est généralement une mauvaise idée de passer une requête php au fastcgi sans avoir testé l’existence du fichier. Il s’agit d’une vulnérabilité grave dans votre serveur.
Le « index » à la ligne 16 renseigne les fichiers à servir par défaut. Ici index.php
Le « location »: Nginx agit par blocs définis par des locations :
- le « location / » à la ligne 21 agit sur les uri avec le prefix « / »
- le « location ~ \.php » à la ligne 27 est une regex (symbole ~) sur toutes les uri contenant « .php »
- le « location ~ /\. » à la ligne 34 interdit l’accès aux fichiers commençant par .
Maintenant, il ne reste plus qu’à recharger la nouvelle configuration dans Nginx :
1 2 | root@server:~# service nginx reload Reloading nginx configuration: nginx. |
Résultat
Si tout s’est bien passé, notamment si votre nom de domaine pointe bien vers votre serveur nginx, vous n’avez plus qu’à taper dans votre navigateur préféré www.mondomaine.com et voir s’afficher:
PHP Version 5.4.4-14+deb7u9 |
System | Linux server 3.2.0-4-amd64 #1 SMP Debian 3.2.57-3 x86_64 |
Build Date | Apr 18 2014 14:36:01 |
Server API | FPM/FastCGI |
Virtual Directory Support | disabled |
Configuration File (php.ini) Path | /etc/php5/fpm |
Loaded Configuration File | /etc/php5/fpm/php.ini |
Scan this dir for additional .ini files | /etc/php5/fpm/conf.d |
Additional .ini files parsed | /etc/php5/fpm/conf.d/10-pdo.ini |
Pour la Suite
Maintenant, il ne vous reste plus qu’à développer votre site web ou en installer un tout fait. Ce ne sont pas les applicatifs qui manquent sur internet. Si vous utilisez un CMS type WordPress, il vous faudra probablement installer aussi MySql avec un simple
1 | root@server:~# apt-get install mysql-server php5-mysql |
Bien évidemment, il ne s’agit que d’une configuration basique qui sera à adapter au cas par cas. Et comme d’habitude, rien ne remplace une lecture rigoureuse de la documentation officielle.