Node.js et Apache

Node.js est un ensemble de bibliothèques JavaScript avec lesquelles ont peut développer un serveur et utiliser des fonctionnalités sous formes de paquets via NPM.

Un serveur Node.js écoute les requêtes sur un port spécifique du serveur sur lequel il est lancé.

On peut utiliser Node.js pour développer une API RESTful (Interface de programmation fonctionnant avec un modèle d’URL de requêtes défini) en parallèle d’une application client.

On a donc deux applications sur le serveur : l’API et l’application client.

Pour faire fonctionner ces applications ensemble on a plusieurs possibilités :

Utilisation des ports

Le client est accessible par les ports standards (80 pour le HTTP et 443 pour le HTTPS) et l’API est accessible sur le même domaine par le port défini lors de son développement.

Ce mode de fonctionnement ne nécessite pas beaucoup de réglages mais a pour inconvénient d’utiliser un port non standard ce qui risque de poser des problèmes si le réseau est sécurisé et n’accepte que les ports standards.

Utilisation des sous domaines

Le clients et l’API étant disponibles sur deux domaines différents on peut utiliser les ports standards mais nous avons un sous domaine à gérer en plus du domaine principal.

Utilisation d’un proxy (serveur mandataire)

Un proxy permet de rediriger les requêtes vers un autre serveur ou un autre port du serveur en fonction de l’URL. Cette solution est idéale car elle n’utilise qu’un seul domaine et les ports d’entrée standards.

Le proxy Apache

Un proxy est un serveur mandataire s’intercalant entre le client et le serveur.

Il existe deux types de fonctionnement pour le proxy Apache :

Proxy direct

Il se place entre le client et le serveur correspondant au virtual host et permet par exemple de contrôler les accès à ce serveur ou bien d’utiliser un système de cache.

Proxy inverse

Le proxy inverse permet de rediriger les requêtes du client vers un autre serveur en fonction de l’URL de la requête entrante.

C’est ce type de proxy que nous allons utiliser.

Configuration du virtual host

Prérequis:

  • Un virtual host configuré pour écouter le port HTTP ou HTTPS.

  • Une application Node.js écoutant sur le port 60 000 (le choix du port est arbitraire. Pour minimiser les sources de conflits il est recommandé d’utiliser un port non définis)

  • L’accès à l’API se fait en ajoutant /api à l’URL du client.

Activation des modules nécessaires au fonctionnement du proxy en HTTP:

sudo a2enmod proxy
sudo a2enmod proxy_http

En HTTPS le proxy fait partie du module SSL déjà activé.

Ajout de la directive permettant de conserver les en têtes de la requêtes (header) pour le serveur final:

ProxyPreserveHost On

Ajout des directives permettant de rediriger les requêtes en fonction de l’URL:

ProxyPass /api https://127.0.0.1:60000
ProxyPassReverse /api https://127.0.0.1:60000

L’adresse IP 127.0.0.1 correspond au localhost.

Redémarrage d’Apache:

sudo service apache2 reload

Et voilà !