Komutları üretim sunucusunda çalıştırmadan önce yedek alın ve mümkünse bir test ortamında deneyin. Yönetim erişiminizi (SSH, panel) kaybetmemek için ayar değişikliklerinde açık bir ikinci oturum bulundurun.
Bu rehberde ne yapacağız?
HAProxy, TCP ve HTTP trafiğini birden fazla arka uç sunucuya dağıtan, sağlık kontrolüyle çalışmayan sunucuları otomatik devre dışı bırakan yaygın bir yük dengeleyicidir. TCP modunda uygulamanın protokolünü yorumlamaz; bu yüzden veritabanı, posta, oyun yönetimi veya özel TCP servisleri gibi her tür TCP trafiği için kullanılabilir. Bu rehberde HAProxy ile TCP yük dengeleme kurulumunu, sağlık kontrollerini ve istatistik sayfasını anlatıyoruz.
Rehber, yüksek erişilebilirlik kurmak isteyen hosting ve sistem yöneticilerine hitap eder. Kurulum ve ilk test yaklaşık 30-40 dakika sürer. Örneklerde HAProxy sunucusu iki arka uca (10.0.0.11 ve 10.0.0.12) 9000 numaralı porttan trafik dağıtır; adresleri ve portu kendi servisinize göre değiştirin.
Gereksinimler
- HAProxy kuracağınız Debian, Ubuntu, AlmaLinux veya Rocky Linux sunucu ve sudo erişimi
- Aynı hizmeti sunan en az iki arka uç sunucu ve HAProxy’den onlara ağ erişimi
- Dengeleyeceğiniz servisin portu ve protokol bilgisi
- Güvenlik duvarında HAProxy’nin dinleyeceği portu açabilme yetkisi
- Tek hata noktası olmaması için ileride ikinci bir HAProxy düşünüyorsanız Keepalived gibi bir yüzer IP çözümü planı
Adım adım HAProxy ile TCP yük dengeleme
1. HAProxy’yi kurun
# Debian/Ubuntu
sudo apt update
sudo apt install -y haproxy
# AlmaLinux/Rocky
sudo dnf install -y haproxyDeğişiklik yapmadan önce varsayılan yapılandırmanın yedeğini alın:
sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.yedek2. Genel ve varsayılan ayarları tanımlayın
TCP modunda zaman aşımı değerleri önemlidir. Çok kısa değerler uzun süren bağlantıları keser; çok uzun değerler ölü bağlantıları tutar. Servisinizin davranışına göre ayarlayın.
global
log /dev/log local0
maxconn 4000
user haproxy
group haproxy
daemon
defaults
log global
mode tcp
option tcplog
timeout connect 5s
timeout client 1m
timeout server 1m
retries 3Debian paketinin varsayılan yapılandırmasında global bölümünde ek satırlar (örneğin chroot, stats socket) bulunabilir; mevcut dosyayı tamamen silmek yerine yalnızca ihtiyacınız olan bölümleri düzenleyin ve mode http olan varsayılanı TCP için değiştirin.
3. Frontend ve backend tanımlayın
Frontend, istemcilerden gelen bağlantıların dinlendiği yerdir; backend ise trafiğin dağıtıldığı sunucu havuzudur.
frontend tcp_servis
bind *:9000
default_backend tcp_arka_uclar
backend tcp_arka_uclar
balance leastconn
option tcp-check
server arka1 10.0.0.11:9000 check inter 2s fall 3 rise 2
server arka2 10.0.0.12:9000 check inter 2s fall 3 rise 2balance leastconn uzun süren bağlantılarda en az bağlantısı olan sunucuyu seçer; kısa bağlantılarda roundrobin de uygundur. check inter 2s fall 3 rise 2 ifadesi her 2 saniyede bir kontrol yapar, art arda 3 başarısızlıkta sunucuyu devre dışı bırakır ve 2 başarılı kontrolde yeniden devreye alır.
4. Sağlık kontrolünü servisinize göre geliştirin
Varsayılan check, yalnızca TCP bağlantısının kurulabildiğini sınar. Bu, servis portu açık ama uygulama takılmış olsa bile sunucunun sağlıklı görünmesine yol açabilir. option tcp-check ile gönderilen ve beklenen veriyi tanımlayarak daha anlamlı kontrol yapabilirsiniz. Protokolü bilinen servisler için hazır kontroller de vardır (örneğin option mysql-check, option pgsql-check, option smtpchk); bunlar ek kullanıcı veya ayar gerektirebilir, ayrıntılar için HAProxy belgesine bakın.
backend tcp_arka_uclar
balance leastconn
option tcp-check
tcp-check connect port 9000
# protokol biliniyorsa istek/yanıt da denetlenebilir:
# tcp-check send <ISTEK>\r\n
# tcp-check expect string <BEKLENEN_YANIT>
server arka1 10.0.0.11:9000 check inter 2s fall 3 rise 2
server arka2 10.0.0.12:9000 check inter 2s fall 3 rise 2 backupbackup işareti, sunucuyu yalnızca diğerleri çalışmazken kullanır. İhtiyacınız yoksa bu seçeneği kaldırın.
5. İstatistik sayfasını yalnızca yerelde açın
İstatistik sayfası sunucuların durumunu gösterir. Dışarıya açmak bilgi sızdırır; bu yüzden yalnızca döngü adresine bağlayın ve uzaktan gerekirse SSH tüneliyle erişin.
listen istatistik
bind 127.0.0.1:8404
mode http
stats enable
stats uri /stats
stats refresh 10s6. Yapılandırmayı doğrulayın ve yükleyin
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl enable --now haproxy
sudo systemctl reload haproxy-c bayrağı yapılandırmayı uygulamadan denetler. enable --now servis çalışmıyorsa (RHEL tabanlı sistemlerde kurulumdan sonra olduğu gibi) başlatır; reload ise mevcut bağlantıları koparmadan yeni yapılandırmayı uygular.
7. Güvenlik duvarı ve SELinux
# ufw
sudo ufw allow 9000/tcp
# firewalld
sudo firewall-cmd --permanent --add-port=9000/tcp
sudo firewall-cmd --reload
# RHEL tabanlı sistemlerde SELinux açıksa
sudo setsebool -P haproxy_connect_any 1SELinux, HAProxy’nin standart dışı portlara bağlanmasını engelleyebilir. Yukarıdaki seçenek bu kısıtı gevşetir; ayrıcalığı gereğinden fazla genişletmemek için yalnızca ihtiyaç duyduğunuzda etkinleştirin.
Doğrulama
Dinleme, dağıtım ve sağlık kontrolünü sırayla doğrulayın:
sudo ss -ltnp | grep haproxy
curl -s 'http://127.0.0.1:8404/stats;csv' | cut -d, -f1,2,18Beklenen sonuç: ss çıktısında 9000 portunu dinleyen haproxy süreci ve istatistik çıktısında arka1 ile arka2 sunucuları için UP durumu. Ardından bir arka uç sunucuda servisi durdurun ve birkaç saniye sonra istatistik çıktısında o sunucunun DOWN olduğunu, istemci bağlantılarının ise diğer sunucuya gittiğini gözlemleyin. Servisi yeniden başlattığınızda sunucu birkaç kontrol sonra UP durumuna dönmelidir.
Sık karşılaşılan sorunlar
- Servis başlamıyor, yapılandırma hatası:
sudo haproxy -c -f /etc/haproxy/haproxy.cfgkomutunu çalıştırın; satır numarasıyla hatayı gösterir. Çoğu zaman girinti, yazım veya bölüm adı sorunudur. - Tüm sunucular DOWN görünüyor: HAProxy sunucusundan arka uçlara erişim güvenlik duvarında kapalıdır ya da servis farklı bir portta çalışıyordur.
- Bağlantılar bir süre sonra kopuyor:
timeout clientvetimeout serverdeğerleri uzun süren bağlantılar için kısadır. - Arka uç, istemci IP’sini göremiyor: TCP modunda kaynak adres HAProxy’ninki olur. Destekleyen servislerde PROXY protokolü (
send-proxy) kullanılır, ancak arka ucun bunu beklediğinden emin olun. - RHEL’de dış porta bağlanma reddediliyor: SELinux kısıtıdır; denetim günlüğüne bakın ve uygun SELinux boolean ayarını uygulayın.
Güvenlik ve bakım notları
- İstatistik sayfasını dışarıya açmayın; gerekirse kimlik doğrulama ekleyin ve yalnızca yönetim ağından erişim verin.
- Hassas servisler (veritabanı vb.) için frontend’i yalnızca güvenilen ağlara bağlayın veya güvenlik duvarında kaynak IP sınırlaması yapın.
- TLS gerekiyorsa şifrelemeyi HAProxy’de sonlandırmak veya TCP olarak geçirmek arasındaki farkı belgeleyin ve sertifika yenilemeyi planlayın.
- Yük dengeleyici tek hata noktası olabilir; yüksek erişilebilirlik için ikinci bir HAProxy ve yüzer IP kurgulayın.
maxconnve sistem dosya tanıtıcı sınırlarını beklenen bağlantı sayısına göre ayarlayın.- Yapılandırma değişikliklerini yedek alarak ve
haproxy -cile doğrulayarak uygulayın.
Sık sorulan sorular
TCP modu ile HTTP modu arasında ne fark var?
TCP modunda HAProxy yalnızca bağlantıları iletir ve içeriği yorumlamaz; her protokol için çalışır. HTTP modunda istekleri okur, başlık ekleyebilir ve yola göre yönlendirebilir, ama yalnızca HTTP trafiği için uygundur.
Sağlık kontrolü sunucuyu ne kadar sürede devre dışı bırakır?
Yaklaşık inter süresi çarpı fall değeri kadar, yukarıdaki örnekte 6 saniye civarında. Süreyi servisinizin hata toleransına göre azaltıp artırabilirsiniz; çok agresif değerler gereksiz devre dışı kalmalara yol açar.
HAProxy DDoS saldırılarından korur mu?
HAProxy bağlantı sınırları ve hız sınırlaması ile uygulama katmanına yakın küçük saldırıların etkisini azaltabilir, ancak hat dolduran hacimsel saldırıları durduramaz. Bu tür saldırılar için sağlayıcı veya ağ tarafı koruma gerekir.
İlgili sözlük terimleri
Bu kategorideki diğer rehberler
- SSH tüneli ve SOCKS proxy (yerel, uzak ve dinamik yönlendirme)SSH tüneli ile yerel (-L), uzak (-R) ve dinamik (-D) port yönlendirmeyi öğrenin; SOCKS proxy kurun, kalıcı tünel için systemd kullanın ve sunucuda tünel yetkilerini kısıtlayın.
- VPN kullanıcı yönetimi ve yapılandırma dağıtımı (ekleme, kaldırma, anahtar yenileme)WireGuard VPN sunucusunda kullanıcı ekleme, kaldırma ve anahtar yenilemeyi düzenli bir süreçle yönetin; istemci yapılandırmalarını güvenli biçimde dağıtın ve kayıt tutun.
- WireGuard ile siteden siteye (site-to-site) VPNİki ağı WireGuard ile birbirine bağlayan site-to-site VPN kurun: anahtar üretimi, iki uçta yapılandırma, IP yönlendirme, güvenlik duvarı kuralları ve el sıkışma doğrulaması.
- VPN’de DNS sızıntısı testi ve önlemiVPN kullanırken DNS isteklerinin tünel dışına sızıp sızmadığını test edin; WireGuard, OpenVPN ve Windows için ayarlarla kendi DNS çözümleyicinizi kurarak önlem alın.