HAProxy: Difference between revisions

From Linux Wiki
Jump to navigation Jump to search
 
(33 intermediate revisions by the same user not shown)
Line 68: Line 68:
</code>
</code>


* *bind :80 – ascultă pe portul 80.
* bind *:80 – ascultă pe portul 80.
* mode http – procesează header-ele HTTP.
* mode http – procesează header-ele HTTP.
* option forwardfor – adaugă X‑Forwarded‑For cu IP-ul real al clientului.
* option forwardfor – adaugă X‑Forwarded‑For cu IP-ul real al clientului.
Line 82: Line 82:
&#32;&#32;&#32;&#32;server vm01 192.168.14.11:80 check
&#32;&#32;&#32;&#32;server vm01 192.168.14.11:80 check
&#32;&#32;&#32;&#32;server vm02 192.168.14.22:80 check
&#32;&#32;&#32;&#32;server vm02 192.168.14.22:80 check
&#32;&#32;&#32;&#32;server vm03 192.168.14.22:80 check
&#32;&#32;&#32;&#32;server vm03 192.168.14.33:80 check
</code>
</code>


Line 96: Line 96:
==== Generare certificat Let’s Encrypt ====
==== Generare certificat Let’s Encrypt ====


Necesită port 80 public și domeniu valid.
Necesită port 80 public și domeniu valid.<br>
Certbot, în modul <span style="  font-family: Courier New;">--standalone</span>, pornește un mini‑webserver intern pe portul 80 pentru a răspunde la challenge-ul HTTP‑01 de la Let’s Encrypt.
Certbot, în modul <span style="  font-family: Courier New;">--standalone</span>, pornește un mini‑webserver intern pe portul 80 pentru a răspunde la challenge-ul HTTP‑01 de la Let’s Encrypt.<br>
Dacă HAProxy este pornit, acesta ocupă portul 80 și Certbot nu poate porni serverul de validare, ceea ce duce la eșecul generării certificatului.
Dacă HAProxy este pornit, acesta ocupă portul 80 și Certbot nu poate porni serverul de validare, ceea ce duce la eșecul generării certificatului.


Line 140: Line 140:
* mode http – traficul devine HTTP după terminarea SSL.
* mode http – traficul devine HTTP după terminarea SSL.
* default_backend http_webserver – backend-ul HTTP unic.
* default_backend http_webserver – backend-ul HTTP unic.
==== Backend HTTPS (SSL termination) ====
În cazul SSL termination, backend-ul nu procesează trafic HTTPS.<br>
HAProxy decriptează SSL în frontend, iar backend-ul primește trafic HTTP normal (non‑SSL).<br>
De aceea backend-ul este identic cu backend-ul HTTP.
<code class="mw-code mw-highlight plainlinks" style="display:block"><!--
-->&#32;backend http_webserver
&#32;&#32;&#32;&#32;mode http
&#32;&#32;&#32;&#32;balance leastconn
&#32;&#32;&#32;&#32;option httpchk GET /
&#32;&#32;&#32;&#32;server vm01 192.168.14.11:80 check
&#32;&#32;&#32;&#32;server vm02 192.168.14.22:80 check
&#32;&#32;&#32;&#32;server vm03 192.168.14.33:80 check
</code>
* mode http – backend-ul procesează HTTP.
* balance leastconn – trimite traficul către serverul cu cele mai puține conexiuni active.
* option httpchk GET / – health-check HTTP.
* server vm01/vm02/vm03 – cele trei VM.
=== HTTPS (port 443) cu SSL Passthrough ===
Webserver-ul gestionează certificatul. HAProxy doar forward-ează pachetele SSL.
==== Frontend HTTPS (SSL passthrough) ====
<code class="mw-code mw-highlight plainlinks" style="display:block"><!--
-->&#32;frontend https_in
&#32;&#32;&#32;&#32;bind *:443
&#32;&#32;&#32;&#32;mode tcp
&#32;&#32;&#32;&#32;default_backend httpS_webserver
</code>
* *bind :443 – ascultă pe portul 443.
* mode tcp – HAProxy nu decriptează SSL.
* default_backend httpS_webserver – backend separat în modul TCP.
==== Backend HTTPS (SSL passthrough) ====
<code class="mw-code mw-highlight plainlinks" style="display:block"><!--
-->&#32;backend httpS_webserver
&#32;&#32;&#32;&#32;mode tcp
&#32;&#32;&#32;&#32;balance leastconn
&#32;&#32;&#32;&#32;server vm01 192.168.14.11:443 check
&#32;&#32;&#32;&#32;server vm02 192.168.14.22:443 check
&#32;&#32;&#32;&#32;server vm03 192.168.14.33:443 check
</code>
* mode tcp – forward transparent al pachetelor SSL.
* balance leastconn – distribuție inteligentă.
* server vm01/vm02/vm03 – VM-urile ISPConfig.
=== Frontend HTTP (port 80) - ACME Challenge ===
Această secțiune descrie configurarea HAProxy pentru a permite generarea certificatelor Let’s Encrypt în ISPConfig atunci când HAProxy funcționează în modul SSL Passthrough.
Pentru validarea HTTP‑01, traficul către <span style="">/.well-known/acme-challenge/</span> trebuie direcționat către backend-ul HTTP al ISPConfig.
==== Frontend HTTP (ACME Challenge Forwarding) ====
<code class="mw-code mw-highlight plainlinks" style="display:block"><!--
-->&#32;frontend http_in
&#32;&#32;&#32;&#32;bind *:80
&#32;&#32;&#32;&#32;mode http
&#32;&#32;&#32;&#32;acl letsencrypt-acl path_beg /.well-known/acme-challenge/
&#32;&#32;&#32;&#32;use_backend letsencrypt-backend if letsencrypt-acl
&#32;&#32;&#32;&#32;default_backend ispconfig_http
</code>
* acl letsencrypt-acl path_beg - detectăm cererile ACME challenge
* use_backend - Forward ACME challenge către backend-ul dedicat
* default_backend - Restul traficului HTTP merge către backend-ul HTTP normal
==== Backend HTTP (ACME Challenge Forwarding) ====
Backend dedicat pentru Let’s Encrypt.
Acesta trebuie să trimită cererile către portul 80 al serverrelor ISPConfig.
<code class="mw-code mw-highlight plainlinks" style="display:block"><!--
-->&#32;backend letsencrypt-backend
&#32;&#32;&#32;&#32;mode http
&#32;&#32;&#32;&#32;server isp1 192.168.14.11:80 check
&#32;&#32;&#32;&#32;server isp2 192.168.14.22:80 check
&#32;&#32;&#32;&#32;server isp3 192.168.14.33:80 check
</code>
==== Backend HTTP (trafic normal) ====
Backend-ul standard pentru HTTP (port 80), folosit pentru redirectări, panel ISPConfig, sau site-uri HTTP.
<code class="mw-code mw-highlight plainlinks" style="display:block"><!--
-->&#32;backend ispconfig_http
&#32;&#32;&#32;&#32;mode http
&#32;&#32;&#32;&#32;balance roundrobin
&#32;&#32;&#32;&#32;option httpchk GET /
&#32;&#32;&#32;&#32;server isp1 192.168.14.11:80 check
&#32;&#32;&#32;&#32;server isp2 192.168.14.22:80 check
&#32;&#32;&#32;&#32;server isp3 192.168.14.33:80 check
</code>
=== Pagina de statistici HAProxy ===
<code class="mw-code mw-highlight plainlinks" style="display:block"><!--
-->&#32;listen stats
&#32;&#32;&#32;&#32;bind *:9000
&#32;&#32;&#32;&#32;mode http
&#32;&#32;&#32;&#32;stats enable
&#32;&#32;&#32;&#32;stats uri /stats
&#32;&#32;&#32;&#32;stats refresh 5s
&#32;&#32;&#32;&#32;stats auth admin:pass123
</code>
* *bind :9000 – port dedicat pentru statistici.
* stats uri /stats – URL-ul paginii.
* stats auth – autentificare basic HTTP.
==== Accesare pagina de statistici ====
http://192.168.14.123:9000/stats
[[File:HAProxy stats.png|782x616px|none|HAProxy_stats]]
==== Ansible playbook pentru configurare ====
===== Fişiere necesare =====
{| class="responsive-three-cols"
|-
| class="col" style="vertical-align:middle; text-align:center; padding:15px;" |
[[File:Filethumb.png|thumb|right|link=Inventory.ini|Descarcă fișierul de inventar si variabile]]
| class="col" style="vertical-align:middle; text-align:center; padding:15px;" |
[[File:Filethumb.png|thumb|right|link=Haproxy.yaml|Descarcă fișierul de instalare și configurare iniţială]]
| class="col" style="vertical-align:middle; text-align:center; padding:15px;" |
[[File:Filethumb.png|thumb|right|link=Haproxy-conf.yaml|Descarcă fișierul de actualizare a configurării]]
|}
===== Instalarea HAProxy si configurarea primului frontend şi backend =====
<code class="mw-code mw-highlight plainlinks" style="display:block"><!--
-->&#32;# ansible-playbook -i /path/to/Inventory.ini /path/to/Haproxy.yaml
</code>
===== Confingurarea frontend şi backend pentru HAProxy =====
<code class="mw-code mw-highlight plainlinks" style="display:block"><!--
-->&#32;# ansible-playbook -i /path/to/Inventory.ini /path/to/Haproxy-conf.yaml
</code>

Latest revision as of 12:39, 25 July 2026

HAProxy pe Ubuntu 2X.04 LTS[edit | edit source]

HAProxy
HAProxy

Instalare HAProxy[edit | edit source]

La instalare HAProxy activează serviciul systemd. # apt -y install haproxy


Structura fișierului de configurare[edit | edit source]

Fișierul principal: # nano /etc/haproxy/haproxy.cfg

Configurația este împărțită în:

  • global – setări pentru procesul HAProxy
  • defaults – setări implicite pentru toate secțiunile
  • frontend – puncte de intrare pentru trafic
  • backend – serverele către care se trimite traficul

Secțiunea global[edit | edit source]

global log /dev/log local0 log /dev/log local1 notice maxconn 4096 user haproxy group haproxy daemon

  • log /dev/log local0 – trimite logurile către syslog.
  • log /dev/log local1 notice – al doilea canal de log, nivel minim notice.
  • maxconn 4096 – număr maxim de conexiuni simultane.
  • user/group haproxy – rulează cu userul de sistem haproxy.
  • daemon – rulează în background.

Secțiunea defaults[edit | edit source]

defaults log global mode http option httplog option dontlognull timeout connect 5s timeout client 30s timeout server 30s

  • log global – folosește setările din secțiunea global.
  • mode http – modul implicit pentru frontend/backend.*
  • option httplog – loguri detaliate HTTP.
  • option dontlognull – nu loghează conexiuni goale.
  • timeout connect/client/server – limite de timp pentru conexiuni.

* Dacă un frontend sau backend are propriul mode (ex: mode tcp), acesta suprascrie automat valoarea din defaults

Frontend HTTP (port 80)[edit | edit source]

frontend http_in bind *:80 mode http option forwardfor default_backend http_webserver

  • bind *:80 – ascultă pe portul 80.
  • mode http – procesează header-ele HTTP.
  • option forwardfor – adaugă X‑Forwarded‑For cu IP-ul real al clientului.
  • default_backend http_webserver – trimite traficul către backend-ul HTTP.

Backend HTTP[edit | edit source]

backend http_webserver mode http balance leastconn option httpchk GET / server vm01 192.168.14.11:80 check server vm02 192.168.14.22:80 check server vm03 192.168.14.33:80 check

  • mode http – backend-ul procesează HTTP.
  • balance leastconn – trimite traficul către serverul cu cele mai puține conexiuni active.
  • option httpchk GET / – health-check HTTP.
  • server vm01/vm02/vm03 – cele trei VM.

HTTPS (port 443) cu SSL Termination în HAProxy[edit | edit source]

În această situaţie HAProxy gestionează certificatul.

Generare certificat Let’s Encrypt[edit | edit source]

Necesită port 80 public și domeniu valid.
Certbot, în modul --standalone, pornește un mini‑webserver intern pe portul 80 pentru a răspunde la challenge-ul HTTP‑01 de la Let’s Encrypt.
Dacă HAProxy este pornit, acesta ocupă portul 80 și Certbot nu poate porni serverul de validare, ceea ce duce la eșecul generării certificatului.

Instalare certbot

apt -y install certbot

Oprire temporară HAProxy

systemctl stop haproxy

Generare certificat

certbot certonly --standalone -d wiki.stradivart.ro

Creare fișier PEM pentru HAProxy

# mkdir -p /etc/haproxy/certs # cat /etc/letsencrypt/live/wiki.stradivart.ro/fullchain.pem \ /etc/letsencrypt/live/wiki.stradivart.ro/privkey.pem \ > /etc/haproxy/certs/wiki.stradivart.ro.pem # chmod 600 /etc/haproxy/certs/wiki.stradivart.ro.pem

Frontend HTTPS (SSL termination)[edit | edit source]

frontend https_in bind *:443 ssl crt /etc/haproxy/certs/wiki.stradivart.ro.pem mode http option forwardfor default_backend http_webserver

  • *bind :443 ssl crt ... – HAProxy decriptează SSL.
  • mode http – traficul devine HTTP după terminarea SSL.
  • default_backend http_webserver – backend-ul HTTP unic.

Backend HTTPS (SSL termination)[edit | edit source]

În cazul SSL termination, backend-ul nu procesează trafic HTTPS.
HAProxy decriptează SSL în frontend, iar backend-ul primește trafic HTTP normal (non‑SSL).
De aceea backend-ul este identic cu backend-ul HTTP.

backend http_webserver mode http balance leastconn option httpchk GET / server vm01 192.168.14.11:80 check server vm02 192.168.14.22:80 check server vm03 192.168.14.33:80 check

  • mode http – backend-ul procesează HTTP.
  • balance leastconn – trimite traficul către serverul cu cele mai puține conexiuni active.
  • option httpchk GET / – health-check HTTP.
  • server vm01/vm02/vm03 – cele trei VM.

HTTPS (port 443) cu SSL Passthrough[edit | edit source]

Webserver-ul gestionează certificatul. HAProxy doar forward-ează pachetele SSL.

Frontend HTTPS (SSL passthrough)[edit | edit source]

frontend https_in bind *:443 mode tcp default_backend httpS_webserver

  • *bind :443 – ascultă pe portul 443.
  • mode tcp – HAProxy nu decriptează SSL.
  • default_backend httpS_webserver – backend separat în modul TCP.

Backend HTTPS (SSL passthrough)[edit | edit source]

backend httpS_webserver mode tcp balance leastconn server vm01 192.168.14.11:443 check server vm02 192.168.14.22:443 check server vm03 192.168.14.33:443 check

  • mode tcp – forward transparent al pachetelor SSL.
  • balance leastconn – distribuție inteligentă.
  • server vm01/vm02/vm03 – VM-urile ISPConfig.

Frontend HTTP (port 80) - ACME Challenge[edit | edit source]

Această secțiune descrie configurarea HAProxy pentru a permite generarea certificatelor Let’s Encrypt în ISPConfig atunci când HAProxy funcționează în modul SSL Passthrough. Pentru validarea HTTP‑01, traficul către /.well-known/acme-challenge/ trebuie direcționat către backend-ul HTTP al ISPConfig.

Frontend HTTP (ACME Challenge Forwarding)[edit | edit source]

frontend http_in bind *:80 mode http acl letsencrypt-acl path_beg /.well-known/acme-challenge/ use_backend letsencrypt-backend if letsencrypt-acl default_backend ispconfig_http

  • acl letsencrypt-acl path_beg - detectăm cererile ACME challenge
  • use_backend - Forward ACME challenge către backend-ul dedicat
  • default_backend - Restul traficului HTTP merge către backend-ul HTTP normal

Backend HTTP (ACME Challenge Forwarding)[edit | edit source]

Backend dedicat pentru Let’s Encrypt. Acesta trebuie să trimită cererile către portul 80 al serverrelor ISPConfig.

backend letsencrypt-backend mode http server isp1 192.168.14.11:80 check server isp2 192.168.14.22:80 check server isp3 192.168.14.33:80 check


Backend HTTP (trafic normal)[edit | edit source]

Backend-ul standard pentru HTTP (port 80), folosit pentru redirectări, panel ISPConfig, sau site-uri HTTP.

backend ispconfig_http mode http balance roundrobin option httpchk GET / server isp1 192.168.14.11:80 check server isp2 192.168.14.22:80 check server isp3 192.168.14.33:80 check

Pagina de statistici HAProxy[edit | edit source]

listen stats bind *:9000 mode http stats enable stats uri /stats stats refresh 5s stats auth admin:pass123

  • *bind :9000 – port dedicat pentru statistici.
  • stats uri /stats – URL-ul paginii.
  • stats auth – autentificare basic HTTP.

Accesare pagina de statistici[edit | edit source]

http://192.168.14.123:9000/stats

HAProxy_stats
HAProxy_stats


Ansible playbook pentru configurare[edit | edit source]

Fişiere necesare[edit | edit source]
Descarcă fișierul de inventar si variabile
Descarcă fișierul de instalare și configurare iniţială
Descarcă fișierul de actualizare a configurării
Instalarea HAProxy si configurarea primului frontend şi backend[edit | edit source]

# ansible-playbook -i /path/to/Inventory.ini /path/to/Haproxy.yaml

Confingurarea frontend şi backend pentru HAProxy[edit | edit source]

# ansible-playbook -i /path/to/Inventory.ini /path/to/Haproxy-conf.yaml