Node.JSdansAzure
MatthieuBouilloux
BackendsNode.JSenPAASetenIAASdansAzure
PartieI
Définitionsetprincipes
Comparatif,investissementsetcompatibilité
PartieII
Miseenplaced’uneWepAppenPAAS
PartieIII
Miseenplaced’unenvironnementdeproductionNode.JSenIAAS
PartieIV
Conclusion
Q&A
PAASetenIAASdansAzure
PAAS:platform asaservice IAAS:infrastructureasaservice
L'entreprise
Microsoft
Azure
lemaintientdel'applicatif
laplate-formed'exécution
desapplicatifs,
leslogicielsdebaseetl'infrastructure
lemiddlewaredesserveurs
leslogicielsapplicatifs
(exécutables,paramétrages,
lesbasesdedonnées)
lematérielserveur
lessystèmesd'exploitation
lescouchesdevirtualisation
lestockage
lesréseaux
Différencesd’investissements
IAAS PAAS
Les+:
-Plusbesoindegérerl’infrastructure
-Gaindetempsàlamiseenplace/déploiement
-Automatiquementscalable
-Lebesoinencompétencediminue
-Lamaintenanceselimiteàl’applicatif
Les-:
-Desprixplusélevésetpouvantévoluer
-Possèdedeslimitationstechniques
-Problèmedecompatibilité(modulesnatifs)
-Nepeutêtreappliquéàtouslesprojets
(usageavancédeNode.JS)
--Vousêtescomplétementdépendantduservice
Les+:
-Desprixplusfaiblesàserviceéquivalent
-Baisseconstantedesprixdustorageetducompute
-Plusdelibertésurlestechnologies;pasdelimitation
(modulesnatifs)
-Séparation/multipleprocessenNode.JS
hébergerplusieursapp
Eviterunredémarrageglobaldesservices
-Architecture“déplaçable”
Les-:
-L’investissemententemps,notammentpour
l’installationetlaconfigurationdel’environnement
-Nécessiteplusdecompétenceseninterne
-Certainaspectdelagestiondebasededonnées
restenttrèscomplexe.
Casconcrêts
EnIAAS,onpeutappelern'importequelprogrammeinstallésurlamachineavecNodeJS(spawn/exec).
Aveclescompétences,onpeutrapidementmonterl'équivalentd'un"MediaService"avec,
parexempledesutilitairestelqueffmpeg,sanscoûtàl’opérationmaisàceluidelamachinevirtuelle.
Toutdépenddoncduvolumed’opérationàtraiter.
Casconcrêts
LeproblèmedesmodulesnatifsNode.JSenPAAS:
Lesmodulesnécessitentsouventl'installationsurunpostefixeavantdelesdéployersurl'infrastructure.
Làencorelacompatibilitén'estpasforcementassurée.
Alorsquelaquasitotalitédespackagess'intallesurdesmachinesvirtuelleslinuxsansdifficultée.
Casconcrêts
EnIAAS,lacréationd’unestructurescalableetàhautedisponibilitésurunebasededonnéesNoSQL,
(exemple:replica-setMongoDB)nécessiteuntempsdemiseenplace
etuneacquisitiondecompétencesnonnégligeables.
Casconcrêts
EnIAAS,onpeutdiviseruneapplicationenplusieursprocess,
lorsqu’unprocessredémarreouestinaccessible,
lerestedel’applicatifcontinuedefonctionnernormalement.
Lelancementdeprocessusentâchedefondn’a
pasdelimitated’utilisationetresterelativementfacileàmettreenplace.
Casconcrêts
LePAASnepermetpasdemonterdesstructuresatypiquestelquepourlewebscrapping,
avecl’installationdemultiplesproxy.
AppServiceVSVirtualMachines
DocumentDBVSDiskStorage
Node.JSenPAASavecAppServices& DocumentDB
Créationdel’App
Configurationdansleportail
SetupaccèsFTP/FTPS
Identifiantetdéploiement
Configurationdel’app(web.config)
CréationdelaBasededonnée
RRécupérationdesidentifiantsdeDocumentDB
DebugparlogviaFTP
Configurerunnom dedomaineexterne
Créationdel’application
Configurationdansleportail
WebSockets
ToujoursActif
SetupAccèsFTP/FTPS
Identifiantetdéploiement
Lenom d’utilisateurestceluispécifiédansl’interface,
ilpeutêtrelégèrementdifférentdeceluientréàl’étapeprécédente.
Lesnomsd’hôtesFTP/FTPSsontmentionnésau-dessous.
DéploiementparFTP/FTPS,ledéploiementpargitétantlargementdocumentée
Configurationdel’app
Sivousnevoulez/pouvezpasenvoyerledossiernode_modules,
vouspouveztoujourslanceruneinstallationdanslaconsole,
aprèsavoirdéployévotreapplicatif(incluantlepackage.json).
Uneseulecommande:“npm install”
Configurationdel’app-appartéExpress.JS
ParticularitéavecleFrameworkExpress.JS
I.
Ilfautcopieretrenomerlefichierdelancement,
situéaprèsdéploiementdansledossier/wwwroot/bin/www
enserver.jsdansledossier/wwwroot
II.
RRemplacertousles“../”
Par“./”danslenouveaufichierserver.js
Configurationdel’app-Lefichierweb.config
<?xmlversion="1.0"?>
<configuration>
<system.web>
<compilationbatch="false"/>
</system.web>
<system.webServer>
<httpP<httpProtocolallowKeepAlive="true"/>
<webSocketenabled="false"/>
<handlers>
<addname="iisnode"path="server.js"verb="*"modules="iisnode"/>
</handlers>
<rewrite>
<rules>
<!--Donotin<!--Donotinterferewithrequestsfornode-inspectordebugging-->
<rulename="NodeInspector"patternSyntax="ECMAScript"stopProcessing="true">
<matchurl="^server.js/debug[/]?"/>
</rule>
<!--FirstweconsiderwhethertheincomingURLmatchesaphysicalfileinthe/publicfolder-->
<rulename="StaticContent">
<actiontype="Rewrite"url="public{REQUEST_URI}"/>
</</rule>
<!--AllotherURLsaremappedtothenode.jswebappentrypoint-->
<rulename="DynamicContent">
<conditions>
<addinput="{REQUEST_FILENAME}"matchType="IsFile"negate="True"/>
</conditions>
<actiontype="Rewrite"url="server.js"/>
</</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Particularités
I.
GarderlesWebSocketsActive:
httpProtocolallowKeepAlive=”true”
II.
DésactiverlesWebSocketsdeIISpourutilisersocket.IO
wwebSocketenabled=”false”
Attentiontoutefoisàlesactiverdansl’interfaceAzure
Créationdelabasededonnée
Effectivementplusrapidequedemonter
unreplica-setMongoDB
surtroisVM aprèssetup
Créationdelabasededonnée
Récupérationdesclésd’accès
endeuxclics!
Unsimple“npm installdocumentdb”
etvotrebasededonnéesestaccessible
TutorielsDocumentDB
SurGitHub
https://github.com/Azure/azure-documentdb-node
SurMicrosoft.com
https://azure.microsoft.com/fr-fr/documentation
/articles/documentdb-nodejs-application/
DebugparlogviaFTP
Ilfautajouterunfichierdeconfiguration:
àlaracineduprojet“/wwwroot”
Ajoutezunfichier:“IISNode.yml”
Ayantpourcontenu:
loggingEnabled:true
Ilnevousresteplusqu’àvousconnnecter
auauFTPetdenaviguerdansleslogs!
Nom dedomaineexterne
Particularité
Pourredirigerlenom dedomainesanssonsous-domaineex:http://gab2016.cloud
ilfautajouterunCNAMEawverify
awverifyCNAMEawverify.APP_NAME.azurewebsites.net.
Pourlesous-domaine:http://www.gab2016.cloud
unCNAMEverslawebappsuffit
www CNAMEawwww CNAMEawverify.APP_NAME.azurewebsites.net.
Accessibledepuisl’interfaceazuredanslespanneauxdelawebapp.
Aucunedifficultémaisuneparticularité!
EnvironnementdeproductionNode.JSenIAASavecUbuntu14.04LTS
CléSSH
SetupdelaVM
SSHtoVM
Node.js/Nginxsetup
Attacherundisque
Initialiserledisquepourlinux
MonMonterledisquedemanièrepermanente
Utiliserplusieursdisquespourunseulespacedestockage
GestiondesdroitspourleSFTP
Ajoutdespointsdeterminaisons/LancementdeprocessusNode.JS
LancementpermanentdeprocessusNode.JS(ex:reboot)
ConfigurerMongoDBenlocal
ViaPuttyGen
VM ClépubliqueSSH
Générer
Clépublique
Motdepasse
Nom d’utilisateur
Sauvegarderla
PrivateKey
ClépulibqueSSH
A1pourexemple
CréationdelaVM
AuthentificationsurlaVM
Cléprivée
Unefoisouvert,
ilsuffitderenseignerleuser/password
LeuserétantleKeyComment
EtlepasswordleKeyPassphrase
domain.cloudapp.net
Connexion/SSH/AUTH
curl-sLhttps://deb.nodesource.com/setup_4.x|sudo-Ebash-
sudoapt-getinstall-ynodejs
curl-sLhttps://deb.nodesource.com/setup_5.x|sudo-Ebash-
sudoapt-getinstall-ynodejs
Node.JSv.4
Node.JSv.5
BuildTools
sudoapt-getinstall-ybuild-essential
ProcessManager2
sudonpm installpm2-g
Node.JSv.4ouv.5auchoix
Installationdebase:Node.js/PM2/NginxsurUbuntu14.04LTS
Nginx
sudoadd-apt-repositoryppa:nginx/stable
sudoapt-getupdate
sudoapt-getinstallnginx
Attacherundiskenoption
Initialiserledisque
sudofdisk/dev/sdc
n
p
1
“ENTER”
“ENTER”
pp
w
sudomkfs-text4/dev/sdc1
sudofdisk-l
sudomkdir/drive1
sudomount/dev/sdc1/drive1
sudo-iblkid
Récupérerl’uuidetinjecterledans/etc/fstab
sudonano/etc/fstab
Cas1:Undossierpardisque
Monterledisquesurundossier(ycomprislorsd’unreboot)
Pourtester:
sudoumount/drive1
sudomount/drive1
df-h
“CTRL+O”:enregistrer
“CTRL+X”:quitter
RajouteraprèslapremièreligneUUID:
UUID=cdda2a63-a89f-4b98-874d-c69b26c9907a /drive1 ext4 defaults 12
Cas2:Undossierpourplusieursdisques
UtilisationdeMHDDFS
sudoapt-getinstallmhddfs
mkdir/virtual1
mhddfs/dev/sdc1,/mnt/sdd1,/virtual1-oallow_other
MHDDFSaudémarrage
sudonano/etc/fstab
Rajouteràlafindufichierfstab:
mhddfs#/dev/sdc1,/mnt/sdd1,/virtual1-fuseallow_other00
Créerledossieretchangerlesdroitspourl’accèsSFTP
cd/drive1
sudomkdirwww
sudochown-Rusername:username./www
ConnexionenSFTPdelamêmemanièrequesurPutty
Ledossierestaccessibleenécrituresur/drive1/www pourl’utilisateurusername
ConfigurerNginxcommeProxypourvosprocessNode.JS
sudorm /etc/nginx/sites-enabled/default
sudonano/etc/nginx/sites-available/mon_site
server{
server_namedomain.cloudapp.net;
listen80;
location/{
proxy_set_headerX-Real-IP$remote_addr;
proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;
pproxy_set_headerHost$http_host;
proxy_set_headerX-NginX-Proxytrue;
proxy_passhttp://127.0.0.1:3000;
proxy_redirectoff;
}
}
sudoln-s/etc/nginx/sites-available/mon_site/etc/nginx/sites-enabled
RedémarrerNginx,lancerleprocessNodeetouvrirlesports80et443pourl’HTTPS
sudoservicenginxreload
cd/drive1/www
sudonpm install
sudopm2startbin/www--nameapp1
“npm install”unefoisvotreapplicationdeployée
surledossierwww viagit,sftpouautre
Où“bin/www”correspondauprocessnode,
iciceluiduframeworkExpress.jsenversion4
Lescriptencasderedémarrage,notammentlorsdemaintenance!
sudonano/etc/init.d/init
#!/bin/sh
/drive1/init.sh
sudochmodugo+x/etc/init.d/init
sudoupdate-rc.dinitdefaults
sudonano/drive1/init.sh
#!/bin/bash
sudo-uusernamesudopm2start/drive1/www/bin/www--nameapp1
sudochmoda+x/drive1/init.sh
Sanscetteopération,vousdevrezredémmarervosprocessmanuellementsurchaquemachine,
lorsd’uncrashmachineoulorsd’unemaintenanceAzure!
Sansle-uusernameun“sudosu”serarequispouraccéder
àPM2(ProcessManager2)
MongoDBenlocal-Ubuntu14.04LTS
sudoapt-keyadv--keyserverhkp://keyserver.ubuntu.com:80--recvEA312927
echo"debhttp://repo.mongodb.org/apt/ubuntutrusty/mongodb-org/3.2multiverse"|sudotee/etc/apt/sources.list.d/mongodb-org-3.2.list
sudoapt-getupdate
sudoapt-getinstall-ymongodb-org
ConfigurerMongoDBsurledisqueattaché!
cd/drive1
sudomkdirdb
sudomkdir./db/data
sudomkdir./db/log
sudochown-Rmongodb:mongodb./db
sudonano/etc/mongod.conf
RemplacerdbPathdansstorage:
RemplacerpathdanssystemLog:
/drive1/db/data
/drive1/db/log/mongod.log
Puisredémarrermongodb:
sudoservicemongodrestart
Sitoutestok,vousverrezapparaître
lefichiermongod.logdansdb/log
L’unionfaitlaforce
LechoixduPAASouduIAASdépenddelaspécificitédechaqueprojet.
MicrosoftAzuremetàdispositiontouslesoutilsnécessairespourcréer
unéquilibreentrelesdeux.
Àvousdejouer!
Conclusion
Merci

[GAB2016] NodeJS dans Azure - Matthieu Bouilloux