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.http
varsayı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 webservers
sı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.