Je développe habituellement en PHP mais me suis mis récemment à NodeJS. Et j’ai découvert que la mise en production d’application nodeJS est un peu plus complexe. Mais soyons honnête, là où j’appréhender des difficultés, il s’avère que ça reste très simple.

NodeJS en production : faire persister le process node avec PM2

En phase de développement, lancer une application node consiste simplement à ouvrir un terminal et à lancer une commande de ce style:

node app.js

ou bien pour avoir des reload automatique, avec nodemon

./node_modules/.bin/nodemon server.js

Mais dès que l’on ferme le terminal, l’application s’arrête. La solution de le lancer dans un screen est une première solution, mais au reboot du serveur ou si pour une raison quelconque screen meurt, l’application nodejs s’arrête.

Pour assurer la survie de mon application, j’utilise donc le package PM2 qui va veiller à maintenir mon application en vie et à la relancer au reboot de mon serveur. Pour l’installer, rien de plus simple:

npm install pm2 -g

PM2: utilisation

  • Lancer une application avec PM2:
    pm2 start app.js

  • Arréter une application avec PM2:

    pm2 stop app.js

  • Relancer une application avec PM2:

    pm2 restart app.js

  • Lister toutes les applis qui tournent avec PM2:

    pm2 list app.js

En aspect pratique, la liste des appli gérée par pm2, leur status et les quelques infos indispensables sont bien clairement présentées dans la console.

pm2-start
pm2-start

Rendre l’application disponible sur votre port 80 avec un reverse proxy Apache

L’application tourne à présent, mais est disponible sur le port que vous aurez configuré (du style http://domain.tld:3001). Pour la rendre disponible via Apache, nous allons faire un reverse proxy: tout ce qui arrivera sur un virtualhost donné avec le port 80 sera redirigé vers l’application node.

Activer les modules apache

On va avoir besoin des modules proxy et proxy_http. Ils sont disponibles avec Apache, mais ne sont pas activés par défaut. Donc au besoin:

a2enmod http
a2enmod http_proxy

Déclarer le virtualhost et le reverse proxy

<VirtualHost *:80>
ServerName my-domain.tld
DocumentRoot "/path/to/node/application"
<Directory "/path/to/node/application">
AllowOverride All
Allow from All
</Directory>
ProxyRequests off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
<Location />
ProxyPass http://localhost:3001/
ProxyPassReverse http://localhost:3001/
</Location>
</VirtualHost>

Autres pistes

Il existe des alternatives à pm2 comme forever lui aussi très utilisé et pas plus compliqué que pm2.

J’ai décrit la démarche avec Apache pour des raisons pragmatiques (je le connais bien et c’est ce que j’ai sur la majorité de mes serveurs), mais la même chose est réalisable avec nginx et est à priori plus performant.