Matthieu Bouilloux - NodeJS dans Azure - - Global Azure Bootcamp 2016 Paris
-
Upload
azug-fr -
Category
Presentations & Public Speaking
-
view
162 -
download
0
Transcript of Matthieu Bouilloux - NodeJS dans Azure - - Global Azure Bootcamp 2016 Paris
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
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
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.
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.
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.
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.
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.
Cas concrêts
Le PAAS ne permet pas de monter des structures atypiques tel que pour le webscrapping,avec l’installation de multiples proxy.
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
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
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”
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
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
Création de la base de donnée
Effectivement plus rapide que de monterun replica-set MongoDBsur trois VM après setup
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/
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 !
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é !
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
Via PuttyGen
VM Clé publique SSH
Générer
Clé publique
Mot de passe
Nom d’utilisateur
Sauvegarder laPrivate Key
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
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
Initialiser le disque
sudo fdisk /dev/sdcnp1“ENTER”“ENTER”ppwsudo mkfs -t ext4 /dev/sdc1
sudo fdisk -l
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
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
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
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
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)
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
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