Déployer une application Javascript avec un reverse-proxy
© Julien Noyer - All rights reserved for educational purposes only
NGINX est un logiciel libre de gestion de serveur Web ainsi qu'un proxy inverse écrit par Igor Sysoev, dont le développement a débuté en 2002 pour les besoins d'un site russe à très fort trafic. NGINX est un système asynchrone par opposition aux serveurs synchrones où chaque requête est traitée par un processus dédié.
Au lieu d'exploiter une architecture parallèle et un multiplexage temporel des tâches par le système d'exploitation, NGINX utilise les changements d'état pour gérer plusieurs connexions en même temps ; le traitement de chaque requête est découpé en de nombreuses mini-tâches et permet ainsi de réaliser un multiplexage efficace entre les connexions.
Afin de tirer parti des ordinateurs multiprocesseurs, plusieurs processus peuvent être démarrés. Ce choix d'architecture se traduit par des performances très élevées, mais également par une charge et une consommation de mémoire particulièrement faibles comparativement aux serveurs HTTP classiques, tels qu'Apache.
Source Wikipedia, en savoir plus
Les explications qui vont suivre sont basé sur l'utilisation des services Digital Ocean car ils présentent certaines options avantageuses au niveau de la gestion, comme la gestion de la montée en charge - la fameuse "scalabilité" - ou le fait de pouvoir sélectionner des serveurs européens qui permettent la mise en conformité avec la législation RGPD.
En revanche, il n'est pas obligatoire de choisir ce service pour suivre les explications de ce document, car elles définissent une mise en place classique qui est répercutable sur n'importe quel hébergeur.
Build Faster, Scale Easier. DigitalOcean's Optimized Droplets Saves Your Team Time
L'outil proposé par Digital Ocean s'appelle un Droplet, il faut se rendre dans la section Create > Droplet du site qui permet de les configurer et de suivre les étapes. Pour ce tutorel la configuration suivante est utilsée :
Il est possible d'associer une clef SSH à votre VPS, nous conseillons de ne pas le faire pour pouvoir l'ajouter en ligne de commande pendant la configuration du serveur.
Une fois les étapes de configurations passées, un mail est envoyé par Digital Ocean contenant les informations pour se connecter au Droplet créé. Nous allons à présent utiliser ces identifiants pour nous connecter et configurer le Droplet.
Comme dit précédemment peu importe l'hébergeur selectionner, les différentes commandes que nous allons utiliser sont applicables sur n'importe quel serveur Linux.
La connexion au serveur est faite en Secure Shell (SSH) via un invite de commande avec la commande suivante :
Un message s'affiche alors dans le terminal vous demandant d'accepter la connexion au serveur :
Il faut accepter la connexion pour ensuite indiquer le mot de passe reçu par mail :
À la première connexion sur le serveur avec l'identifiant root, il est demandé de changer le mot de passe. C'est une première étape de sécurité qui impose de ne pas garder le mot de passée généré par Digital Ocean.
Les mots de passe ne s'affichent pas, il faut veiller à bien les renseigner.
Une fois la connexion établie sur le serveur il faut avant toute chose s'assurer qu'il est à jour en tapant les commandes suivantes :
Il va de soi que l'utilisation d'un compte nommé root est une faille de sécurité dans la mesure où il sera le premier à être testé dans le cadre d'une attaque. C'est pourquoi la première étape qu'il faut suivre dans la configuration d'un serveur distant et l'ajout d'un compte sudo et la suppression du compte root.
Pour créer un nouvel utilisateur, il faut taper les commandes suivantes :
C'est 3 commandes permettent de créer un profil, de l'ajouter au groupe
sudo
et de changer de profil utilisateur.
La dernière commande permettant de se changer de profil, il est à présent possible d'associer une clef SSH au nouveau profil pour sécuriser la connexion au serveur avec cette utilisateur. Dans un premier temps il faut créer un dossier et un fichier pour enregister la clef sur le serveur :
La commande chmod permet de changer les droits en lectur/écriture sur un fichier ou un dossier.
La dernière commande ouvre l'éditeur Nano dans lequel nous allons coller la clef SSH de notre compte. Dans un autre invite de commande nous allons tous d'abord créer une nouvelle clef si aucune n'est présente sur la machine :
Surr Mac pout vérifier si une clef est présente sur une machine il faut téperr la commande
cat ~/.ssh/id_rsa.pub
.
Un message s'affiche demandant d'indiquer le chemin vers la clef .../.ssh/id_rsa
, attention car si une clef existe déjà elle sera remplacée.
L'ajout d'une
passphrase
est recommandé pour sécuriser la clef.
Nous pouvons maintenant copier la clef que nous venons de créer avec la commande suivante :
Une fois la clef copiée il suffi de la coller dans la fenêtre Nano ouverte précédemment pour l'associer au profil mainAdmin
créé sur le serveur. Nous enregistrons le fichier puis nous modifions les permissions sur le dossier .ssh
avec la commande suivante :
NB : les commandes présentées pour gérer les clefs SSH correspondent à l'OS Machintosh, si elles ne fonctionnent pas pour Windows il est possbile d'utiliser Putty.
Une fois l'utilisateur mainAdmin
créé, il est primordial de s'assurer que la connexion SSH soit correctement configurer avant de passer aux étapes suivantes. Tout en conservant la connexion avec le profil root
actif, nous ouvrons une nouvelle fenêtre d'invite de commande pour nous connecter à présent avec le profil mainAdmin
:
Lorsque la connexion est établie nous sommes à présent connecté au serveur avec le profil mainAdmin
, nous testons à présent que nous sommes bien dans le groupe sudo
avec la commande suivante :
Le mot de passe nous est demandé et une fois renseigné aucun message d'erreur ne n'affiche, la configuration est correct nous poouvons donc passer à l'étape suivante.
NB : S'il y à un problème à l'une des étapes de vérification, il faut revoir soit vérifier la clef
ssh
soit lechmod
du fichierauthorized_keys
.
Nous allons à présent bloquer la possibilité de s'identifier avec l'utilisateur root
et nous allons imposer la connexion via clef SSH. Le fichier de configuration sshd_config
nous permet de gérer les méthode de connexion :
Dans ce fichier il faut changer les valeur de PermitRootLogin
et PasswordAuthentication
puis sauvegarder le fichier :
Une fois la configuration modifier il faut redémarrer le service SSH :
Il est à présent nécessaire de vérifier la configguration, il faut d'abord nous deconnecter pour ensuite relancer la connexion SSH avec le nouveau compte :
NB : il ne faut surtout pas se déconnecter du profil
root
avant d'avoir vérifié la connexionssh
du profilmainAdmin
au risque de ne plus pouvoir se reconnecter au serveur.
Une fois la problématique de connexion sur le VPS passsée, nous pouvons à présent nous occuper d'installer les modules pour déployer notre site Internet ou notre application Web. Les dernières versions des Droplets Digital Ocean intégrent la commande Git, si ce n'est pas le cas, il faut l'installer aveec la commande :
Cette commande vous permet également de mettre tous les outils Git à jour.
Avant d'installer NGINX nous devons nous assurer qu'aucune autre technologie serveur n'est installée sur le VPS, en l'occurence nous allons supprimer toute la configuration Apach2 en tapant les commmandes suivante :
Afin d'utliser NGINX sur notre VPS, nous allons l'installer en tapant la commande suivante afin de configurer un reverse-proxy qui nous permettra de gérer les URLS de notre VPS :
Nous pouvons à présent activer NGINX et définir son comportement par defaut pour indiquer que nous redirigeons toutes les requêtes HTTP en HTTPS que nous configurerons plus tard avec LetsEncrypt.
Pour commencer nous ajoutons dans le fichierdefault
la configuration de NGINX en l'ouvrant dans Nano :
Une fois Nano ouvert, nous remplaçons le code affiché par le suivant avant de fermer et d'enregistrer le fichier :
Nous allons à présent crypter les requêtes grâce à la commande dhparam
afin de gérer les reqêtes HTTPS :
Nous devons maintenant créer un fichier de configuration SSL, afin de rendre les requêtes HTTPS valident. Pour cela nous crééons un fichier ssl-params.conf
:
Et nous ajoutons le code suivant avant d'enregister le fichier :
Pour finir la configuration de NGINX nous devons autoriser certains type de connexion avec les commandes suivantes :
Nous pouvons à présent démarrer le service NGINX pour finir notre configuration, dans un premier temps nous devons redémarrer notre VPS :
Il faut ensuite nous reconnecter pour lancer le service NGINX :
La commande
sudo systemctl status nginx.service
permet de verifier le status de NGINX
La configuration serveur que nous venons de réaliser permet d'héberger des fichiers statiques et de les rendre accessible via des URLs. Le projet que nous souhaitons publier n'est pas connecté à une base de données ni à un serveur NodeJS qui nous imposerait une configuration supplémentaire qui est définie plus bas dans ce document.
Nous considérons donc que vous disposez à cette étape d'un projet qui correspond à la définition ci-dessus, avant de continuer la lecture des étapes suivantes.
Les certificats SSL nous permettent de configurer l'accés HTTPS à nos noms de domaines. Avant de commencer cette configuration sur le VPS nous avons dans un premier temps acheté un nom dee domaine que nous avons fait pointé sur l'adresse IP de notre Droplet.
Une fois le nom de domaine correctement configuré, nous devons dans un premier installer Certbot pour générer les clef SSL :
Puis nous lancons la commande qui permet de configurer une nouvelle URL en HTTPS :
Nous pouvons renouveler les certificats à la main de cette façon
sudo certbot renew --nginx
.
Nous suivons les instruction de LetsEncrypt pour nous identifier et une fois le nom de domaine enregistré un message de validation affiche l'endroit ou sont stockées les clef SSL :
Les clef que nous venons de créer vont nous permettre à présent d'ajouter un fichier de configuration dans NGINX afin d'associer correctement les cleefs SSL à notre nom de domaine. Nous ouvons donc un nouuveau fichier dans Nano :
Il est recommander de nommer le fichier par le nom de domaine.
Dans le fichier qui vient de s'ouvir nous collons le code suivant pour gérer les clef SSL pour ce nom de domaine :
Nous prenons soins de bien modifier les informations pour qu'elles correspondent à notre configuration :
Pour vérifier notre configuration NGINX nous tapons la commande sudo nginx -t
qui noous affiche en résultat :
Notre configuration est à présent terminé, nous pouvons pour la finaliser et activer le nom de domaine sur notre VPS, redemmarer le service NGINX avec la commande suivante :
Le certificat SSL que nous avons généré n'est valable que pour 90 jours, c'est à dire qu'il à besoin d'être renouveler avant la fin de cette prériode pour que notre nom de domaine conserve sa certification. Pour ne pas avoir à renouveler le certificat manuellement nous allons mettre en place un CRON sur le serveur pour qu'il se renouvel automatiquement.
Pour gérer automatiquement la mise à jour des certificats, nous allons créer une tâche en CRON en tapant la commande suivante pour ouvrir le fichier crontab
:
Il est demandé à cette étape de sélectionner un éditeur.
Puis nous ajoutons à la fin du fichier le code suivant :
Le code de renouvellement est exécuter le 1er de chaque mois.
Nous fermons et enregistrons le fichier crontab
puis nous tapons la commande suivante pour testeer notre configuration :
Cette commande affiche la date du futur renouvellmement et nous pouvons a présent pour nous assurer que Nginx continue de fonctionner correctement en reedémarrant le service :
La méthode la plus évidente pour déployer des fichiers d'une machine locale à un serveur distant, dans notre cas le VPS, est celle induite par la technologie serveur utilisée. Dans le cadre de notre VPS, nous avons configurer notre connexion via des cléfs SSH qui nous permet de sécuriser les échangent avec le serveur, nous allons donc utiliser le même principe pour déployer nos fichier.
Si vous avez veillez à avoir un répertoire GitLab ou GitHub dans lequel se trouvent les fichiers que vous souhaitez déployer sur le VPS, il est possible de l'utiliser pour pourvoir directement faire un pull
de la banche souhaitée depuis le VPS.
Il faut dans un premier temps créer le dossier dans lequel vous souhaitez déployer les fichiers sur le VPS, a l'adresse que nous avons défini dans le fichier de configuration du nom de domaine :
Nous nous plaçons ensuite dans le dossier pour y configurer la gestion de Git :
Une fois cette configuration terminée notre VPS est connecté à un répertoire Git distant, la mise à jour ce fait alors simplement avec la commande suite :
Si vous avez utiliser un fichier package.json
pour la configuration de votre projet (dans le cadre d'un développement avec un framework par exemple), vous pouvez y ajouter un script de déploiement afin de le faire directement en invite de commande.
Pour ce faire vous devez éditer le fichier package.json
au niveau du tableau des scripts pour y ajouter le suivant :
Pensez à éditer
./path-to-project/
et<IP_DU_VPS>
avant d'enregistrer le fichier.
Le déploiement ce fait alors simplememnt avec la commande suivante :
Avant de déployer une nouvelle version vous devez d'abord supprimer le dossier
project_name
du VPS.
Nous allons aborder à présent la publication d'une application NodeJS sur notre VPS. Les principes sont différents de la publication d'un projet statique dans le mesure ou nous devons configurer la gestion d'un systeme d'information. En effet, un projet NodeJS s'oriente très souvent dans la mise en place d'une API connectée à une base de données NoSQL, c'est pourquoi les étapes qui vont suivre vous présente ces principes de bases que vous pourrez adapter à votre projet et que nous allons partir du principe que le système d'information choisi est MongoDB.
Pour commencer nous allons installer les modules nous permettant d'utiliser un environement - Javascrip sur notre serveur, à savoir NodeJS avec les commandes suivantes :
Nous allons à présent installer MongoDB qui nous permettra de gérer les données de notre application NodeJS :
Pour configurer MongoDB en tant que service nous allons créer un fichier qui nous permettra de le configurer :
Nous allons coller le code suivant avant d'enrigistrer le fichier :
Nous pouvons à présent lancer le service MongoDB avec la commande suivante :
Pour vérifier le statut du service il faut taper la commande
sudo systemctl status mongodb
.
Les méthodes de déploiement vers le VPS sont les mêmes que celles évoquées au point Déploiement via une répertoire Git, bien que vous êtes libre de créer un script de déploiement. Nous préférons utiliser cette méthode car elle nous permet de concerver la logique de Git sur le VPS, ce qui peut s'avérer utile pour réaliser des modifications directement sur le VPS.
Nous partons donc du principe que votre application NodeJS est présente dans le VPS dans le dossier que vous aurez défini pour l'héberger.
Il est fortement déconseillé de placer l'application NodeJS dans le dossier
home
.
La différence majeur pour publier une application NodeJS se trouve dans la gestion du nom de domaine, car contrairement à un projet statique, une application NodeJS fonctionne sur le principe d'un serveur, c'est pourquoi la configuration du nom de domaine doit intégrer la gestion d'un port.
Pour ajouter un nom de domaine la commande CertBot reste la même :
Mais pour configurer le nom de domaine, au lieu de configurer le dossier root
il faut configurer la location
de la manière suivante :
Nous prenons soins de bien modifier les informations pour qu'elles correspondent à notre configuration :
Pour vérifier notre configuration NGINX nous tapons la commande sudo nginx -t
qui noous affiche en résultat :
Le module PM2 permet d'écouter l'activité du VPS pour capter le moment ou il est relancé, ce qui arrive très souvent pour des raisons de maintenance par exemple. Nous allons donc utiliser npm
que nous avons intallé plus haut pour installer ce module en global sur le VPS :
Nous allons à présent configurer PM2 pour qu’il puisse redémarrer automatiquement nos application NodeJS en cas de redémarage du VPS :
Cette dernière commande permet d’afficher un code à taper pour valider la configuration qui ressemble au code suivant :
Tout est prêt sur notre VPS pour configurer un nom de domaine en HTTPS qui pointee sur un port spécifique. Nous allons donc à présent utiliser PM2 pour lancer notre application NodeJS en tapant la commande suivante dans le dossier racine de notre application :
La liste ci-dessous contient les liens utiles cité dans ce document