Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
server:haproxy [2018/07/12 22:39]
st [Links]
server:haproxy [2018/08/28 20:02] (aktuell)
st [Konfiguration aufteilen]
Zeile 1: Zeile 1:
 ====== haproxy ====== ====== haproxy ======
  
 +haproxy ist ein [[server:​Load-balancing|Load-Balancer]] der in der '​Programmiersprache C geschrieben ist. Er wird aufgrund seiner Performanz von großen Webseiten eingesetzt.
  
 +:!: Diese Seite bezieht sich auf haproxy version 1.7.
  
 ===== Links ===== ===== Links =====
  
   * [[http://​www.haproxy.org/​|haproxy.org]]   * [[http://​www.haproxy.org/​|haproxy.org]]
-  * [[https://​cbonte.github.io/​haproxy-dconv/​1.8/​configuration.htm|Dokumentation]]+  ​* [[https://​jve.linuxwall.info/​ressources/​taf/​haproxy-aws/​|Guidelines for HAProxy termination in AWS]] 
 +  ​* [[https://​cbonte.github.io/​haproxy-dconv/​1.7/​configuration.htm|1.7 Dokumentation]] 
 +  * [[https://​www.digitalocean.com/​community/​tutorials/​how-to-use-haproxy-to-set-up-http-load-balancing-on-an-ubuntu-vps|How To Use HAProxy to Set Up HTTP Load Balancing on an Ubuntu VPS]] 
   * http://​badberg-online.com/​2017/​05/​01/​haproxy-mit-mehreren-domains-und-ssl/​   * http://​badberg-online.com/​2017/​05/​01/​haproxy-mit-mehreren-domains-und-ssl/​
   * http://​www.fromdual.com/​making-haproxy-high-available-for-mysql-galera-cluster   * http://​www.fromdual.com/​making-haproxy-high-available-for-mysql-galera-cluster
  
 +===== Grundlagen =====
  
-===== SNI =====+  * global: Grundlegende Einstellungen die übergreifend gelten 
 +  * defaults: vordefiniterte Einstellungen falls nicht explizit angegeben 
 +  * frontend: client -> haproxy 
 +  * backend: haproxy -> Server/​node 
 +  * acls: 
  
-FIXME testen, Quelle: https://​stuff-things.net/​2016/​11/​30/​haproxy-sni/​+===== Konfiguration =====
  
 +Eine Beispiel-Webapp "​WEBAPP1",​ drei Server/​nodes (10.0.0.1, 10.0.0.2, 10.0.0.3), ein SSL-Bundle liegt in /​etc/​ssl/​private/​WEBAPP1-certbundle-crt-chain-and-privkey.pem .
  
 <​file>​ <​file>​
-frontend ​https +# Sample Config für haproxy 1.7.x - see documentation: ​https://​cbonte.github.io/​haproxy-dconv/​1.7/​configuration.html 
-  ​bind *:443 ssl +global 
-  mode tcp +  ​log /​dev/​log ​ local0 
-  ​tcp-request inspect-delay 5s +  ​log /​dev/​log ​ local1 notice 
-  ​tcp-request content accept if { req_ssl_hello_type 1 }+  chroot /​var/​lib/​haproxy 
 +  stats socket /​run/​haproxy/​admin.sock ​mode 660 level admin 
 +  ​stats timeout 30s 
 +  ​user haproxy 
 +  group haproxy 
 +  daemon
  
-  ​use_backend app1-servers if { ssl_fc_sni ​-i app1.example.com } +  ​# Default SSL material locations 
-  ​use_backend app2-servers ​if { ssl_fc_sni ​-i app2.example.com } +  ca-base /​etc/​ssl/​certs 
-  ​use_backend app3-servers ​if { ssl_fc_sni ​-i app3.example.com }+  crt-base /​etc/​ssl/​private 
 + 
 +  # default ciphers client <-> haproxy 
 +  ssl-default-bind-ciphers EECDH+ECDSA+AESGCM:​EECDH+aRSA+AESGCM:​EECDH+ECDSA:​EECDH:​EDH+AESGCM:​EDH:​ECDH+AESGCM:​ECDH+AES:​ECDH:​HIGH:​MEDIUM:​!RC4:​!3DES:​!CAMELLIA:​!SEED:​!aNULL:​!MD5:​!eNULL:​!LOW:​!EXP:​!DSS:​!PSK:​!SRP 
 +  # default ciphers haproxy <-> server 
 +  ssl-default-server-ciphers EECDH+ECDSA+AESGCM:​EECDH+aRSA+AESGCM:​EECDH+ECDSA:​EECDH:​EDH+AESGCM:​EDH:​ECDH+AESGCM:​ECDH+AES:​ECDH:​HIGH:​MEDIUM:​!RC4:​!3DES:​!CAMELLIA:​!SEED:​!aNULL:​!MD5:​!eNULL:​!LOW:​!EXP:​!DSS:​!PSK:​!SRP 
 +  ssl-default-bind-options no-sslv3 no-tls-tickets 
 +  # SSL DH 2048 (default is 1024 but with warning): 
 +  tune.ssl.default-dh-param 2048 
 + 
 + 
 +defaults 
 +  log   ​global 
 +  mode  http 
 +  option ​       httplog 
 +  option ​       dontlognull 
 + 
 +  timeout connect 5000ms 
 +  retries 2 
 +  timeout client 10000ms 
 +  timeout server 10000ms 
 +  timeout queue 60000ms 
 +  ​timeout http-request 15000ms 
 +  timeout http-keep-alive 15000ms 
 +  # assign client to other node if his current node dies: 
 +  option redispatch 
 +  # insert X-Forwarted-For-Header with client-IP:​ 
 +  option forwardfor 
 +  # close server-conn,​ but leave client-facing conn open ( https://​cbonte.github.io/​haproxy-dconv/​1.8/​configuration.html#​option%20http-server-close ): 
 +  ​option http-server-close 
 + 
 +  errorfile 400 /​etc/​haproxy/​errors/​400.http 
 +  errorfile 403 /​etc/​haproxy/​errors/​403.http 
 +  errorfile 408 /​etc/​haproxy/​errors/​408.http 
 +  errorfile 500 /​etc/​haproxy/​errors/​500.http 
 +  errorfile 502 /​etc/​haproxy/​errors/​502.http 
 +  errorfile 503 /​etc/​haproxy/​errors/​503.http 
 +  errorfile 504 /​etc/​haproxy/​errors/​504.http 
 + 
 +  #frontend WEBAPP1-http 
 +  #  bind *:80 
 +  #  default_backend WEBAPP1 
 +  # 
 +  #frontend WEBAPP1-https 
 +  #  bind *:443 ssl crt /​etc/​ssl/​private/​WEBAPP1-certbundle-crt-chain-and-privkey.pem 
 +  #  default_backend WEBAPP1 
 +  #  # HSTS: 
 +  #  rspadd Strict-Transport-Security:​\ max-age=31536000 
 + 
 +frontend WEBAPP1-http-with-redirect-to-https 
 +  bind *:80 
 +  bind *:443 ssl crt /​etc/​ssl/​private/​WEBAPP1-certbundle-crt-chain-and-privkey.pem 
 +  # Redirect ​if HTTPS is *not* used 
 +  redirect scheme https code 301 if !ssl_fc } 
 +  # HSTS: 
 +  rspadd Strict-Transport-Security:​\ max-age=31536000  
 + 
 +  # haproxy stats: 
 +  stats enable 
 +  stats uri /​haproxy?​stats 
 +  stats realm haproxy 
 +  stats auth MEIN_BENUTZER:​GEHEIMES_Passwort 
 +  # stats auth Another_User:​passwd 
 +   
 +  default_backend WEBAPP1 
 + 
 + 
 +backend WEBAPP1 
 +  balance roundrobin 
 +      # other options: static Round Robin (static-rr), Least Connections (leastconn),​ Source (source), URI (uri) and URL parameter (url_param). 
 +  # "​maxconn 200" limits simultaneous requests to 200, see: https://​www.haproxy.com/​de/​blog/​play_with_maxconn_avoid_server_slowness_or_crash/​ 
 +  server node1 10.0.0.1:80 check maxconn 200 
 +  server node2 10.0.0.2:80 check maxconn 200 
 +  server node3 10.0.0.3:80 check maxconn 200 
 + 
 +  # Nodes with SSL and verification of SSL-Traffic (possible: none|all) 
 +  # server node1 10.0.0.1:​443 check ssl verify all maxconn 200 
 +  # server node2 10.0.0.2:​443 check ssl verify all maxconn 200 
 +  # server node3 10.0.0.1:​443 check ssl verify all maxconn 200
 </​file>​ </​file>​
  
-==== fallback für nicht-SNI Clients ​====+ 
 + 
 +==== Konfiguration aufteilen ==== 
 + 
 +die haproxy.conf mit allen Einstellungen ist nicht ideal für die Automatisierung,​ [[https://​stackoverflow.com/​questions/​22219479/​haproxy-backend-with-subdirectory-subpath-subfolder|Es gibt einen Haufen unelegante Lösungen]]. 
 +Aber eigentlich ist die Sache ganz einfach, der Parrameter -f nimmt auch Verzeichnisse die dann *.cnf-Datei enthalten dürfen (siehe "-f <​cfgfile|cfgdir>"​ in http://​cbonte.github.io/​haproxy-dconv/​1.7/​management.html ). 
 + 
 +In der Datei ''/​etc/​default/​haproxy'':​ 
 +<​file>​ 
 +# Change the config file location if needed, only *.cnf-files are loaded in lexical order! 
 +CONFIG="/​etc/​haproxy/​conf.d"​ 
 +</​file>​ 
 + 
 +Nun legen wir die Config-Dateien in /​etc/​haproxy/​conf.d mit Endung .cnf ab und nach Neustart werden die von dort geladen. 
 +==== SNI ==== 
 + 
 +FIXME testen, Quelle: https://​stuff-things.net/​2016/​11/​30/​haproxy-sni/​ 
 + 
 + 
 +=== fallback für nicht-SNI Clients ===
  
 [[https://​gist.github.com/​PiBa-NL/​6301624|komplexes SNI-fallback]] [[https://​gist.github.com/​PiBa-NL/​6301624|komplexes SNI-fallback]]
  
  
-==== wildcard-Angabe bei SNI ====+=== wildcard-Angabe bei SNI ===
  
 https://​stackoverflow.com/​questions/​31262448/​can-i-use-wildcard-sni-matching-with-haproxy https://​stackoverflow.com/​questions/​31262448/​can-i-use-wildcard-sni-matching-with-haproxy
  
  
-==== unterschiedliche SSL-settings bei SNI ====+=== unterschiedliche SSL-settings bei SNI ===
  
 https://​serverfault.com/​questions/​662662/​haproxy-with-sni-and-different-ssl-settings https://​serverfault.com/​questions/​662662/​haproxy-with-sni-and-different-ssl-settings
Zeile 63: Zeile 175:
   bind *:443 ssl crt /​path/​to/​cert force-tlsv12 ciphers MY_RELAXED_CIPHERSTRING   bind *:443 ssl crt /​path/​to/​cert force-tlsv12 ciphers MY_RELAXED_CIPHERSTRING
   [...]   [...]
 +</​file>​
 +
 +
 +===== Verwaltung =====
 +
 +...die integrierte Stats-Seite (s.o.)
 +
 +
 +==== hatop ====
 +
 +apt install hatop
 +
 +in der haproxy.cfg den stats-socket:​ <​file>​stats socket /​run/​haproxy/​admin.sock mode 660 level admin</​file>​
 +und los gehts:<​code bash>​hatop -s /​run/​haproxy/​admin.sock</​code>​