[gab2016] nodejs dans azure - matthieu bouilloux

39

Upload: cellenza

Post on 22-Jan-2018

304 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Node.JS dans AzureMatthieu Bouilloux

Page 2: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux
Page 3: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Backends Node.JS en PAAS et en IAAS dans AzurePartie I

Définitions et principesComparatif, investissements et compatibilité

Partie IIMise en place d’une WepApp en PAAS

Partie IIIMise en place d’un environnement de production Node.JS en IAAS

Partie IV

Conclusion

Q&A

Page 4: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

PAAS et en IAAS dans Azure

PAAS : platform as a service IAAS : infrastructure as a service

L'entreprise

MicrosoftAzure

le maintient de l'applicatif

la plate-forme d'exécutiondes applicatifs,

les logiciels de base et l'infrastructure

le middleware des serveursles logiciels applicatifs

(exécutables, paramétrages,les bases de données)

le matériel serveurles systèmes d'exploitationles couches de virtualisation

le stockageles réseaux

Page 5: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Différences d’investissements

IAAS PAAS

Les + :

- Plus besoin de gérer l’infrastructure- Gain de temps à la mise en place / déploiement- Automatiquement scalable- Le besoin en compétence diminue- La maintenance se limite à l’applicatif

Les - :

- Des prix plus élevés et pouvant évoluer- Possède des limitations techniques- Problème de compatibilité (modules natifs)- Ne peut être appliqué à tous les projets(usage avancé de Node.JS)- - Vous êtes complétement dépendant du service

Les + :

- Des prix plus faibles à service équivalent- Baisse constante des prix du storage et du compute- Plus de liberté sur les technologies; pas de limitation (modules natifs)- Séparation / multiple process en Node.JS héberger plusieurs app Eviter un redémarrage global des services- Architecture “déplaçable”

Les - :

- L’investissement en temps, notamment pourl’installation et la configuration de l’environnement- Nécessite plus de compétences en interne- Certain aspect de la gestion de base de donnéesrestent très complexe.

Page 6: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Cas concrêts

En IAAS, on peut appeler n'importe quel programme installé sur la machine avec NodeJS (spawn / exec).Avec les compétences, on peut rapidement monter l'équivalent d'un "Media Service" avec,

par exemple des utilitaires tel que ffmpeg, sans coût à l’opération mais à celui de la machine virtuelle.Tout dépend donc du volume d’opération à traiter.

Page 7: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Cas concrêts

Le problème des modules natifs Node.JS en PAAS :

Les modules nécessitent souvent l'installation sur un poste fixe avant de les déployer sur l'infrastructure.Là encore la compatibilité n'est pas forcement assurée.

Alors que la quasi totalité des packages s'intalle sur des machines virtuelles linux sans difficultée.

Page 8: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Cas concrêts

En IAAS, la création d’une structure scalable et à haute disponibilité sur une base de données NoSQL,(exemple: replica-set MongoDB) nécessite un temps de mise en place

et une acquisition de compétences non négligeables.

Page 9: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Cas concrêts

En IAAS, on peut diviser une application en plusieurs process,lorsqu’un process redémarre ou est inaccessible,

le reste de l’applicatif continue de fonctionner normalement.Le lancement de processus en tâche de fond n’a

pas de limitate d’utilisation et reste relativement facile à mettre en place.

Page 10: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Cas concrêts

Le PAAS ne permet pas de monter des structures atypiques tel que pour le webscrapping,avec l’installation de multiples proxy.

Page 11: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

App Service VS Virtual Machines

Page 12: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

DocumentDB VS Disk Storage

Page 13: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Node.JS en PAAS avec App Services & DocumentDB

Création de l’App

Configuration dans le portail

Setup accès FTP/FTPS

Identifiant et déploiement

Configuration de l’app (web.config)

Création de la Base de donnée

RRécupération des identifiants de DocumentDB

Debug par log via FTP

Configurer un nom de domaine externe

Page 14: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Création de l’application

Page 15: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Configuration dans le portail

WebSocketsToujours Actif

Page 16: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Setup Accès FTP/FTPS

Page 17: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Identifiant et déploiement

Le nom d’utilisateur est celui spécifié dans l’interface, il peut être légèrement différent de celui entré à l’étape précédente.

Les noms d’hôtes FTP/FTPS sont mentionnés au-dessous.

Déploiement par FTP/FTPS, le déploiement par git étant largement documentée

Page 18: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Configuration de l’app

Si vous ne voulez/pouvez pas envoyer le dossier node_modules,vous pouvez toujours lancer une installation dans la console,après avoir déployé votre applicatif (incluant le package.json).

Une seule commande : “npm install”

Page 19: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Configuration de l’app - apparté Express.JS

Particularité avec le Framework Express.JS

I.Il faut copier et renomer le fichier de lancement,

situé après déploiement dans le dossier /wwwroot/bin/wwwen server.js dans le dossier /wwwroot

II.RRemplacer tous les “../”

Par “./” dans le nouveau fichier server.js

Page 20: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Configuration de l’app - Le fichier web.config

<?xml version="1.0"?><configuration> <system.web> <compilation batch="false" /> </system.web> <system.webServer> <httpP <httpProtocol allowKeepAlive="true" /> <webSocket enabled="false"/> <handlers> <add name="iisnode" path="server.js" verb="*" modules="iisnode" /> </handlers> <rewrite> <rules> <!-- Do not in <!-- Do not interfere with requests for node-inspector debugging --> <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true"> <match url="̂ server.js\/debug[\/]?" /> </rule>

<!-- First we consider whether the incoming URL matches a physical file in the /public folder --> <rule name="StaticContent"> <action type="Rewrite" url="public{REQUEST_URI}"/> </ </rule>

<!-- All other URLs are mapped to the node.js web app entry point --> <rule name="DynamicContent"> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/> </conditions> <action type="Rewrite" url="server.js"/> </ </rule> </rules> </rewrite> </system.webServer></configuration>

Particularités

I.Garder les WebSockets Active :httpProtocol allowKeepAlive=”true”

II.Désactiver les WebSockets de IIS pour utiliser socket.IO

wwebSocket enabled=”false”Attention toutefois à les activer dans l’interface Azure

Page 21: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Création de la base de donnée

Effectivement plus rapide que de monterun replica-set MongoDBsur trois VM après setup

Page 22: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Création de la base de donnée

Récupération des clés d’accèsen deux clics !

Un simple “npm install documentdb”et votre base de données est accessible

Tutoriels DocumentDB

Sur GitHubhttps://github.com/Azure/azure-documentdb-node

Sur Microsoft.comhttps://azure.microsoft.com/fr-fr/documentation/articles/documentdb-nodejs-application/

Page 23: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Debug par log via FTP

Il faut ajouter un fichier de configuration :à la racine du projet “/wwwroot”

Ajoutez un fichier : “IISNode.yml”

Ayant pour contenu :

loggingEnabled: true

Il ne vous reste plus qu’à vous connnecterau au FTP et de naviguer dans les logs !

Page 24: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Nom de domaine externe

Particularité

Pour rediriger le nom de domaine sans son sous-domaine ex: http://gab2016.cloudil faut ajouter un CNAME awverify

awverify CNAME awverify.APP_NAME.azurewebsites.net.

Pour le sous-domaine : http://www.gab2016.cloudun CNAME vers la web app suffit

www CNAME awwww CNAME awverify.APP_NAME.azurewebsites.net.

Accessible depuis l’interface azure dans les panneaux de la web app.Aucune difficulté mais une particularité !

Page 25: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Environnement de production Node.JS en IAAS avec Ubuntu 14.04LTS

Clé SSH

Setup de la VM

SSH to VM

Node.js/Nginx setup

Attacher un disque

Initialiser le disque pour linux

MonMonter le disque de manière permanente

Utiliser plusieurs disques pour un seul espace de stockage

Gestion des droits pour le SFTP

Ajout des points de terminaisons / Lancement de processus Node.JS

Lancement permanent de processus Node.JS (ex: reboot)

Configurer MongoDB en local

Page 26: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Via PuttyGen

VM Clé publique SSH

Générer

Clé publique

Mot de passe

Nom d’utilisateur

Sauvegarder laPrivate Key

Page 27: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Clé pulibque SSH

A1 pour exemple

Création de la VM

Page 28: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Authentification sur la VM

Clé privée

Une fois ouvert,il suffit de renseigner le user / password

Le user étant le Key CommentEt le password le Key Passphrase

domain.cloudapp.net

Connexion/SSH/AUTH

Page 29: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -sudo apt-get install -y nodejs

curl -sL https://deb.nodesource.com/setup_5.x | sudo -E bash -sudo apt-get install -y nodejs

Node.JS v.4

Node.JS v.5

Build Tools

sudo apt-get install -y build-essential

Process Manager 2

sudo npm install pm2 -g

Node.JS v.4 ou v.5 au choix

Installation de base : Node.js / PM2 / Nginx sur Ubuntu 14.04 LTS

Nginx

sudo add-apt-repository ppa:nginx/stable sudo apt-get updatesudo apt-get install nginx

Page 30: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Attacher un disk en option

Page 31: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Initialiser le disque

sudo fdisk /dev/sdcnp1“ENTER”“ENTER”ppwsudo mkfs -t ext4 /dev/sdc1

sudo fdisk -l

Page 32: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

sudo mkdir /drive1sudo mount /dev/sdc1 /drive1sudo -i blkid

Récupérer l’uuid et injecter le dans /etc/fstabsudo nano /etc/fstab

Cas 1 : Un dossier par disqueMonter le disque sur un dossier (y compris lors d’un reboot)

Pour tester :sudo umount /drive1sudo mount /drive1df -h

“CTRL + O” : enregistrer“CTRL + X” : quitter

Rajouter après la première ligne UUID:UUID=cdda2a63-a89f-4b98-874d-c69b26c9907a /drive1 ext4 defaults 1 2

Page 33: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Cas 2 : Un dossier pour plusieurs disquesUtilisation de MHDDFS

sudo apt-get install mhddfsmkdir /virtual1mhddfs /dev/sdc1,/mnt/sdd1, /virtual1 -o allow_other

MHDDFS au démarrage

sudo nano /etc/fstab

Rajouter à la fin du fichier fstab :

mhddfs#/dev/sdc1,/mnt/sdd1, /virtual1 -fuse allow_other 0 0

Page 34: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Créer le dossier et changer les droits pour l’accès SFTPcd /drive1sudo mkdir wwwsudo chown -R username:username ./www

Connexion en SFTP de la même manière que sur PuttyLe dossier est accessible en écriture sur /drive1/www pour l’utilisateur username

Configurer Nginx comme Proxy pour vos process Node.JSsudo rm /etc/nginx/sites-enabled/defaultsudo nano /etc/nginx/sites-available/mon_site

server { server_name domain.cloudapp.net; listen 80;

location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; p proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_pass http://127.0.0.1:3000; proxy_redirect off; }}

sudo ln -s /etc/nginx/sites-available/mon_site /etc/nginx/sites-enabled

Page 35: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Redémarrer Nginx, lancer le process Node et ouvrir les ports 80 et 443 pour l’HTTPS

sudo service nginx reload

cd /drive1/wwwsudo npm installsudo pm2 start bin/www --name app1

“npm install” une fois votre application deployée sur le dossier www via git, sftp ou autre

Où “bin/www” correspond au process node,ici celui du framework Express.js en version 4

Page 36: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Le script en cas de redémarrage, notamment lors de maintenance !

sudo nano /etc/init.d/init

#!/bin/sh /drive1/init.sh

sudo chmod ugo+x /etc/init.d/init

sudo update-rc.d init defaults

sudo nano /drive1/init.sh

#!/bin/bash sudo -u username sudo pm2 start /drive1/www/bin/www --name app1

sudo chmod a+x /drive1/init.sh

Sans cette opération, vous devrez redémmarer vos process manuellement sur chaque machine,lors d’un crash machine ou lors d’une maintenance Azure !

Sans le -u username un “sudo su” sera requis pour accéderà PM2 (Process Manager 2)

Page 37: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

MongoDB en local - Ubuntu 14.04LTSsudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.listsudo apt-get updatesudo apt-get install -y mongodb-org

Configurer MongoDB sur le disque attaché !

cd /drive1sudo mkdir dbsudo mkdir ./db/datasudo mkdir ./db/logsudo chown -R mongodb:mongodb ./db

sudo nano /etc/mongod.conf

Remplacer dbPath dans storage :

Remplacer path dans systemLog :

/drive1/db/data

/drive1/db/log/mongod.log

Puis redémarrer mongodb :

sudo service mongod restart

Si tout est ok, vous verrez apparaîtrele fichier mongod.log dans db/log

Page 38: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

L’union fait la force

Le choix du PAAS ou du IAAS dépend de la spécificité de chaque projet.

Microsoft Azure met à disposition tous les outils nécessaires pour créerun équilibre entre les deux.

À vous de jouer !

Conclusion

Page 39: [GAB2016] NodeJS dans Azure - Matthieu Bouilloux

Merci