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.