mardi, avril 30, 2013

Configurer un VPS, installer Nginx, PHP et MySql sur Ubuntu 12.10

 

Ce tutoriel pour installer Nginx, PHP et MySql fonctionne sur tous les types de serveur que ce soit des VPS ou des serveurs dédiés. Le package LEMP (Linux, Nginx, MySql et PHP) est une meilleure alternative à LAMP qui concerne Apache. La principale raison est qu’Apache est trop gourmand en ressources et qu’on n’a pas toujours besoin de toutes les fonctionnalités d’Apache. En outre, les VPS pas chers coutent l’équivalent d’un hébergement mutualisé (à partir de 5 euros par mois), mais vous n’aurez que 256 Mo ou 512 Mo de RAM dans le meilleur de cas. De ce fait, il faut un package de serveur léger et performant et c’est le principal objectif de Nginx.

Notez que ce tutoriel pour installer Nginx, PHP et Mysql sur un VPS a fonctionné pour moi, mais je ne garantis pas que cela marche pour vous, notamment si vous utilisez des anciennes versions d’Ubuntu qui nécessitent des étapes supplémentaires.

Préliminaires pour configurer un VPS avec Nginx, PHP et Mysql

 

Dans ce tutoriel,  je vais utiliser le nom d’hôte server1.example.com avec l’adresse IP 192.168.0.100. Assurez-vous de changer ces informations selon votre configuration. Même si cela n’est pas toujours conseillé, j’effectue toutes ces étapes en mode root et donc, on va basculer vers root pour commencer.

sudo su

 

Configurer un VPS, installer MySQL

 

Pour installer MySql, nous utilisons la commande :

 

apt-get install mysql-server mysql-client

 

On vous demande de fournir un mot de passe pour l’utilisateur root de MySQL. Ce mot de passe s’appliquera à root@localhost ainsi que à root@server1.example.com et ainsi, on n’aura pas besoin de configurer le mot de passe plus tard.

New password for the MySQL "root" user: <—yourrootsqlpassword
Repeat password for the MySQL "root" user: <—yourrootsqlpassword

 

Installer Nginx sur un VPS

 

Nginx est disponible en paquet pour Ubuntu 12.10 et vous pouvez donc l’installer avec la commande :

 

apt-get install nginx

 

Et ensuite, on lance Nginx :

 

/etc/init.d/nginx start

 

Allez dans votre navigateur et tapez le nom d’hôte qui est lié à votre serveur ou votre adresse IP qui est  http://192.168.0.100 dans notre exemple et vous devriez voir la page suivante :

 

vps-installer-nginx-php-mysql_1_1

 

Le document root par défaut de Nginx dans Ubuntu 12.10 se trouve sur /usr/share/nginx/www.

 

Configurer un VPS, installer PHP 5

 

Contrairement à Apache qui peut être automatiquement configuré avec PHP, nous avons besoin du module PHP-FPM (PHP-FPM FastCGI Process Manager) qui est une alternative à PHP Fast CGI pour faire fonctionner correctement PHP avec Nginx. Par ailleurs, ce module PHP-FPM possède des fonctionnalités intéressantes, notamment pour les sites à fortes audience. On l’installe avec la commande suivante :

apt-get install php5-fpm

 

PHP-FPM est un processus Daemon qui se lancera comme un serveur FastCGI sur le socket avec /var/run/php5-fpm.sock et comme tous les processus Daemons, il se lancera à partir de /etc/init.d/php5-fpm.

 

Note pour Ubuntu 10.04 : Pour les anciennes versions d’Ubuntu, vous aurez parfois des messages d’erreurs sur un paquet manquant appelé Dialog qui fait partie de Debian. Si vous avez des messages d’erreurs pour l’installation de PHP-FPM, alors installez ce paquet dialog avant de recommencer (apt-get install dialog)

 

Configurer Nginx sur un serveur VPS

 

La configuration de Nginx se trouve sur /etc/nginx/nginx.conf que nous ouvrons avec la commande :

 

vi /etc/nginx/nginx.conf

Note : Vous pouvez aussi utilisez un éditeur plus convivial tel que Nano (nano /etc/nginx/nginx.conf) et si vous ne trouvez pas Nano, alors vous devez l’installer au prélable.

On ne vous détaille pas la configuration, car elle est facile à comprendre. Vous pouvez trouver un exemple de configuration sur

http://wiki.nginx.org/NginxFullExample

 

En premier lieu, adaptez le nombre de processus et réglez la valeur keepalive_timeout sur une quantité raisonnable.

 

[...]
worker_processes  4;
[...]
    keepalive_timeout   2;
[...]

 

Les hôtes virtuels se trouvent dans les parties servers {}. L’hôte virtuel par défaut est défini dans le fichier /etc/nginx/sites-available/default et modifiez-le de la façon suivante :

 

vi /etc/nginx/sites-available/default

 

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

        root /usr/share/nginx/www;
        index index.php index.html index.htm;

        # Make site accessible from http://localhost/
        server_name _;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }

        location /doc/ {
                alias /usr/share/doc/;
                autoindex on;
                allow 127.0.0.1;
                allow ::1;
                deny all;
        }

        # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests
        #location /RequestDenied {
        #       proxy_pass http://127.0.0.1:8080;
        #}

        #error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                root /usr/share/nginx/www;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-cgi alone:
                #fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
                deny all;
        }
}
[...]

 

Décommentez les deux lignes listen pour faire que Nginx lise le port 80 en IPv4 et IPv6.

server_name_; Réglez celui-ci comme l’hôte virtuel à atteindre par défaut (évidemment, vous pouvez spécifier un nom d’hôte tel que www.example.com).

J’ai ajouté index.php à la ligne index. Le root /usr/share/nginx/www; signifie que le document root est dans /usr/share/nginx/www. Pour rappel, le document root est le répertoire principal de votre serveur (le dossier public).

 

La partie importante pour le PHP est  la ligne location ~ \.php$ {}. Décommentez-la pour l’activer. Remarquez aussi que j’ai ajouté la ligne try_files $uri =404; pour éviter des exploits de faille de zéro-day . Pour plus d’informations, lisez l’article :

http://wiki.nginx.org/Pitfalls#Passing_Uncontrolled_Requests_to_PHP cgi.fix_pathinfo = 0; dans

Si vous ne voulez pas utiliser la ligne précédente, vous pouvez mettre cgi.fix_pathinfo = 0; dans le fichier /etc/php5/fpm/php.ini (n’oubliez de redémarrer PHP-FPM après ce dernier changement).

Maintenant, sauvegardez le fichier et redémarrez Nginx.

 

/etc/init.d/nginx reload

 

Maintenant, créez le fichier PHP suivant dans /usr/share/nginx/www :

vi /usr/share/nginx/www/info.php<?php


phpinfo();
?>

 

Ensuite, on teste ce fichier dans notre navigateur :

 

http://192.168.0.100/info.php

Et le résultat :

vps-installer-nginx-php-mysql_2_1

Comme vous le voyez, PHP est désormais configuré avec Nginx et il fonctionne via FPM/FastCGI comme c’est indiqué par la ligne Server API. Si vous défilez la page, vous verrez des modules PHP qui sont déjà activés, mais vous remarquez que MySQL n’est pas listé. Cela signifie qu’on doit encore configurer le support de Mysql dans PHP 5 dans notre VPS avec Nginx.

 

Configurer MySql avec le PHP dans un VPS sous Nginx

 

Pour que le PHP supporte Mysql avec Nginx, nous devons installer le paquet php5-mysql. C’est aussi une bonne idée d’installer d’autres modules PHP, car vous en aurez parfois besoin pour installer un CMS ou autre. Vous pouvez chercher des modules PHP avec la commande suivante

 

 

apt-cache search php5

 

Choisissez ceux dont vous avez besoin et installez-les de la manière suivante :

 

apt-get install php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl

Xcache est un optimiseur de code gratuit et libre pour mettre en cache et optimiser du code intermédiaire. Il est similaire à d’autres optimiseurs de cache tels que eAccelerator ou PAC. Et on recommande fortement d’installer un de ces optimiseurs pour accélérer le traitement de vos pages PHP.

On peut installer Xcache de la façon suivante :

apt-get install php5-xcache

Ensuite, relancez PHP-FPM :

 

/etc/init.d/php5-fpm reload

Maintenant, rechargez la page :

http://192.168.0.100/info.php

Et parcourez de nouveau les modules installés. Vous devriez de nombreux nouveaux modules incluant celui de Mysql.

 

vps-installer-nginx-php-mysql_3_1

 

Configurer PHP-FPM avec une connexion TCP

 

Par défaut, PHP-FPM lit le socket dans /var/run/php5-fpm.sock. Mais on peut faire en sorte qu’il utilise une connexion TCP. Pour ce faire, ouvrez le fichier /etc/php5/fpm/pool.d/www.conf :

 

vi /etc/php5/fpm/pool.d/www.conf

Et configurez la ligne listen comme les suivants :

[...]
;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000
[...]

 

Cela permettra à PHP-FPM de lire le porte 9000 sur l’IP 127.0.0.1 (qui est locahost). Assurez-vous d’utiliser un port qui est inutilisé par votre système.

 

Ensuite, rechargez PHP-FPM :

 

/etc/init.d/php5-fpm reload

 

Ensuite, allez dans votre configuration de Nginx et changez la ligne fastcgi_pass unix:/var/run/php5-fpm.sock; de tous vos hôtes virtuels en fastcgi_pass 127.0.0.1:9000; comme l’exemple suivant :

 

 

vi /etc/nginx/sites-available/default[...]


        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-cgi alone:
                fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                #fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
[...]

 

Finalement, redémarrez Nginx :

 

/etc/init.d/nginx reload

 

Et voilà, vous avez désormais un serveur VPS fonctionnel avec Nginx, PHP et Mysql. Maintenant, il arrive que votre serveur VPS possède déjà Apache et vous pouvez le configurer pour qu’il écoute un autre port (par exemple le 8080) ou vous pouvez le stopper ou le désinstaller. Attention, l’installation de Ngix sur votre VPS alors qu’Apache tourne déjà provoquera systématiquement des erreurs.