Nginx (prononcez "engine x") est un serveur HTTP gratuit, open-source et hautes performances. Nginx est connu pour sa stabilité, son riche ensemble de fonctionnalités, sa configuration simple et sa faible consommation de ressources. Ce tutoriel montre comment installer Nginx sur un serveur Ubuntu 15.10 avec prise en charge de PHP (via PHP-FPM) et MariaDB (en remplacement de MySQL). Le terme LEMP signifie :Linux + Nginx + MySQL + PHP.
1 Remarque préliminaire
Dans ce tutoriel, j'utiliserai le nom d'hôte server1.example.com avec l'adresse IP 192.168.1.100. Ces paramètres peuvent différer pour vous, vous devez donc les remplacer le cas échéant.
2 Installer MariaDB
Je vais installer MariaDB à la place de MySQL, MariaDB est un fork MySQL maintenu par le fondateur original de MySQL, Monty Widenius, qui a des améliorations en termes de vitesse et de fonctionnalités par rapport à MySQL. Pour installer MariaDB, exécutez :
sudo apt-get -y install mariadb-server mariadb-client
MariaDB n'a actuellement aucun mot de passe défini pour l'utilisateur root. Exécutez la commande mysql_secure_installation pour configurer un mot de passe et supprimer la base de données de test.
sudo mysql_secure_installation
Ces questions vous seront posées :
Enter current password for root (enter for none): <-- press enter
Set root password? [Y/n] <-- y
New password: <-- Enter the new MariaDB root password here
Re-enter new password: <-- Repeat the password
Remove anonymous users? [Y/n] <-- y
Disallow root login remotely? [Y/n] <-- y
Reload privilege tables now? [Y/n] <-- y
3 Installer Nginx
Nginx est disponible sous forme de package pour Ubuntu 15.10. Il se peut que le serveur Web apache soit installé sur votre serveur et cela peut provoquer un conflit. Vérifiez qu'Apache n'est pas en cours d'exécution :
ps aux | grep apache2
Si cette commande ne renvoie aucun résultat, poursuivez l'installation de Nginx.
Supprimez apache si la commande ci-dessus affiche certains processus apache avec ces commandes :
sudo systemctl stop apache2.service
sudo systemctl disable apache2.service
sudo apt-get remove apache2
Nous pouvons maintenant installer nginx.
sudo apt-get install nginx
Démarrez ensuite Nginx :
sudo systemctl start nginx.service
sudo systemctl enable nginx.service
Tapez l'adresse IP ou le nom d'hôte de votre serveur Web dans un navigateur (par exemple, http://192.168.1.100), et vous devriez voir la page suivante :
Pourquoi affiche-t-il "Apache2" au lieu de Nginx sur cette page ? Le texte de la page ne reflète pas le serveur Web en cours d'exécution, la page ci-dessus est simplement la page par défaut sur Ubuntu dans la racine du document /var/www/html/ qui est utilisée par Apache et Nginx. Pour vérifier que Nginx sert réellement cette page, vous pouvez soit consulter les en-têtes HTTP dans la console d'analyse du réseau Firefox :
Ou vous vérifiez sur le shell avec lequel nginx s'exécute :
ps aux | grep nginx
Le résultat devrait montrer les processus nginx comme ceci :
4 Installer PHP5
Nous pouvons faire fonctionner PHP5 dans Nginx via PHP-FPM. PHP-FPM (FastCGI Process Manager) est une implémentation alternative de PHP FastCGI avec quelques fonctionnalités supplémentaires utiles pour les sites de toute taille, en particulier les sites les plus fréquentés) que nous installons comme suit :
sudo apt-get install php5-fpm
PHP-FPM est un processus démon (avec le script d'initialisation php5-fpm) qui exécute un serveur FastCGI sur le socket /var/run/php5-fpm.sock.
5 Configuration de Nginx
La configuration de Nginx se trouve dans le fichier /etc/nginx/nginx.conf que nous ouvrons maintenant dans l'éditeur nano :
sudo nano /etc/nginx/nginx.conf
La configuration est facile à comprendre (vous pouvez en savoir plus ici :http://wiki.nginx.org/NginxFullExample et ici :http://wiki.nginx.org/NginxFullExample2)
Tout d'abord (ceci est facultatif), définissez le keepalive_timeout sur une valeur raisonnable :
[...] keepalive_timeout 2; [...]
Les hôtes virtuels sont définis dans les conteneurs du serveur {}. Le vhost par défaut est défini dans le fichier /etc/nginx/sites-available/default - modifions-le comme suit :
sudo nano /etc/nginx/sites-available/default
##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# http://wiki.nginx.org/Pitfalls
# http://wiki.nginx.org/QuickStart
# http://wiki.nginx.org/Configuration
#
# Generally, you will want to move this file somewhere, and start with a clean
# file but keep this around for reference. Or just disable in sites-enabled.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##
# Default server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
#
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php5-cgi alone:
# fastcgi_pass 127.0.0.1:9000;
# With php5-fpm:
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
# listen 80;
# listen [::]:80;
#
# server_name example.com;
#
# root /var/www/example.com;
# index index.html;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}
nom du serveur _; en fait un vhost fourre-tout par défaut (bien sûr, vous pouvez également spécifier un nom d'hôte ici comme www.example.com).
J'ai ajouté index.php à la ligne d'index. racine /usr/share/nginx/html ; signifie que la racine du document est le répertoire /usr/share/nginx/html.
La partie importante pour PHP est la strophe location ~ \.php$ {}. Décommentez-le pour l'activer. Veuillez noter qu'il est important d'activer la ligne "include snippets/fastcgi-php.conf;" dans la strophe d'emplacement PHP pour empêcher les exploits zero-day (voir http://wiki.nginx.org/Pitfalls#Passing_Uncontrolled_Requests_to_PHP et http://forum.nginx.org/read.php?2,88845,page=3).
Enregistrez maintenant le fichier et rechargez nginx :
sudo service nginx reload
Ouvrez ensuite /etc/php5/fpm/php.ini...
sudo nano /etc/php5/fpm/php.ini
... et définissez cgi.fix_pathinfo=0 :
[...] ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. ; http://php.net/cgi.fix-pathinfo cgi.fix_pathinfo=0 [...]
Recharger PHP-FPM :
sudo service php5-fpm reload
Créez maintenant le fichier PHP suivant à la racine du document /var/www/html :
sudo nano /var/www/html/info.php
<?php phpinfo(); ?>
Maintenant, nous appelons ce fichier dans un navigateur (par exemple http://192.168.1.100/info.php) :
Comme vous le voyez, PHP5 fonctionne, et il fonctionne via FPM/FastCGI, comme indiqué dans la ligne API du serveur. Si vous faites défiler plus bas, vous verrez tous les modules déjà activés dans PHP5. MySQL n'y figure pas, ce qui signifie que nous n'avons pas encore de support MySQL dans PHP5.
6 Obtenir le support MariaDB / MySQL en PHP
Pour obtenir la prise en charge de MySQL en PHP, nous pouvons installer le package php5-mysqlnd. C'est une bonne idée d'installer d'autres modules PHP5, car vous pourriez en avoir besoin pour vos applications. Vous pouvez rechercher les modules PHP5 disponibles comme ceci :
apt-cache search php5
Choisissez ceux dont vous avez besoin et installez-les comme ceci :
sudo apt-get install php5-mysqlnd 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-sqlite php5-tidy php5-xmlrpc php5-xsl
APCu est un opcode cacher PHP gratuit pour la mise en cache et l'optimisation du code intermédiaire PHP. Il est similaire à d'autres cacheurs d'opcodes PHP, tels que eAccelerator et Xcache. Il est fortement recommandé d'en installer un pour accélérer votre page PHP.
APC peut être installé comme suit :
sudo apt-get install php5-apcu
Rechargez maintenant PHP-FPM :
sudo service php5-fpm reload
Rechargez maintenant http://192.168.1.100/info.php dans votre navigateur et faites défiler à nouveau jusqu'à la section des modules. Vous devriez maintenant y trouver plein de nouveaux modules, dont le module MySQL :
7 Faire en sorte que PHP-FPM utilise une connexion TCP
Par défaut, PHP-FPM écoute sur le socket /var/run/php5-fpm.sock. Il est également possible de faire en sorte que PHP-FPM utilise une connexion TCP. Pour cela, ouvrez /etc/php5/fpm/pool.d/www.conf...
sudo nano /etc/php5/fpm/pool.d/www.conf
... et faites en sorte que la ligne d'écoute ressemble à ceci :
[...] ;listen = /var/run/php5-fpm.sock listen = 127.0.0.1:9000 [...]
Cela fera écouter PHP-FPM sur le port 9000 sur l'IP 127.0.0.1 (localhost). Assurez-vous d'utiliser un port qui n'est pas utilisé sur votre système.
Rechargez ensuite PHP-FPM :
sudo php5-fpm reload
Passez ensuite par votre configuration nginx et tous vos vhosts et modifiez la ligne fastcgi_pass unix:/var/run/php5-fpm.sock; à fastcgi_pass 127.0.0.1:9000;, par ex. comme ceci :
sudo nano /etc/nginx/sites-available/default
[...]
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php5-cgi alone:
fastcgi_pass 127.0.0.1:9000;
# With php5-fpm:
# fastcgi_pass unix:/var/run/php5-fpm.sock;
}
[...]
Enfin rechargez nginx :
sudo service nginx reload
8 Téléchargement de l'image de la machine virtuelle de ce tutoriel
Ce tutoriel est disponible sous forme d'image de machine virtuelle prête à l'emploi au format ovf/ova, compatible avec VMWare et Virtualbox. L'image de la machine virtuelle utilise les informations de connexion suivantes :
Connexion SSH/shell
Nom d'utilisateur :administrateur
Mot de passe :howtoforge
Cet utilisateur a les droits sudo.
Connexion MariaDB
Nom d'utilisateur :root
Mot de passe :howtoforge
L'IP de la VM est 192.168.1.100, elle peut être changée dans le fichier /etc/network/interfaces. Veuillez modifier tous les mots de passe ci-dessus pour sécuriser la machine virtuelle.
9 liens
- nginx :http://nginx.net/
- Wiki nginx :http://wiki.codemongers.com/Main
- PHP :http://www.php.net/
- PHP-FPM :http://php-fpm.org/
- MySQL :http://www.mysql.com/
- Ubuntu :http://www.ubuntu.com/