Pek çoğumuz Nginx'i, mod_proxy'i, Envoyu, Caddyi ya da IIS/ARR'yi duymuşuzdur veya kullanmışızdır. Ancak hiç kullandığımız Reverse Proxy yazılımının ne kadar hızlı olduğunu merak ettiniz mi?
Gelin, bu reverse proxy yazılımları ile HAProxy'i karşılaştıralım, avantajlarına ve dezavantajlarına bakalım.
Öncelikle bilmeyen arkadaşlar için kısaca "Reverse Proxy" veya "Ters Proxy" kavramını açıklayalım:
Proxy deyince aklınıza bağlantımızı başka bir bilgisayar üzerinden geçiren sistemler geliyor olabilir ancak bu Proxy'nin sadece bir türüdür ve bunlara "forward proxy" veya basitçe proxy denir.
Reverse Proxy ise bunun tersten yapılan halidir yani siz internete çıkmak için başka bir bilgisayardan geçmek yerine web sunucunuz internete çıkmak için bir proxy arkasında bulunur ve sunucunuza bağlananlar reverse proxy'ye bağlanır o da istekleri arkadaki uygulama sunucunuza gönderirler.
Reverse Proxylerin ana kullanım amacı değişkendir en yaygın kullanım amacı birden fazla uygulama sunucusunu tek sunucuda organize etmek örneğin /api 8080 / ise 5000 portundaki sunucuya yönlendirilsin diye emirler vermektir ancak bir diğer kullanım amacıda Web sitenizi savunmada (L7 firewall vb. bulunmadığı sürece) ilk kapı görevi görmesidir.
HAProxy'yi diğerlerinden ayıran en büyük özelliği tamamen reverse proxy odaklı olmasıdır, nginx gibi statik web dosyalarını (yani png, js, css gibi dosyaları) servis etmez bu tür özellikte içermez, bu application server (yani uygulama sunucunuz) veya CDN'nizin görevidir.
HAProxy tabii sadece saf reverse proxydir de diyemeyiz bu çok büyük bir basitleştirme olur, kullanım alanları çok geniş özellikle kurumsal ağlarda ve büyük web sitelerinde özellikle ticari Load Balancer yazılımlarında alt yazılım olarak kullanılıyor.
Örneğin pek çok L7 DDOS koruması, WAF HAProxy ve Nginx üzerine inşaa edilmiştir.
HAProxy kafa karıştırıcı veya karmaşık olarak nitelendirilse de ve küçük web siteleri için gereksiz gibi gözükse de bu tür evet ya da hayır cevabı vermek aşırı nesnel olmayacaktır zira her websitesinin ihtiyaçları farklıdır küçük bir web sitesi için HAProxy kullanımı bazı durumlarda kendi tecrübeme göre daha basit, performanslı ve kolay olabilmektedir özellikle TLS termination açısından vazgeçilmezdir.
Yine bir terim'i açıklayalım "TLS Termination": Reverse Proxy'nin TLS ile şifrelenmiş arkadaki sunuculardan gelen veriyi deşifre edip ardından tekrar şifrelemesidir.
HAProxy'yi bu açıdan hiç bir açık kaynak web sunucusu geçememiştir.
Peki HAProxy bana göre mi değil mi sorusuna üstte belirttiğim gibi kesin olarak evet ya da hayır yanıtı vermek doğru olmasa da genel senaryolara göre yanıtlar hazırladım.
Amacınız: - PHP host hizmeti sağlamak ise:
En iyi tercihiniz LiteSpeed olacaktır, HAProxy işinizi fazla görmeyecektir hatta maintenance açısından size kötü sonuçları olacaktır
- Çok fazla API var Go, Node, Python, Dotnet, Java hepsinden var ve bunları birleştirmek istiyorsanız:
HAProxy tam da size göre ancak kubernates ve service meshleri araştırmanızı öneririm.
- Birden fazla sunucunuz var ve yükü bunlar arasında dengelemek istiyorsanız:
HAProxy sizin için uygundur ama ilk başlarda DNS tabanlı yük dengelemeyi denemenizi öneririm bunu ileride açıklayacağım bir konuda anlatacağım
- Kendi çapınızda sistemlerinizi güvenceye almak, rate limit ve atak tespiti yapmak istiyor iseniz:
HAProxy uygun bir temeldir ancak kendi başına ataktan korunmaya fazla bir faydası olmayacaktır, nginx gibi HAProxy'de üzerine eklenti yazılabilir ve bu şekilde WAF vb. eklentileri yapabilirsiniz
Kuruluma geçelim:
Basitlik olsun diye kurulumu Ubuntu Server 24.04'e göre yapacağım ancak genelde HAProxy Kurumsal Linux dağıtımlarında kullanılır.
$ sudo apt install haproxy
haproxy'yi kurduktan sonraki adım ise
/etc/haproxy/haproxy.cfg düzenlemek
düzenlemek için herhangi bir editörü kullanabilirsiniz emacs olur vim olur nano olur farketmez
dosya içeriği şu şekilde görülecektir
normalde bu kısımda detaylı açıklama yok kendim açıklama ekledim
global
log /dev/log local0
log /dev/log local1 notice
# haproxy'nin güvenlik sebebiyle config dosyası hariç oluşturacağı dosyaları kullanabileceği dizin
chroot /var/lib/haproxy
# istatistik UNIX socketi (basitçe açıklama güvenli internete açık olmayan soket)
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
# haproxy görevinin çalışacağı kullanıcı
user haproxy
group haproxy
# haproxynin arkada çalışması gerektiğini belirtir
daemon
# ssl sertifikası
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
# kullanıcılacak TLS algoritmalarının yeri, bu kısım yüksek güvenlikli PCI DSS uyumlu sunucularda değiştirilir
# gereksiz yere değiştirmeyin
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
# hata sayfaları
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.httpvarsayılan config kendi başına bir sunucu aktifleştirmiyor (istatistik sunucusu hariç ancak bu konu kapsamında değil)
şimdi yapmamız gereken şey haproxy'ye bir web sunucusu aktifleştirmesini söylemek
öncelikle terimlerimizi öğrenelim haproxy'de frontend bir de backend dediğimiz terimler var ancak bu terimler web için bildiğiniz backend frontend terimleriyle alakasız
frontend sitenize bağlanacakların bağlanacağı ara sunucu
burada kafası karışanlar olabilir: sunucu demek bildiğiniz kasa demek değil uygulama anlamında, teknik bilgisi az arkadaşlar için bunu port yönlendrme gibi düşünün (çok alakasız ama en anlaşılır bu şekilde olur diye düşünüyorum)
frontend kısımının sözdizimi oldukça basit
frontend http
mode http
bind :443
bind :80
default_backend webserverssıra geldi backend kısımına
backend webservers
mode http
balance roundrobin # birden fazla sunucu varsa yük dengeleme algoritması örneğin roundrobin ileri gider eğer daha fazla sunucu yoksa tekrar başa döner
server s1 127.0.0.1:5000 # ip ve portu sunucu local değilse sunucu ipsiyle ve portuyla değiştirin
HAProxy'yi efektif olarak kullanmak için belgelerini okuyabilirsiniz, İngilizce olsalarda anlaşılması günümüz çağında zor değiller ileriki zamanlarda istek olursa belgelemeleri çevirip paylaşabilirim.
HAProxy ek özellikler:
HAProxy'de ACL'ler ile koşullara bağlı olarak bağlantıyı kapatma farklı servere yönlendirme gibi eylemler yapabileceğinizi biliyor muydunuz?
http-request silentdrop if req.hdr_beg(referer) -i domain # referer headeri domain ile başlıyorsa bağlantıyı dondurur ve sürekli yükleniyorda bırakır
HAProxy ile bağlantılara ID ekleme:
Bağlantılara ID ekleyerek log izlemeyi kolaylaştırabilirsiniz
unique-id-format "%[uuid]"
unique-id-header X-Correlation-ID
http-after-response set-header X-Correlation-ID "%[unique-id] "Server header silme:
Arka sunucularınızın hangi web server yazılımı çalıştırdığının bilinmesini genel olarak engeller (tamamen engellemez, öğrenmenin başka yollarıda var)
http-response del-header Server
verilen configler backend altına yazılacaktır
Hız olarak HAProxy ve diğer Reverse Proxy'lerin karşılaştırılması:
1. HAProxy
2. Envoy
3. Nginx
4. caddy
5. mod_proxy
IIS ARR hakkında internette bir benchmark yok.
HAProxy'deki engelleme modları:
Deny:
403 hatası verir
Silentdrop:
Sürekli yükleniyorda bırakır, amaç karşı tarafı yormaktır genelde siber saldırılara karşı kullanılır ancak bazı durumlarda TCP_RESET atmak daha etkilidir
Tarpit:
Uzun süre yükleniyorda kalır ardından bir hata mesajı döndürür
Reset:
Karşı taraf TCP_RESET alır
HAProxy sadece http için değil TCP load balancing içinde kullanılabilir, bunu ileriki bir konuda anlatacağım özellikle Minecraft gibi oyunlar için sıklıkla kullanılır.
HAProxy yük dengeleme modları:
roundrobin: tüm sunucular ağırlıklarına göre turlar halinde kullanılırlar
static-rr: roundrobin'e çok benzerdir ve yapı itibariyle sunucu sayısı sınırlaması yoktur, roundrobin aksine ağırlıklar anlık olarak değiştirilemez
leastconn: en az bağlantı kurulan sunucuyu seçer
first: ilk uygun sunucuyu seçer
hash: bir verinin bu ip olur header olur hashı alınarak buna göre sabit sunucu seçilir
source: ipye göre hashlenerek sunucu belirlenir
uri
url_param
hdr
random
rdp-cookie
log-hash
sticky: sunucuyu oldukça sabit tutmaya çalışır
Türkçe olarak HAProxy hakkında detaylı bilgi az olduğu için bu paylaşımı yapmak istedim, umarım beğenmişsinizdir.