HAProxy (High Availability Proxy), ağ trafiğini birden fazla backend sunucuya dağıtarak performansı, güvenilirliği ve sunucu kapasitesini en üst düzeye çıkaran açık kaynaklı, yüksek performanslı bir TCP/HTTP yük dengeleyici ve proxy sunucusudur. OSI modelinin hem 4. katmanında (TCP) hem de 7. katmanında (HTTP) çalışır; böylece uygulamalar ve servisler için hassas trafik yönetimi, yüksek erişilebilirlik ve verimli kaynak kullanımı sağlar.
HAProxy hızı, kararlılığı ve çok yüksek trafik hacimlerini kaldırabilmesiyle tanınır. İstemci isteklerinin dengeli dağıtılması, sunucuların aşırı yüklenmemesi ve bakım işlemlerinin kesintisiz yürütülmesi için genellikle web sunucularının, uygulama sunucularının ve veritabanı kümelerinin önüne konumlandırılır.
HAProxy ile yük dengeleme
Yük dengeleme, ağ trafiğini server farm veya küme olarak bilinen bir backend sunucu grubuna dağıtma sürecidir. HAProxy, kaynak kullanımını optimize etmek, throughput'u en üst düzeye çıkarmak, yanıt süresini en aza indirmek ve tek tek sunucuların aşırı yüklenmesini önlemek amacıyla bir sonraki isteği hangi sunucunun alacağını belirlemek için çeşitli algoritmalar kullanır.
HAProxy yük dengelemesinin temel bileşenleri:
- Algoritma seçimi: HAProxy, farklı uygulama ihtiyaçlarına uyacak birkaç algoritma sunar.
- Sunucu health check'leri: backend sunucuların erişilebilirliğinin ve yanıt verme durumunun sürekli izlenmesi.
- Sunucu ağırlıklandırma: belirli sunucuların daha fazla trafik alacak şekilde önceliklendirilmesi.
Yük dengeleme algoritmaları
HAProxy, backend bölümünde yapılandırılan bir dizi algoritma sunar:
roundrobin: istekleri backend grubundaki her sunucuya sırayla dağıtır. Varsayılan algoritmadır.leastconn: yeni bağlantıları en az aktif bağlantıya sahip sunucuya yönlendirir. Uzun ömürlü bağlantılar için idealdir.source: sunucuyu belirlemek için kaynak IP adresinin hash'ini kullanır. Bir istemcinin sürekli aynı sunucuya bağlanmasını sağlar; açık oturum kalıcılığı bulunmayan, durum bilgisi tutan uygulamalar için kullanışlıdır.uri: sunucu seçmek için URL'nin sol kısmını (query string'den önceki bölümü) hash'ler. Önbellek proxy'leri için kullanışlıdır.hdr(<name>): belirtilen bir HTTP header'ının değerini hash'ler.random: rastgele bir sunucu seçer.
backend web_servers
balance roundrobin
server web1 192.168.1.10:80 check
server web2 192.168.1.11:80 check
server web3 192.168.1.12:80 check
HAProxy ile proxy'leme
Proxy'leme, bir istemci veya sunucu adına hareket eden bir aracı sunucuyu içerir. HAProxy bir reverse proxy olarak çalışır: istemcilerden gelen bağlantıları kabul eder, bunları backend sunuculara iletir ve sunucuların yanıtlarını istemcilere geri döndürür. Bu soyutlama katmanı güvenlik, performans ve operasyonel avantajlar sağlar.
4. katman (TCP) proxy'leme
- katmanda HAProxy, uygulama katmanı içeriğini incelemeden ham TCP bağlantılarını iletir. Bu, içerik incelemesinin gerekmediği ya da istenmediği HTTP dışı servisler, veritabanları veya özel protokoller için uygundur.
listen mysql_cluster
bind *:3306
mode tcp
balance leastconn
server db1 192.168.1.20:3306 check
server db2 192.168.1.21:3306 check
7. katman (HTTP) proxy'leme
- katmanda HAProxy, HTTP istek ve yanıt header'larını, URL'leri ve çerezleri inceleyip değiştirebilir. Bu, içerik tabanlı yönlendirme, SSL sonlandırma, URL yeniden yazma ve oturum kalıcılığı gibi gelişmiş özellikleri mümkün kılar.
frontend http_frontend
bind *:80
mode http
default_backend web_servers
HAProxy yapılandırma bileşenleri
HAProxy yapılandırması genellikle /etc/haproxy/haproxy.cfg dosyasında bulunur ve birkaç bölüme ayrılır.
global bölümü
global bölümü, loglama, güvenlik ayarları ve performans limitleri gibi süreç genelindeki parametreleri tanımlar. Bu ayarlar tüm HAProxy örneği için geçerlidir.
global
log /dev/log local0 info
maxconn 20000
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
user haproxy
group haproxy
daemon
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
defaults bölümü
defaults bölümü, kendisinden sonra gelen tüm listen, frontend ve backend bölümleri için varsayılan parametreleri belirtir. Bu, yapılandırmadaki tekrarları azaltır.
defaults
mode http
log global
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
option httplog
option dontlognull
option http-server-close
frontend bölümü
Bir frontend, HAProxy'nin istemci bağlantılarını dinlediği, dışarıya açık giriş noktasını tanımlar. IP adresini, portu, protokolü (mode) ve Access Control List'leri (ACL) kullanarak istekleri belirli backend'lere yönlendirme kurallarını belirtir.
frontend http_in
bind *:80
mode http
acl host_app1 hdr(host) -i app1.example.com
acl host_app2 hdr(host) -i app2.example.com
use_backend app1_servers if host_app1
use_backend app2_servers if host_app2
default_backend default_web_servers
backend bölümü
Bir backend, HAProxy'nin istekleri iletebileceği sunucu grubunu tanımlar. Yük dengeleme algoritmasını, health check parametrelerini ve tek tek sunucu tanımlarını içerir.
backend app1_servers
balance leastconn
option httpchk GET /healthz
server s1 10.0.0.10:8080 check inter 2000 fall 3 rise 2
server s2 10.0.0.11:8080 check inter 2000 fall 3 rise 2 backup
check: sunucu için health check'leri etkinleştirir.inter 2000: her 2000ms'de bir kontrol eder.fall 3: art arda 3 başarısız kontrolden sonra sunucuyu kapalı olarak işaretler.rise 2: art arda 2 başarılı kontrolden sonra sunucuyu açık olarak işaretler.backup: sunucu yalnızca backup olmayan diğer tüm sunucular kapalı olduğunda kullanılır.
listen bölümü
Bir listen bölümü, frontend ve backend işlevlerini tek bir blokta birleştirir. Genellikle daha basit yapılandırmalarda veya HAProxy'nin istatistik sayfası gibi servislerde kullanılır.
listen stats_page
bind *:8080
mode http
stats enable
stats uri /haproxy?stats
stats realm HAProxy\ Statistics
stats auth admin:securepassword
stats refresh 5s
Access Control List'ler (ACL)
ACL'ler, istemci isteklerindeki belirli kriterleri (örneğin kaynak IP, host header'ı, URL yolu, HTTP metodu) eşleştirmek için kullanılan güçlü koşul kurallarıdır. Dinamik yönlendirme, içerik anahtarlama ve engellemeyi mümkün kılarlar.
frontend website_frontend
bind *:443 ssl crt /etc/haproxy/certs/mydomain.pem
# Yola göre ACL'ler
acl is_admin_area path_beg /admin
acl is_api_v1 path_beg /api/v1
# ACL'lere göre yönlendirme
use_backend admin_backend if is_admin_area
use_backend api_v1_backend if is_api_v1
default_backend main_website_backend
Health check'ler
HAProxy, isteklerin yalnızca çalışır durumdaki örneklere gönderilmesini sağlamak için backend sunucuların sağlığını sürekli izler. Bir sunucu health check'lerde başarısız olursa, HAProxy onu toparlanana kadar geçici olarak rotasyondan çıkarır.
- TCP check (
check): temel port bağlantısı. - HTTP check (
option httpchk): bir HTTP isteği gönderir (örneğinGET /health) ve geçerli bir HTTP durum kodu (2xx veya 3xx) bekler. - SSL Hello check (
ssl-hello-chk): bir SSL el sıkışmasının kurulup kurulamayacağını kontrol eder.
Gelişmiş HAProxy özellikleri
SSL sonlandırma ve offloading
HAProxy, SSL/TLS şifreleme ve şifre çözme işlemlerini üstlenerek CPU yoğun bu görevi backend sunuculardan alabilir. Gelen HTTPS trafiğinin şifresini çözer ve backend'e düz HTTP iletir; ya da uçtan uca SSL için yeniden şifreleyebilir.
frontend https_in
bind *:443 ssl crt /etc/haproxy/certs/mydomain.pem
mode http
default_backend web_servers
Sticky session'lar (kalıcılık)
Sticky session'lar, bir istemcinin isteklerinin oturum boyunca sürekli aynı backend sunucuya yönlendirilmesini sağlar. Oturum durumunu tek tek sunucularda tutan uygulamalar için bu kritik önemdedir.
- Çerez tabanlı kalıcılık: HAProxy istemcinin tarayıcısına bir çerez ekler; bu çerez sonraki isteklerde doğru backend sunucuyu belirlemek için kullanılır.
- Kaynak IP kalıcılığı: istemcinin kaynak IP adresini kullanarak isteği sürekli aynı sunucuya yönlendirir (NAT arkasında daha az güvenilirdir).
backend web_servers_sticky
balance roundrobin
cookie SERVERID insert indirect nocache
server s1 10.0.0.10:80 check cookie s1
server s2 10.0.0.11:80 check cookie s2
İçerik tabanlı yönlendirme
İçerik tabanlı yönlendirme, trafiği istemci isteğindeki belirli özniteliklere (istenen URL yolu, HTTP host header'ı veya özel HTTP header'ları) göre farklı backend sunucu havuzlarına yönlendirir. Bu, mikroservis mimarilerini veya çok kiracılı (multi-tenant) uygulamaları kolaylaştırır.
(Örnek, frontend bölümünde acl host_app1 ve use_backend ile zaten gösterildi.)
HAProxy'nin kendi yüksek erişilebilirliği
HAProxy backend servislerin yüksek erişilebilirliği için tasarlanmış olsa da, HAProxy örneklerinin kendisi de Keepalived gibi araçlarla birlikte VRRP (Virtual Router Redundancy Protocol) gibi harici mekanizmalar kullanılarak yüksek erişilebilir hale getirilebilir. Bu, arıza durumunda birincil ve ikincil HAProxy sunucuları arasında otomatik devreye giren bir yüzen IP adresi oluşturur ve yük dengeleme hizmetinin kesintisiz sürmesini sağlar.
HAProxy ile Nginx karşılaştırması (kısa)
Hem HAProxy hem de Nginx reverse proxy ve yük dengeleyici olarak çalışabilir. Temel tasarım hedefleri ve tipik kullanım senaryoları farklıdır.
| Özellik | HAProxy | Nginx |
|---|---|---|
| Birincil rol | Adanmış, yüksek performanslı yük dengeleyici ve proxy | Web sunucusu, reverse proxy, yük dengeleyici, önbellek |
| Performans | Son derece yüksek (özellikle L4/TCP) | Yüksek (iyi bir çok yönlü seçenek) |
| Yapılandırma | Yük dengeleme için özel tasarlanmış, kapsamlı seçenekler | Daha genel amaçlı, esnek |
| Önbellekleme | Sınırlı (harici modül gerektirir) | Yerleşik, güçlü HTTP önbellekleme |
| Statik dosya sunumu | Birincil odağı değil | Mükemmel, yüksek düzeyde optimize |
| Modülerlik | Görece monolitik | Zengin modül ekosistemiyle yüksek modüler |
| SSL sonlandırma | Evet | Evet |
| WebSockets | Evet | Evet |
HAProxy genellikle saf yük dengeleme performansının ve sağlam health check'lerin kritik olduğu, yüksek trafikli ortamlarda tercih edilir. Nginx ise yük dengelemenin yanı sıra web sunumu, önbellekleme ve reverse proxy kombinasyonuna ihtiyaç duyulduğunda sıkça kullanılır. İkisinin birlikte konumlandırıldığını görmek yaygındır: HAProxy birincil yük dengeleyici olarak çalışırken, Nginx uygulama düzeyindeki belirli proxy işlerini veya statik içeriği üstlenir.
