Trois services web sur un seul serveur avec HAProxy
Apache, c'est super. Les services NodeJS aussi, ou bien en GoLang, tant qu'on y est. Mais tout ce petit monde ne peut pas naturellement cohabiter sur le port 80, à moins de passer par un proxy qui traduira des (sous-)domaines différents en autant de ports locaux (pas le port 80, réservé au proxy). C'est ce que nous allons faire ici avec HAProxy. Apache en 8080 pour tous les domaines par défaut, Go en 8081 sur le domaine golang.domaine.com et NodeJS en 8082 sur le domaine nodejs.domaine.com, par exemple.
Reconfiguration d'Apache
Supposons que Apache est déjà classiquement installé sur le port 80 (valeur par défaut), comme on peut le vérifier aisément dans '/etc/apache2/ports.conf':
NameVirtualHost *:80 Listen 80
Changez-les par:
NameVirtualHost *:8080 Listen 8080
Puis relancez Apache:
service apache2 restart
Installation de HAProxy
L'installation dépendra de votre distribution, par exemple:
Pour la Debian Wheezy
echo "deb http://httpredir.debian.org/debian wheezy-backports main" >> /etc/apt/sources.list.d/backports.list apt-get update apt-get install -t wheezy-backports haproxy
Pour la Debian Jessie
echo "deb http://httpredir.debian.org/debian jessie-backports main" >> /etc/apt/sources.list.d/backports.list apt-get update apt-get install -t jessie-backports haproxy
Pour Ubuntu 16.04 (LTS)
apt-get install haproxy
Configuration de HAProxy
Remplacez simplement le contenu du fichier '/etc/haproxy/haproxy.cfg' par:
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private # Default ciphers to use on SSL-enabled listening sockets. # For more information, see ciphers(1SSL). ssl-default-bind-ciphers kEECDH+aRSA+AES:kRSA+AES:+AES256:RC4-SHA:!kEDH:!LOW:!EXP:!MD5:!aNULL:!eNULL ssl-default-bind-options no-sslv3 defaults log global frontend http-in mode http bind *:80 timeout client 86400000 default_backend www_backend acl acl_golang hdr_end(host) -i golang.domaine.com acl acl_nodejs hdr_end(host) -i nodejs.domaine.com use_backend golang_backend if acl_golang use_backend nodejs_backend if acl_nodejs backend www_backend mode http timeout server 86400000 timeout connect 5000 server www localhost:8080 backend golang_backend mode http timeout server 86400000 timeout connect 5000 server gotracker localhost:8081 backend nodejs_backend mode http timeout server 86400000 timeout connect 5000 server gotracker localhost:8082
Prenez le temps de lire et essayer de comprendre le contenu de ce fichier de configuration, c'est assez facile à lire.
Enfin on relance HAProxy, pour valider les modifications:
/etc/init.d/haproxy restart
Attention, pour ce qui est d'Apache, à ne pas oublier de changer les VHosts pour refléter le changement de port, comme ci-dessous:
<VirtualHost *:8080> DocumentRoot /var/www/whatever ServerName whatever.domain.tld </VirtualHost>
Puis
service apache2 reload
C'est tout, à partir de maintenant golang.domaine.com est géré par le service en GoLang, nodejs.domaine.com par le service en NodeJS, et tous les autres domaines par Apache, et tout ça sur le port 80, bien entendu.