Fermer
Kwashi EliE.

À propos de moi

Kwashi EliE.

Le Logiciel Libre entre Web, Design et Administration SystĂšme par un Africain, OpenSource Evangelist

Retrouvez-moi sur

[🐧Open Source Evangelist]

Préc. Suiv.

đŸ€“ Monter son propre serveur web avec NGINX (+PHP-FPM) sur une machine Linux

Linux 31-07-2018 17:30
    PARTAGER SUR:

Il est dit (souvent) qu'un systÚme d'exploitation Linux (peu importe la distro) comporte de facto un "serveur web" et qu'il faille juste savoir comment le configurer pour s'en servir et développer ses blogs, sites web, applications, etc... La solution la plus répandue est Apache2. Moi, je rédige ces lignes sur NGINX, un minuscule logiciel susceptible de vous permettre de disposer d'un puissant serveur web moderne capable de supporter de gros trafics sur plusieurs sites simultanément.

PARTIE-1: PAPOTAGE... 😋

À qui ceci s'adresse-t-il?

Cette note s'adresse:

  • aux amateurs sysadmin n'ayant jamais expĂ©rimentĂ© ce logiciel,
  • Ă  tout utilisateur d'un systĂšme Linux desktop souhaitant se lancer dans le dĂ©veloppement web (peu importe le langage),
  • aux jeunes Ă©tudiants en ingĂ©nierie logiciel curieux,
  • aux nouveaux acquĂ©reurs d'un serveur dĂ©diĂ© vierge et qui aimeraient assurer un peu leur autosuffisance en hĂ©bergeant ce qu'ils veulent quand ils veulent sur leur machine chez DigitalOcean (par exemple),
  • mais aussi Ă  chaque personne dĂ©sirant rĂ©aliser soi-mĂȘme son propre blog (ou site) basĂ© sur un CMS open-source basĂ© sur PHP comme Joomla, Wordpress, Drupal, etc...

Un serveur web: un rappel

Je parle de serveur web quand je parle de "serveur http". Il s'agit d'un environnement propice Ă  l'existence de services et librairies diverses dont a besoin chaque application web pour rĂ©pondre aux besoins de ses utilisateurs: les internautes d'un site par exemple. C'est cet environnement qui est responsable de la bonne santĂ© de vos sites web et qui reçoit les requĂȘtes HTTP des utilisateurs (visiteurs) pour les traiter en permanence. Quand il n'arrive pas Ă  traiter certaines requĂȘtes, il envoie des messages d'erreurs spĂ©cifiques qui s'affichent dans le navigateur des visiteurs (ou pas) et par le mĂȘme, enregistre des informations relatives Ă  ces erreurs dans les "fichiers journal" que son administrateur peut consulter pour tenter des approches correctives.

Qu'est-ce, NGINX?

Wikipedia en parle assez, plusieurs blogs Ă©galement. En ce qui concerne ce programme, les termes qui reviennent souvent sont entre autres: fort trafic, plantage de site dĂ» aux visites, asynchrone, puissance, lĂ©ger, etc... Je dirai qu'il s'agit du "petit marteau qui casse de gros caillou" dans le domaine de service de contenus sur le web. Cette application dite "serveur asynchrone" se base que sur quelques fichiers texte Ă  la syntaxe facile Ă  personnaliser, pour hĂ©berger, administrer et servir un nombre inimaginable d'applications web simultanĂ©ment tout en optimisant au maximum les charges et requĂȘtes. En pratique, un serveur web basĂ© sur NGINX (lire Engine-X) permet (sans grand effort) d'hĂ©berger des dizaines d'applications en dĂ©veloppement mais Ă©galement de les maintenir en production; chacune peut recevoir un trĂšs fort trafic. Le boom de trafic est gĂ©rĂ© d'une façon subtile par dĂ©faut ce qui permet de traiter simultanĂ©ment des milliers de requĂȘtes si par exemple vous hĂ©bergez des sites et blog qui reçoivent d'Ă©normes visites. Il a Ă©tĂ© dĂ©veloppĂ© en 2002 par un Russe afin de fixer un problĂšme de boom de trafic de Rambler l'un des portails web les plus visitĂ©s de Russie. Depuis, un grand nombre de plate-forme web les plus utilisĂ©s au monde s'en sert.

J'avais déjà fait un exposé sur NGINX, téléchargeable sur mon espace docs.ElkwaetBlog.tk; il peut servir à en apprendre davantage sur cette solution open-source de serveur web asynchrone.


PARTIE-2: T.P. 😎

Dans la suite, il sera question de monter ce serveur web sur un ordinateur personnel équipé de la distribution Linux Debian8 (ou Ubuntu16.04LTS). La méthodologie est à 95% similaire à celle d'un serveur distant (un serveur dédié, une machine cloud, un vps, etc...). L'avantage de travailler ainsi sur un desktop Linux est que ceci permet (aux débutants) de comprendre effectivement comment fonctionnent les services mis en jeu pour assurer la viabilité des applications web (sites internet, blog, etc...). Ils peuvent ainsi se lancer dans une personnalisation plus évoluée afin de disposer d'un environnement d'hébergement propre à eux pour plusieurs projets à la fois.

Installation de paquets logiciels

GĂ©nĂ©ralement, ces paquets se trouvent dans les dĂ©pĂŽts officiels de notre distro Linux. Mais, on peut ĂȘtre emmenĂ© des fois Ă  utiliser un dĂ©pot spĂ©cifique. Sur DEBIAN 8 (Jessie), j'ajoute les sources logiciels pour installer les paquets Nginx et Php. Dans mon terminal, je me sers de l'Ă©diteur Nano pour Ă©diter le fichier sources.list

$ sudo nano /etc/apt/sources.list

Copier les lignes suivantes et les coller dans le fichier (Ctrl,Shift,V)

# Pour installer  php7.0
deb http://packages.dotdeb.org jessie all
# Pour installer Nginx
deb http://nginx.org/packages/mainline/debian/ jessie nginx

Fermer et enregistrer le fichier (Ctrl,X pour fermer > O ou Y pour valider l’enregistrement).

Mettre Ă  jour le cache apt avec un $ sudo apt update puis lancer l'installation des paquets requis:

$ sudo apt install nginx php7.0 php7.0-fpm elinks

🙄 Hey mon grand, tu veux bien m'expliquer ce que ta commande là implique s'il te plaüt?

Il s'agit d'installer:

  • le logiciel Nginx qui sert le contenu statique,
  • PHP dont je prends soin de spĂ©cifier la version 7.0 parce qu'il en existe plusieurs sous versions actuellement et qu'il est mieux de spĂ©cifier celle qu'on prĂ©fĂšre. PHP est le langage de programmation principal de la plupart des CMS populaires. Leur bon fonctionnement sur votre serveur web dĂ©pend de ses librairies naturellement, et PHP-FPM qui permet la communication entre le serveur NGINX et PHP faisant ainsi de la structure NGINX/PhpFpm un serveur de contenus dynamique, plus lĂ©ger et moins gourmand qu'Apache2 son principal concurrent trĂšs populaire. Il faut noter que certains paquets (relatifs Ă  PHP) seront nĂ©cessaires Ă  la longue en fonction des besoins, si ceux-ci n'ont pas Ă©tĂ© installĂ© dans la vague "php7.0". Le dĂ©ploiement des applis php exigera ce qu'il faut et pareil pour les applications Django, Ruby, JS, etc...
  • Elinks quand Ă  lui est un navigateur web en console; il sert bien Ă  faire des tests de configuration basiques rapidement rĂ©duisant la traĂźne des navigateurs conventionnels avec de potentiels soucis de cache: Ă  bien des Ă©gards, il est bien utile.

Premiers tests du serveur http

😼 DĂ©jĂ ??? On peut tester mon serveur, tu dis?

AprĂšs l'installation de ces paquets, testons le fonctionnement de notre serveur web dĂ©jĂ  prĂȘt Ă  ĂȘtre exploitĂ© avec un navigateur web. DĂ©terminons notre nom d’hĂŽte et/ou notre adresse IP principal. Par dĂ©faut cette adresse est 127.0.0.1 ou 127.0.1.1 ou localhost Donc, vous pouvez taper dans votre navigateur habituel (firefox): http://localhost ou http://127.0.0.1

Avec l'homologue en console, vous pouvez saisir directement comme commande "$elinks http://localhost". Si on avait déjà lancé le navigateur vide $elinks, il faut appeler sa barre d'adresse avec la touche "G" et saisir l'URL

D'oĂč provient cette fameuse page "Welcome to nginx!" ?

Ouep! đŸ€• Figure-toi que cette question m'a effleurĂ© l'esprit aussi...

Étant en univers open-source, la recette est toujours offerte. Cette page est juste un fichier natif du core de nginx. Il s'agit d'une page web d'exemple se trouvant à 2 emplacement:

  • "/var/www/html/index.nginx-debian.html" (le principal)
  • "/usr/share/nginx/html/index.html" (le secondaire) Pour les diffĂ©rencier, vous pouvez Ă©diter "le principal en y ajoutant autre chose Ă  son contenu". Avec un coup de $ sudo nano /var/www/html/index.nginx-debian.html on peut ajouter ce qu'on veut sur les lignes de la balise <title> et le grand titre de la balise <body><h1>.

Ă  gauche l'Ă©diteur Nano, Ă  droite les navigateurs Elinks et Firefox

Ceci étant, il faut en déduire que le serveur NGINX (dans ses versions récentes) considÚre comme Répertoire par défaut de site web le dossier /var/www/html. Chaque projet hébergé là sera accessible sur le domaine principal "localhost".

HĂ©bergeons nos premiers sites tout de suite

Cool!đŸ€“ Je n'attendais que ça!
  • Dans votre console, dĂ©placez vous dans le rĂ©pertoire /var/www/html/ et crĂ©ons 2 dossiers "abalo" et "ayelevi" comme pour 2 sites aux mĂȘmes noms: $ cd /var/www/html && sudo mkdir abalo ayelevi
  • DĂ©placez-vous dans le dossier Abalo et crĂ©ez le fichier de sa page d'acceuil en HTML $ cd abalo && sudo nano index.html . Quand l'Ă©diteur s'ouvre, saisissez la ligne <h1>Allo Allo M. ABALO</h1>. Ctrl,X puis O pour fermer et enregistrer.
  • DĂ©placez-vous d'ici vers le dossier Ayelevi et crĂ©ez sa page d'acceuil en PHP $ cd ../ayele && sudo nano index.php. Saisissez la ligne <h1>Allo Allo Mlle. AYELEVI</h1>. Ctrl,X puis O pour fermer et enregistrer.

Vous pouvez essayer d'accéder à ces sites dans votre navigateur: http://localhost/abalo et http://localhost/ayelevi

On remarque une erreur 403 de Nginx pour le site en PHP et une rĂ©ussite pour le site en HTML: c'est une bonne nouvelle.😊

PS: Cet emplacement (dans /var/) n'est pas pour autant une obligation. Tout dĂ©pendra des besoins et prĂ©fĂ©rences de l'administrateur. Vous pouvez hĂ©berger votre site n'importe oĂč sur votre machine, il suffit de bien spĂ©cifier cela Ă  NGINX.

Configuration de base du serveur web

Comment marche la configuration de Nginx à la base? Tout (presque) se passe dans le répertoire /etc/nginx/. Les fichiers de configurations, les modules, les templates, etc... sont stockés là. En ce qui concerne les fichiers de configuration, il y en a de 2 types:

  • Les configurations du core Nginx
  • Les configurations des applications hĂ©bergĂ©es

Les fichiers de configuration du serveur web sont repartis dans les sous-répertoires de "/etc/nginx/" et sont des fichiers texte au format ".conf". Le principal "/etc/nginx/nginx.conf" et comporte les paramÚtres généraux du serveur http. Ces paramÚtres sont modifiables par l'administrateur afin de personnaliser le fonctionnement de son serveur web quant à l'usage de certaines applications web.

Les fichiers de configuration des applications hébergées comportent les paramÚtres relatifs au bon fonctionnement de vos sites web. Ils sont stockés dans 2 sous-dossiers:

  • /etc/nginx/sites-availables/ pour les configurations des sites autorisĂ©s Ă  se servir du serveur,
  • /etc/nginx/sites-enabled/ pour les sites activĂ©s Ă  fonctionner sur le serveur.

Ce qui est recommandé est de disposer d'un lien symbolique dans le répertoire "des activations". Ce lien doit pointer vers les paramÚtres précédemment établis dans le répertoire "des autorisations". Un hébergement (un site) est donc opérationnel que quand ses paramÚtres sont présents dans le dossier "des activations".

Pour vérifier cela,

Affichez le contenu du répertoire "des activations": $ ls -l /etc/nginx/sites-enabled

Le retour vous donne ce qui suit: default -> /etc/nginx/sites-available/default

Ceci voudrait dire que ce dossier contient un fichier "default" qui est le lien (raccourci) vers un autre fichier "default" dans le dossier "des autorisations".

Personnalisation du fichier de configuration de sites et autorisation du support de PHP

Le fait que le site PHP (du précédent test) ait donné une erreur serveur de code 403 était du au fait que le support PHP et son module FPM n'ont pas encore été activé. Il faut éditer en tant que super-utilisateur ce fichier: $ sudo nano /etc/nginx/sites-available/default

Ce fichier se présente comme suit:

  • Chaque ligne correspond Ă  un paramĂštre,
  • Chaque paramĂštre est une directive pensĂ©e de la façon [clĂ© valeur],
  • Un paramĂštre est terminĂ© avec un "point-virgule" ; au bout,
  • Un paramĂštre inactif est prĂ©cĂ©dĂ© d'un symbole "diĂ©z" #; le diĂšz sert ainsi Ă  insĂ©rer des commentaires dans les fichiers de configuration
  • Les paramĂštres sont repartis en 2 types de blocs: les blocs server (serveur) et location (emplacement)

Maintenant, il faut suivre mes indications dans l'exemple ci-dessous pour personnaliser votre fichier; vous aurez besoin de dé-commenter certains paramÚtres et de compléter certains:


server {
        # Port d'Ă©coute principal des requĂȘtes HTTP du serveur web
        listen 80 default_server;
        listen [::]:80 default_server;

        # Dossiers principal de site web
        root /var/www/html;

        # Type de fichier autorisé à la racine du site; ajouter "index.php" au début de la liste
        index index.php index.html index.htm index.nginx-debian.html;

        # Nom d’hîte principal
        server_name localhost;

        # Quand cet emplacement (/ racine) ne pointe sur rien, d'afficher une page d'erreur 404
        location / {
                try_files $uri $uri/ =404;
        }

        # Appel des paramĂštres de php-fpm
        location ~ \.php$ {
               include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        }

        # Interdire l'accÚs direct à tout fichier commençant par ".ht" comme le fichier ".htaccess" d'Apache si jamais ce dernier se trouve à la racine du site
        location ~ /\.ht {
                deny all;
        }
}

Une fois terminé, fermez et enregistrer le fichier. Actualiser ensuite le service de nginx avec l'une des commandes suivantes: $ sudo systemctl reload nginx ou $ sudo service nginx reload

Re-testez le site d'Ayélévi dans votre navigateur et c'est bon: il sera accessible désormais.

Celà voudrait dire que tout projet PHP stocké à l'emplacement "/var/www/html" appliqué par la directive "root" du fichier de configuration sera supporté par PHP et sera servi grùce au socket de PHP-FPM et accessible à partir du domaine "localhost" (URL: http://localhost).

Comment se passer du vieux "localhost" en local: notion de "virtual hosts"

Voici quelque chose d'autre d’intĂ©ressant: utiliser les "nom d'hĂŽtes virtuels" au lieu des sous-dossiers pour les sites. Il s'agit de pouvoir utiliser des "noms de domaines" virtuels exactement comme des rĂ©els sur votre serveur. Vous aurez ainsi par exemple:

  • "http://abalo.sdf" au lieu de "http://localhost/abalo"
  • "http://ayelevi.sdf" ou encore "http://ayele.vi" au lieu de "http://localhost/ayelevi" Lorsque vous dĂ©ployez votre serveur sur une machine cloud (DigitalOcean par exemple), vous avez accĂšs Ă  une zone DNS qui vous permet de gĂ©rer les enregistrements DNS d'un nom de domaine (rĂ©servĂ© prĂ©alablement chez un rĂ©gistrar) en le pointant Ă  l'adresse IP de votre serveur. Ce nom de domaine vous permet de relier vos applications web (et sites) Ă  eux afin qu'elles soient accessibles via le protocole HTTP avec les navigateurs des internautes du monde. C'est dans la configuration de votre serveur web que vous autorisez ce nom de domaine Ă  accĂ©der Ă  l'emplacement exact de votre site. Et si vous disposez de plusieurs domaines que vous aimeriez attribuer Ă  diffĂ©rents sites spĂ©cifiquement, c'est avec les configurations d'hĂŽtes virtuelles que vous vous prendrez.

Sur Linux, vous pouvez crĂ©er autant d'hĂŽtes virtuels sur votre machine que vous pouvez avoir envie. La configuration de NGINX pour chaque site ayant prĂ©vu une directive destinĂ©e Ă  attribuer les noms d'hĂŽtes Ă  des emplacements spĂ©cifiques, cette combinaison de manipulation sert Ă  utiliser les hĂŽtes virtuels en local, qu'on soit sur une machine personnelle ou une machine distante; d'autant plus que les URL issues de ceci ne restent accessibles que dans le mĂȘme rĂ©seau local tout court.

Un VHOST (virtual host) de NGINX, basiquement, s'Ă©crit avec la syntaxe suivante et vous permet :

server {
    # Port d'Ă©coute http du serveur
    listen              80;

    # Emplacement d'hébergement du site
    root                /chemin/racine/du/site;

    # Type de fichiers principaux autorisés à la racine
    index               index.php index.html index.htm;

    # Nom d'HĂŽte (ici nom d'hote virtuel)
    server_name         domaine.virtuel;

    location / {
            try_files $uri $uri/ =404;
    }
}

[ Un bloc "server" comportant un ou plusieurs blocs "location" et des paramĂštres connexes]

Et mon domaine virtuel, je l'obtiens comment chef🙄?

Créer les noms d'hÎtes virtuels

Il y a rien de plus simple que cela: il faut juste ĂȘtre un tout petit peu crĂ©atif quant au choix de l'extension de votre domaine virtuel. En vue d'Ă©viter un quelconque conflit avec votre navigateur, il faut Ă©viter de se servir d'extensions conventionnelles comme .com .net .org .me .info .dev ...

Éditez le fichier "hosts" de votre systĂšme; c'est ce fichier qui joue le rĂŽle de "rĂ©gistrar virtuel" auprĂšs de qui vous devez rĂ©server votre nom de domaine virtuel. Et oui, pas besoin d'aller voir une quelconque autoritĂ© ou un vendeur comme OnlyDomains, Freenom, OVH, etc...

Un coup de $ sudo nano /etc/hosts et ajouter au bout de la ligne 127.0.0.1 le.s domaines virtuels que vous voulez, enregistrez et fermez. Dans mon exemple, on obtiendra ce qui suit:

C'est tout! Votre nom.s de domaine virtuel.s est actif dĂšs lors, et ce jusqu'au moment oĂč vous dĂ©cidez de le supprimer dans le fichier hosts. Vous pouvez vĂ©rifier en faisant un coup de $ping dessus:

Maintenant, allons créer les fichiers de configuration pour rendre ces domaines opérationnels

Créez un nouveau fichier de configuration pour un nouveau site autonome:

$ sudo nano /etc/nginx/sites-available/ayelevi

Copiez-y la configuration suivante:

server {

    listen          80;
    root            /var/www/html/ayelevi;
    index           index.php index.html index.htm;
    server_name     ayele.vi;

    location / {
            try_files   $uri $uri/ =404;
    }

    location ~ \.php$ {
            include     snippets/fastcgi-php.conf;
            include     fastcgi_params;
            fastcgi_pass    unix:/var/run/php/php7.0-fpm.sock;
            fastcgi_split_  path_info ^(.+\.php)(/.+)$;
            fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /\.ht {
            deny        all;
    }
}

Fermez et enregistrez;

La configuration étant créée pour un site, il faut l'activer en lui créant un "raccourci" dans le répertoire des activations grùce à un lien symbolique: $ sudo ln -s /etc/nginx/sites-available/ayelevi /etc/nginx/sites-enabled

Testez la stabilité des configurations au sein de NGINX; ceci permet de scanner tous les fichiers de configurations en vue de déceler de potentiels conflits provenant d'une mauvaise syntaxe par exemple: $ sudo nginx -t

Le retour doit donner le message suivant:

~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Vous pouvez maintenant ré-démarrer (ou juste actualiser) le serveur pour qu'il applique ces nouvelles modifications: $ sudo service nginx reload

Vous pouvez maintenant tester le tout: $ elinks http://ayele.vi ou saisissez votre nouveau URL dans votre navigateur Firefox: souriez! Vous avez fait le coup du nouvel administrateur systĂšme.đŸ€“

Pour chaque nouveau VHost, vous n'avez juste qu'Ă  faire la mĂȘme chose: enregistrement du domaine, crĂ©ation de la configuration dans "sites-available", activation de la configuration avec un lien symbolique $ln. Le bloc location ~ \.php$ {} ne sera pas nĂ©cessaire quand vous crĂ©erez un VHost pour un projet Django ou Ruby on Rails par exemple. RĂ©fĂ©rez-vous Ă  la documentation du framework que vous voulez utiliser. Toute fois, restez confiant: vous commencez ainsi une belle aventure avec un serveur web prĂȘt Ă  supporter d'Ă©normes charges mais qui consommera moins de ressource pour tout gĂ©rer. Entre temps, vous pouvez spĂ©cifier le nombre de cƓurs processeur que le serveur doit utiliser dans le fichier "nginx.conf" et amĂ©liorer les rĂ©glages par dĂ©faut de PHP-FPM dans le fichier "/etc/php/7.0/fpm/php.ini". Toute fois, soyez malin: pour chacun de ces fichiers de configuration basique Ă  modifier, ayez le reflexe d'en faire une copie 😊. Si non NGINX enregistre les erreurs dans son journal situĂ© Ă  "/var/log/nginx/error.log" quand PHP-FPM enregistre les siennes dans "/var/log/php7.0-fpm.log"


    LIBRE DE PARTAGER SUR:

Qu'en pensez-vous ?👇 RĂ©agissez...