← Retour au blog


Tutorial : Comment faire tourner Apache et NodeJs sur le même serveur grâce à NGINX?

Catégorie : Développement Web 

Le problème : j'ai une instance EC2 d'Amazon avec Ubuntu 12 et une installation Wordpress multisite faite par Bitnami tournant sur un serveur Apache (port 80). Je veux utiliser le même serveur pour faire tourner mon site en NodeJs (avec le framework Keystone.js) et je veux qu'il réponde aussi sur le traffic http donc le port 80. J'installe donc un proxy NGINX pour mapper le port 80 sur le port de mon appli NodeJs (en l'occurrence 60001). Mais je ne peux pas faire tourner Apache et Nginx sur le même port. Impossible de lancer les deux services en même temps. Impossible également d'associer 2 ip elastiques à la même instance avec AWS.

La solution : Utiliser NGINX en front pour écouter le traffic web sur le port 80 et mapper mes différents dns sur les différents ports .

Comment faire ?

1.  Tout d'abord, il faut passer Apache sur un autre port que le 80 :

éditer le fichier httpd.conf 

vi /home/bitnami/stack/apache2/conf/httpd.conf

et changer la ligne

Listen 80

en

Listen 60002

Relancer votre server et Apache ce qui donne avec les scripts de Bitnami

sudo /opt/bitnami/ctlscript.sh restart apache

Apache écoutera maintenant sur le port 60002 (le script Bitnami sort un log disant qu'Apache écoute sur le port 80, mais c'est faux, ils ont mis en dure le message). Vous pouvez tester que votre site marche encore en essayant d'ouvrir http://votre_ip:votre_port  par exemple dans mon cas : http://54.194.220.180:60002.

NOTE: Sur AWS, il faut bien attribuer un groupe de sécurité à l'instance dont les ports sont ouverts (par défaut tous les ports autres que http et https sont fermés)

2. Installer NGINX avec un : sudo apt-get install nginx

Configurer NGINX sur le port 80 et ajouter les hôtes pour le site Apache et le site NodeJs :

éditer la conf NGINX :

vi /etc/nginx/sites-available/default

et coller cette conf : 

server {
    listen 80;
    server_name VOTRE_DNS_POUR_LE_SITE_NODEJS;
    location / {
        proxy_pass http://VOTRE_IP_EXTERNE:LE_PORT_DE_VOTRE_SERVEUR_NODEJS;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}


server {
    listen 80;
    server_name VOTRE_DNS_POUR_LE_SITE_APACHE;
    root VOTRE_ROOT_APACHE;
    location / {
        proxy_pass  http:/VOTRE_IP_PUBLIQUE:LE_PORT_DE_VOTRE_SITE_APACHE;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Restartez NGINX : service nginx restart

 Vous avez mappé Apache et NodeJs derrière NGINX, ce qui vous apporte également la puissance du cache static de NGINX. (au final mes 2 sites sont plus rapides que lorsque je n'avais pas NGINX!)

 A NOTER : Sur mon install Multisite Wordpress de Bitnami, les fichiers httpd.conf sont impriqués les uns dans les autres et j'ai dû mettre à jour tous les documentRoot pour les faire pointer vers le bon dosser de Wordpress.