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.