Configuration haproxy avec configuration de sous-domaine

8

En espérant que quelqu'un puisse aider à confirmer si cela suppose de fonctionner? J'essaie d'acheminer 3 trafic de sous-domaine vers le même hôte haproxy;

Voici ma configuration

haproxy avec une interface ip 10.10.10.100 et nom DNS haproxy01.mydomain.com

3 enregistrements CNAME qui lui sont associés; sub1.mydomain.com, sub2.mydomain.com et sub3.mydomain.com

tout le trafic entrant est destiné au port 443.

Il existe deux serveurs d'applications principaux qui acceptent le trafic sur trois ports 8081, 8082, 8083, disons;

sub1.mydomain.com pour 8081 sub2.mydomain.com pour 8082 et sub3.mydomain.com pour 8083

L'application nécessite un passage SSL pour le trafic du port 8081 uniquement, je pense donc que je dois utiliser le mode tcp pour cela, l'autre trafic pour 8082 et 8083 est également SSL, mais il peut être terminé au Haproxy, mais pour les tests, je suis allé avec tous les TCP mode.

Ma section de configuration pour y parvenir est ci-dessous;

    #Application Setup 
frontend mytraffic
    bind *:443
    mode  tcp
    acl host_sub1 hdr(host) -i sub1.mydomain.com
    acl host_sub2 hdr(host) -i sub2.mydomain.com
    acl host_sub3 hdr(host) -i sub3.mydomain.com

    use_backend sub1_nodes if host_sub1
    use_backend sub2_nodes if host_sub2
    use_backend sub3_nodes if host_sub3

    option tcplog backend sub1_nodes
    mode tcp
    balance roundrobin
    stick-table type ip size 200k expire 30m
    stick on src
    server node1 10.10.10.101:8081 check
    server node2 10.10.10.102:8081 check 
backend sub2_nodes
    mode tcp
    balance roundrobin
    stick-table type ip size 200k expire 30m
    stick on src
    server node1 10.10.10.101:8082 check
    server node2 10.10.10.102:8082 check 
backend sub3_nodes
    mode tcp
    balance roundrobin
    stick-table type ip size 200k expire 30m
    stick on src
    server node1 10.10.10.101:8083 check
    server node2 10.10.10.102:8083 check


    # APPLICATION SETUP END

Lorsque j'essaie d'accéder aux serveurs d'applications via HAproxy, par exemple pour le trafic 8082, il lance ce sont les journaux;

haproxy localhost [6097]: xxxx: 51241 [20 / mars / 2015: 12: 19: 38.720] mytraffic mytraffic / -1 / -1 / 0 0 SC 0/0/0/0/0 0/0

apprécier une certaine direction concernant cette configuration.

PS Je ne peux pas intégrer d'image pour plus de clarté ici car c'est mon premier post :-(

Apprentissage global
la source
le message du journal n'était pas complet; 20 mars 12:19:38 haproxy localhost [6097]: xxxx: 51241 [20 / mars / 2015: 12: 19: 38.720] mytraffic mytraffic / <NOSRV> -1 / -1 / 0 0 SC 0/0/0 / 0/0 0/0
Global Learning
NOSRV signifie qu'il n'a pas pu trouver de backend approprié. Pouvez-vous accéder à la page de statistiques ou au socket et voir quels backends HAproxy pense être en place?
Jim G.20
Vérifiez également s'il existe une connectivité entre haproxy et les serveurs d'applications. Si vous utilisez nc: nc -v 10.10.10.101 8081, nc -v 10.10.10.102 8081, etc.
hdanniel
La dernière vérification du tableau de bord de surveillance haproxy signale tous les nœuds. J'ai également confirmé la connectivité de la console Haproxy à ces serveurs d'applications sur tous les ports.
Global Learning
@HD oui, la connectivité est correcte sur les deux nœuds.
Global Learning

Réponses:

11

Avec le mode TCP, HAProxy ne décodera pas la requête HTTP, donc vos acllignes ne feront rien et le frontend ne pourra jamais correspondre à un backend, comme le montrent les journaux que vous avez entrés: mytraffic/<NOSRV>signifie qu'il n'a pas pu choisir un backend ou serveur.

Vous devez diviser les 3 sous-domaines en 2 frontaux différents, chacun avec ses propres adresses IP car ils se connectent tous sur le port 443. L'un pour le passage, l'autre pour la terminaison SSL et la commutation de contenu à l'aide mode http. La mise en garde ici étant que si vous deviez ajouter un 4ème sous-domaine (sub4.mydomain.com) qui nécessitait également un passthrough, vous auriez alors besoin d'un 3ème frontend et d'une IP.

Vous devez également créer différents enregistrements CNAME ou A dans DNS afin que les bons sous-domaines pointent vers les bonnes adresses IP.

Compte tenu de cette configuration DNS:

10.10.10.100        A         haproxy01-cs.mydomain.com
10.10.10.101        A         haproxy01-pt1.mydomain.com
10.10.10.102        A         haproxy01-pt2.mydomain.com
sub1.mydomain.com   CNAME     haproxy01-pt1.mydomain.com
sub2.mydomain.com   CNAME     haproxy01-cs.mydomain.com
sub3.mydomain.com   CNAME     haproxy01-cs.mydomain.com
sub4.mydomain.com   CNAME     haproxy01-pt2.mydomain.com

La configuration HAproxy ressemblerait à ceci:

#Application Setup 
frontend ContentSwitching

  bind 10.10.10.100:443
  mode  http
  option httplog
  acl host_sub2 hdr(host) -i sub2.mydomain.com
  acl host_sub3 hdr(host) -i sub3.mydomain.com
  use_backend sub2_nodes if host_sub2
  use_backend sub3_nodes if host_sub3

frontend PassThrough1
  bind 10.10.10.101:443
  mode  tcp
  option tcplog
  use_backend sub1_nodes     

frontend PassThrough2
  bind 10.10.10.102:443
  mode  tcp
  option tcplog
  use_backend sub4_nodes

backend sub1_nodes
  mode tcp
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8081 check
  server node2 10.10.10.102:8081 check 

backend sub2_nodes
  mode http
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8082 check
  server node2 10.10.10.102:8082 check 

backend sub3_nodes
  mode http
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8083 check
  server node2 10.10.10.102:8083 check

backend sub4_nodes
  mode tcp
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8084 check
  server node2 10.10.10.102:8084 check
GregL
la source
En fait, les IP que j'ai ici n'ont aucun sens (j'ai utilisé 10.10.10.101-102 pour les frontaux où vous les avez assignés aux nœuds), mais vous avez une idée de ce à quoi cela ressemblerait.
GregL
@GreL - MERCI. Je vais essayer cela et entouré de résultats. J'étais inquiet du mode tcp et de l'utilisation acl avant de l'utiliser.
Global Learning
Merci GregL. Ça marche. Une dernière question si je peux? pour avoir SSL depuis le client -> haproxy et vers haproxy -> serveur backend (comme s'il pouvait se terminer mais en démarrer un nouveau vers le backend), quelle est la manière recommandée de le faire? passer par SSL avec le mode TCP? La raison pour laquelle je souhaitais le passage pour le trafic du port 8081 est due à l'exigence d'avoir une session mutuellement authentifiée avec l'application et le client. Le reste du trafic des ports 8082 et 8083 nécessite SSL mais il ne nécessite pas d'authentification mutuelle. (en ce moment, je suis allé avec l'approche passthrough).
Global Learning
Eh bien, HAProxy peut effectuer la vérification du certificat client en utilisant les options ca-fileet verify optionalde l' bindinstruction. Si vous faisiez cela, vous pourriez avoir un seul frontend lié à une IP, puis basculer le contenu vers les backends appropriés comme requis par l'en- tête de l' hôte . Pour confirmer que l'authentification mutuelle a fonctionné, vous pouvez créer un type acl acl ClientSSLValid ssl_c_verify 0, puis l'ajouter comme autre condition à la use_backenddéclaration commeuse_backend sub1_nodes if host_sub1 ClientSSLValid
GregL
Il y a des descriptions décentes ici et ici sur la façon de le faire, avec plus de détails que ce que j'ai fourni.
GregL