Debian 8 + Haproxy + certificat SSL Let’s Encrypt

Allez hop, on continue cette fois-ci avec nos serveurs que l’on souhaite accessibles en https.

On va sécuriser la lien entre notre HAproxy et les serveurs de nos backends.

thierry-bugeat-haproxy-nossl

Installer le package certbot (https://certbot.eff.org/#debianjessie-haproxy)

Pour Debian 8 Jessie, nous devons ajouter le dépôt des backports en ajoutant la ligne suivante à notre fichier « /etc/apt/sources.list »

deb http://httpredir.debian.org/debian jessie-backports main contrib non-free

Avant de pouvoir installer certbot.

apt-get update
apt-get install certbot -t jessie-backports

Obtenir notre certificat

A la racine de notre site web (Exemple: « /var/www/thierry.bugeat.com »), nous créons un dossier « .well-known ». Le serveur web doit être configuré pour accepter toutes les requêtes à destination de ce dossier.

Nous pouvons maintenant demander un certificat pour notre nom de domaine « thierry.bugeat.com »…

certbot certonly --webroot -w /var/www/thierry.bugeat.com/ -d thierry.bugeat.com

Vous devez saisir un email…

thierry-bugeat-lets-encrypt

…puis accepter les termes et conditions.

Si tout s’est bien déroulé, le message suivant s’affiche et votre certificat se trouve maintenant dans le dossier « /etc/letsencrypt/archive/thierry.bugeat.com »

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/XXXXXXXXXX/fullchain.pem. Your cert
   will expire on 2017-06-05. To obtain a new or tweaked version of
   this certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you lose your account credentials, you can recover through
   e-mails sent to XXXXXXXXXX@XXXXXXXXXX.
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:
   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

NB: Vou pouvez demander autant de certificats SSL que de noms de domaines.

...
certbot certonly --webroot -w /var/www/wallabag/web/ -d wallabag.bugeat.com
...

Activation de SSL sur Haproxy:
Préparons nos certificats pour qu’ils puissent être utilisés par Haproxy.

cd /etc/letsencrypt/archive/thierry.bugeat.com && cat cert1.pem privkey1.pem > haproxy.pem 
cd /etc/letsencrypt/archive/wallabag.bugeat.com && cat cert1.pem privkey1.pem > haproxy.pem

Nous pouvons maintenant les utiliser de la façon suivante

...
...
...
# =============
# --- HTTPS ---
# =============

frontend FRONTEND_HTTPS
  mode http
  bind 0.0.0.0:443 \
    ssl \
      crt /etc/letsencrypt/archive/thierry.bugeat.com/haproxy.pem \
      crt /etc/letsencrypt/archive/wallabag.bugeat.com/haproxy.pem
  use_backend BACKEND_HTTP1 if { ssl_fc_sni thierry.bugeat.com }
  use_backend BACKEND_HTTP1 if { ssl_fc_sni wallabag.bugeat.com }
...
...
...

Veuillez noter que les backends utilisés sont les mêmes que pour le HTTP. Nul besoin d’en créer des nouveaux.

Après avoir relancé Haproxy, vous pouvez vous rendre sur votre site en https et constater que la connexion est sécurisé.
thierry-bugeat-haproxy-ssl

Let’s encrypt… mission réussie.

HA Proxy et multiples serveurs http sur le port 80 (Suite et fin)

Pour faire suite à ce magnifique article, voici venir la solution qui va nous permettre de dispatcher nos requêtes http vers le bon serveur en se basant sur le nom de domaine.

On va ajouter des backends à notre configuration haproxy.
Par défaut j’aime avoir un backend par serveur, et un backend de clustering.

# ================
# --- BACKENDS ---
# ================

backend BACKEND_HTTP1
        cookie SERVERID insert indirect nocache
        server TB_001 127.0.0.11:8080 cookie tb001 weight 100 maxconn 100 check

backend BACKEND_HTTP2
        cookie SERVERID insert indirect nocache
        server TB_002 192.168.1.12:8080 cookie tb002 weight 100 maxconn 100 check

backend BACKEND_HTTP
        server TB_001 192.168.1.11:8080 cookie tb001 weight 40 maxconn 100 check
        server TB_002 192.168.1.12:8080 cookie tb002 weight 60 maxconn 100 check

NB: N’oubliez pas de mettre un fichier « check.txt » sur chacun de vos serveurs, et de les faire tourner sur le port 8080

Uns fois haproxy redémarré, vous pouvez vérifier sur la page de stats que tout est bien passé au vert.
thierry-bugeat-haproxy

Il reste maintenant à créer les ACLs pour rediriger nos noms de domaines vers le bon serveur.

# ============
# --- HTTP ---
# ============

listen FRONTEND_HTTP 192.168.1.11:80
        mode http 
        log global
        option  httplog
        stats enable
        stats auth XXXXXXXXXX:XXXXXXXXXX
        balance roundrobin
        option httpclose 
        option forwardfor
        option httpchk HEAD /check.txt HTTP/1.0
        capture request header Host len 20

        acl ACL_CLOUD           hdr(host) -i cloud.bugeat.com   
        acl ACL_THIERRY         hdr(host) -i thierry.bugeat.com 
        acl ACL_WALLABAG        hdr(host) -i wallabag.bugeat.com

        use_backend BACKEND_HTTP2 if ACL_CLOUD   
        use_backend BACKEND_HTTP1 if ACL_THIERRY 
        use_backend BACKEND_HTTP1 if ACL_WALLABAG

        default_backend BACKEND_HTTP

Je pense que cette configuration est suffisemment claire.
On déclare une ACL qui se base sur le nom de domaine…

...
        acl ACL_CLOUD           hdr(host) -i cloud.bugeat.com   
        acl ACL_THIERRY         hdr(host) -i thierry.bugeat.com 
        acl ACL_WALLABAG        hdr(host) -i wallabag.bugeat.com
...

…puis on utilise le backend associé.

...
        use_backend BACKEND_HTTP2 if ACL_CLOUD   
        use_backend BACKEND_HTTP1 if ACL_THIERRY 
        use_backend BACKEND_HTTP1 if ACL_WALLABAG
...

Au final on a 2 serveurs http accessibles au travers de la même IP.

HA Proxy + et multiples serveurs http sur le port 80

Aujourd’hui j’ai une IP publique et je souhaite avoir prochainement des sites webs qui tournent sur des serveurs différents.
La solution, mettre HAProxy en front est dispatcher les requêtes qui arrivent sur le port 80, vers le bon serveur en fonction du nom de domaine demandé.

Donc j’arrête mon serveur Apache (J’aurai juré l’avoir remplacé par Lighttpd !)…

apache2ctl stop

… et je le reconfigure pour qu’il écoute sur le port 8080 en modifiant le fichier « ports.conf »

Listen 8080

… puis je reconfigure mes vhosts…

<VirtualHost *:8080>

… pour finalement le redémarrer…

apache2ctl configtest
apache2ctl restart

… « restart » c’est le mal (!) … « graceful » c’est le bien !
… et vérifie qu’il tourne bien sur le port 8080.

nmap 127.0.0.1
ORT     STATE SERVICE
...
...
8080/tcp open  http-proxy
...
...

Jusqu’ici tout va bien, mais nos sites sont inaccessibles !

Donc étape 2, on installe HAProxy par un petit…

apt-get install haproxy

… puis on l’active au démarrage de la machine en éditant le fichier « /etc/default/haproxy » en y ajoutant…

ENABLED = 1

…puis on le configure au travers du fichier « /etc/haproxy/haproxy.cfg » pour rediriger toutes les requêtes du port 80 vers le port 8080

...
...
# ============
# --- HTTP ---
# ============

listen FRONTEND_HTTP 192.168.1.11:80
        mode http
        log global
        option  httplog
        stats enable
        stats auth XXXXXXXXXX:XXXXXXXXXX
        balance roundrobin
        option httpclose
        option forwardfor
        option httpchk HEAD /check.txt HTTP/1.0
        capture request header Host len 20

        default_backend BACKEND_HTTP1

# ================
# --- BACKENDS ---
# ================

backend BACKEND_HTTP1
        cookie SERVERID insert indirect nocache
        server TB_001 127.0.0.11:8080 cookie tb001 weight 100 maxconn 100 check

…on crée le fichier « check.txt », avec n’importe quel contenu, à la racine de notre serveur web et on (re)démarre…

service haproxy restart

…et comme tout s’est magnifiquement bien passé, tous nos sites sont maintenant revenus en ligne ;)

Superbe tout ça … mais on a absolument pas avancé par rapport au titre de cette article !
Donc … à suivre…

Les logs HAProxy
Si celle-ci ne sont pas disponibles, vérifiez le contenu du fichier « /etc/rsyslog.d/49-haproxy.conf »

# Create an additional socket in haproxy's chroot in order to allow logging via
# /dev/log to chroot'ed HAProxy processes
$AddUnixListenSocket /var/lib/haproxy/dev/log

# Send HAProxy messages to a dedicated logfile
if $programname startswith 'haproxy' then /var/log/haproxy.log
&~

De mon côté j’ai du faire un…

rsyslog service restart

… pour que le fichier soit créé ;)

Magento 2: Fichiers JS, CSS et images manquants

Comme vous pouvez le voir sur cette capture d’écran, après une installation toute fraiche de Magento 2.1.5, une partie des fichiers javascript, css et des images sont manquants !
magento-missing-files
En inspectant la page il est aisé de voir que ces ressources sont chargées à partir du dossier…

/pub/static/frontend/Magento/luma/en_GB/

… qui n’existe pas sur ma machine.
Soit dit en passant ce fameux sous-dossier « en_GB » correspond à la locale que j’ai choisie lors de l’installation.

Après quelques recherches j’en ai conclu qu’il s’agissait là d’un problème de contenu statique non déployé.

Ni une ni deux, j’ai dégainé un script bash pour éviter d’avoir (éventuellement) à ressaisir 3 lignes de code !!!

#!/bin/bash
./chmod.sh
rm -fr pub/static/*
php bin/magento setup:static-content:deploy en_US en_GB
./chmod.sh

et de suite c’est beaucoup mieux…

magento-missing-files.2

Pour le contenu du script « ./chmod.sh » je vous renvoie à l’article précédent

Ha la la Magento … toujours des petites tracasseries lors de l’installation !