{"id":197,"date":"2019-10-19T10:28:07","date_gmt":"2019-10-19T08:28:07","guid":{"rendered":"https:\/\/jochem.jochemenbianca.nl\/?p=197"},"modified":"2019-10-19T10:30:41","modified_gmt":"2019-10-19T08:30:41","slug":"haproxy-als-reverse-proxy-met-multiple-domains","status":"publish","type":"post","link":"https:\/\/jochem.jochemenbianca.nl\/?p=197","title":{"rendered":"HAProxy als reverse proxy met multiple subdomains"},"content":{"rendered":"<p>In 1 van mijn vorige blogs heb ik een Ansible role aangemaakt voor het installeren van een HAProxy. Met HAProxy kun je een systeem bouwen waarin een website of een tcp stream geproxied en\/of geloadbalanced kan worden.<br \/>\nHet wordt pas ingewikkeld als je meerdere websites met zowel http als https wil gaan proxien, waarbij er gebruik wordt gemaakt van een wildecard certificaat.<br \/>\nToch is dat met HAProxy prima te doen. Je kunt er zelfs dan ook een loadbalancer aanhangen. De onderstaande <a href=\"https:\/\/jochem-test.jochemenbianca.nl\/wp-content\/uploads\/2019\/10\/haproxy.cfg_.txt\">haproxy.cfg<\/a> laat zien hoe je dat kan doen:<\/p>\n<pre>#---------------------------------------------------------------------\r\n# Global settings\r\n#---------------------------------------------------------------------\r\nglobal\r\n    # to have these messages end up in \/var\/log\/haproxy.log you will\r\n    # need to:\r\n    #\r\n    # 1) configure syslog to accept network log events.  This is done\r\n    #    by adding the '-r' option to the SYSLOGD_OPTIONS in\r\n    #    \/etc\/sysconfig\/syslog\r\n    #\r\n    # 2) configure local2 events to go to the \/var\/log\/haproxy.log\r\n    #   file. A line like the following can be added to\r\n    #   \/etc\/sysconfig\/syslog\r\n    #\r\n    #    local2.*                       \/var\/log\/haproxy.log\r\n    #\r\n    log         127.0.0.1 local2\r\n\r\n    chroot      \/var\/lib\/haproxy\r\n    pidfile     \/var\/run\/haproxy.pid\r\n    maxconn     4000\r\n    user        haproxy\r\n    group       haproxy\r\n    daemon\r\n\r\n    # turn on stats unix socket\r\n#    stats socket \/var\/lib\/haproxy\/stats\r\n\r\n#---------------------------------------------------------------------\r\n# common defaults that all the 'listen' and 'backend' sections will\r\n# use if not designated in their block\r\n#---------------------------------------------------------------------\r\ndefaults\r\n    mode                    http\r\n    log                     global\r\n    option                  httplog\r\n    option                  dontlognull\r\n    option http-server-close\r\n    option forwardfor       except 127.0.0.0\/8\r\n    option                  redispatch\r\n    retries                 3\r\n    timeout http-request    10s\r\n    timeout queue           1m\r\n    timeout connect         10s\r\n    timeout client          1m\r\n    timeout server          1m\r\n    timeout http-keep-alive 10s\r\n    timeout check           10s\r\n    maxconn                 3000\r\n#---------------------------------------------------------------------\r\n# Enable stats http:\/\/192.168.1.1:55555\/haproxy?stats\r\n#---------------------------------------------------------------------\r\nlisten  stats   192.168.1.1:55555\r\n        mode            http\r\n        log             global\r\n\r\n        maxconn 10\r\n\r\n        clitimeout      100s\r\n        srvtimeout      100s\r\n        contimeout      100s\r\n        timeout queue   100s\r\n\r\n        stats enable\r\n        stats hide-version\r\n        stats refresh 30s\r\n        stats show-node\r\n        stats auth admin:ChangeThisPassword\r\n        stats uri  \/haproxy?stats\r\n\r\n#--------------------------------------------------------------------\r\n# https frontend\r\n#--------------------------------------------------------------------\r\n\r\nfrontend https-in\r\n    bind *:443 ssl crt \/etc\/ssl\/fullchain.pem\r\n    acl host_s_server1_local_net hdr(host) -i server1.local.net\r\n    acl host_s_server2_local_net hdr(host) -i server2.local.net\r\n    acl host_s_server3_local_net hdr(host) -i server3.local.net\r\n\r\n    use_backend s.server1.local.net if host_s_server1.local.net\r\n    use_backend s.server2.local.net if host_s_server2.local.net\r\n    use_backend s.server3.local.net if host_s_server3.local.net\r\n#-------------------------------------------------------------------- \r\n# http frontend \r\n#-------------------------------------------------------------------- \r\n\r\nfrontend http-in\r\n    bind *:80\r\n    acl host_server1_local_net hdr(host) -i server1.local.net\r\n    acl host_server2_local_net hdr(host) -i server2.local.net  \r\n    acl host_server3_local_net hdr(host) -i server3.local.net\r\n    \r\n    use_backend server1.local.net if host_server1_local_net\r\n    use_backend server2.local.net if host_server2_local_net\r\n    use_backend server3.local.net if host_server3_local_net\r\n#---------------------------------------------------------------------\r\n# round robin balancing between the various backends\r\n#---------------------------------------------------------------------\r\n\r\n\r\n# server1\r\n\r\nbackend s.server1.local.net\r\n    mode http\r\n    balance\troundrobin\r\n    option \thttpclose\r\n    option \tforwardfor\r\n    server      server1.local.net1 server1.local.net:443 check ssl verify none\r\n\r\nbackend server1.local.net\r\n    mode http\r\n    balance\troundrobin\r\n    server      server1.local.net1 server1.local.net:80 check\r\n\r\n# server2\r\n\r\nbackend s.server2.local.net\r\n    mode http\r\n    balance roundrobin\r\n    option  httpclose\r\n    option  forwardfor\r\n    server  server2.local.net1 server2.local.net:443 check ssl verify none\r\n\r\nbackend server2.local.net\r\n    mode    http\r\n    balance roundrobin\r\n    server  server2.local.net1 server2.local.net:80 check\r\n\r\n# server3\r\n\r\nbackend s.server3.local.net\r\n    mode http\r\n    balance roundrobin\r\n    option  httpclose\r\n    option  forwardfor\r\n    server  server3.local.net1 server3.local.net:443 check ssl verify none\r\n\r\nbackend server3.local.net\r\n    mode    http\r\n    balance roundrobin\r\n    server  server3.local.net1 server3.local.net:80 check\r\n<\/pre>\n<p>Hierbij zetten we de wildcard in de fullchain.pem file en daar stoppen we dus de fullchain in (key en certificaten). Wel moet je nog een aantal aanpssingen doen. Aangezien we graag statistieken willen hebben gaan we eerst dit onderdeel aanpassen:<br \/>\nRegel 54: Achter listen passen wehet ip adres aan van de haproxy server<br \/>\nRegel 69: We passen de inlognaam en het wachtwoord aan om toegang te krijgen tot de stats<\/p>\n<p>Hierna kun je onder https frontend en http frontend de host namen aanpassen.<\/p>\n<pre>acl host_s_server1_local_net hdr(host) -i server1.local.net<\/pre>\n<p>Dit betekend dat als server1.local.net in de header als host staat we gebruik gaan maken van de variable host_s_server1_local_net<\/p>\n<pre>use_backend s.server1.local.net if host_s_server1.local.net<\/pre>\n<p>Dit betekend dat we vanaf de frontend gebruik gaan maken van backend s.server1.local.net, als de variable host_s_server1.local.net gebruikt wordt. Hiermee sturen we dus feitelijk de server van de frontend naar de backend.<\/p>\n<pre># server1\r\n\r\nbackend s.server1.local.net\r\n    mode http\r\n    balance roundrobin\r\n    option  httpclose\r\n    option  forwardfor\r\n    server      server1.local.net1 server1.local.net:443 check ssl verify none\r\n\r\nbackend server1.local.net\r\n    mode http\r\n    balance roundrobin\r\n    server      server1.local.net1 server1.local.net:80 check\r\n<\/pre>\n<p>Dit is het backend gedeelte welke we voor elke host 1 aanmaken. Het eerste gedeelte is de forward via https, het tweede gedeelte via http.<br \/>\nZoals je kunt zien staat ook de loadbalancer aan (roundrobin). Dit is om in de toekomst ook nog te kunnen load balancen. Dit kunnen we doen door zowel in het http als in het https gedeelte een nieuwe server toe te voegen.<br \/>\nVoor https:<\/p>\n<pre>server      server1.local.net2 server1b.local.net:443 check ssl verify none<\/pre>\n<p>Voor http:<\/p>\n<pre>server      server1.local.net2 server1b.local.net:80 check<\/pre>\n<p>Als je alles ingesteld hebt kun je haproxy starten.<br \/>\nAls je bovenstaande config zou gebruiken kun je vervolgens de statistieken vinden op:<br \/>\n<a href=\"http:\/\/192.168.1.1:55555\/haproxy?stats\">http:\/\/192.168.1.1:55555\/haproxy?stats<\/a> en daarna inloggen met de gegevens zoals ze in de configfile staan.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In 1 van mijn vorige blogs heb ik een Ansible role aangemaakt voor het installeren van een HAProxy. Met HAProxy kun je een systeem bouwen waarin een website of een tcp stream geproxied en\/of geloadbalanced kan worden. Het wordt pas ingewikkeld als je meerdere websites met zowel http als https [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-197","post","type-post","status-publish","format-standard","hentry","category-open-source"],"_links":{"self":[{"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/posts\/197","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=197"}],"version-history":[{"count":4,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/posts\/197\/revisions"}],"predecessor-version":[{"id":202,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/posts\/197\/revisions\/202"}],"wp:attachment":[{"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=197"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=197"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}