Haproxy ile Ters Vekil (Reverse Proxy) Denemesi

Haproxy ile ilgili denememizi yapmadan önce, ters vekil (reverse proxy) hakkında birşeyler söyleyelim.

Ters Vekil (Reverse proxy) internet üzerinde bir ara nokta oluşturup, istemci ile hedef kaynak arasına girerek, gelen http isteklerini arka planda çalışan sunuculara yönlendirir.

İstemci, ters vekil sunucusunu gerçek hedef veya kaynak olarak görür. Aslında ters vekil, arka planda çalışan sunucuların önünde çalışarak, bir nevi onları gizlemiş olur.

Hangi amaçlarla reverse proxy kullanırız?

  • Yük dengeleyici (load balancing): Bir çeşit trafik polisi gibi davranarak, gelen talepleri bir veya birden fazla sunucuya bağlar. Bir sunucu çok yoğun çalışıyorsa, gelen talebi başka sunucuya yönlendirir. Veya bir sunucu çökmüşse, gelen talepleri ayakta olan diğer sunuculara yönlendirerek, sistemin ayakta kalmasını, isteklere cevap verebilmesini sağlar.
  • Web uygulamaların performansının arttırılması ve güvenlik: Gerektiğinde sayfaların önbelleğe atılması sağlanarak hızlandırılması. Sunuculara doğrudan erişimin engellenerek anonimliğin ve güvenliğin arttırılması. SSL şifrelemesinin yapılabilmesi.
  • Farklı uygulamaların aynı bilgisayar üzerinde çalışması ve bu hizmetlerin dışarıya açılması.

Reverse proxy olarak kullanabileceğimiz bir kaç alternatif var. Bunlardan en çok bilinenleri nginx ve haproxy’dir. İkisi de açık kaynak kodlu yazılmış, rüştünü ıspatlamış güçlü araçlardır. Nginx reverse proxy olmasının dışında bir web sunucusu olarak da kullanılabilir. Haproxy, nginx’ten farklı olarak sadece reverse proxy olarak kullanılır.

Nodejs web uygulamamı geliştirirken, api katmanı olarak kullanacağım kısım ile web arayüzün olduğu kısmı, böyle bir tasarımın micro servis yapısına daha uygun olacağını düşünerek iki ayrı uygulama olarak parçalamak istemiştim. Aynı host üzerinde bu iki uygulamayı çalıştırmak fakat farklı alan adları kullanarak erişime açmak için bir ters vekil (reverse proxy) aracı gerekiyordu. Web sunucum (nodejs) zaten var olduğu için bana sadece yük dengeleyici ve reverse proxy olarak kullanabileceğim bir araç gerekiyordu. Nginx kullanarak aynı sonucu elde edebilirdim. Fakat izleme (monitoring) özellikleri nginx plus dediğimiz paralı olan ürüne kaydırılmış olduğu için ve haproxy ile birlikte gelen güzel bir izleme arayüzü (ayrıca bedava 🙂 ) olduğu için Haproxy’i tercih ettim.

mydomain diye bir alan adına sahip olduğumuzu farzedelim. İstemciler, http://api.mydomain.com adresi ile rest uygulamasına bağlansın, http://www.mydomain.com adresi ile de web uygulamasına bağlanabilsin.

Kurulum ve çalışmayı Ubuntu 16.04 işletim sistemli bir makina üzerinde yapıyorum.

Hatırlatma: Root yetkisi ile işlem yapmam gerektiği için komutların başına sudo ifadesini koyuyorum.

Kurulum:

sudo apt-get install haproxy

Aktif hale getirmek için:

sudo nano /etc/default/haproxy

dosyasına ENABLED=1 ifadesini ekliyoruz.

Orjinal haproxy.cfg dosyası üzerinde de değişiklik yapabiliriz. Fakat biz sıfırdan yapmak istiyoruz. Bu yüzden orjinalini farklı bir isimle kaydedelim.

sudo mv /etc/haproxy/haproxy.cfg{,.original}

Şimdi sıfırdan konfigürasyon dosyasını oluşturalım:

sudo nano /etc/haproxy/haproxy.cfg

Dosyayı aşağıdaki şekilde değiştirelim:

global
    daemon
    maxconn 4096

defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend http-in
    bind *:80
    stats enable
    stats uri /haproxy?stats
    stats realm Strictly\ Private
    stats auth onbirkod:onbirkodsifre
    acl is_site1 hdr(host) -i api.mydomain.com
    acl is_site2 hdr(host) -i www.mydomain.com

    use_backend site1 if is_site1
    use_backend site2 if is_site2

backend site1
    balance roundrobin
    option httpclose
    option forwardfor
    server s1 127.0.0.1:8081 maxconn 32

backend site2
    balance roundrobin
    option httpclose
    option forwardfor
    server s2 127.0.0.1:8080 maxconn 32

Çok detayına girmeden anlatmak gerekirse, frontend olarak tanımlanan kısım, dışarıya açık olan kısmı ifade ediyor. bind *:80 ayarı ile bilgisayara 80 portu (http) ile gelen istekleri ele almış oluyoruz. acl is_site1 hdr(host) -i api.mydomain.com ve use_backend site1 if is_site1 ifadeleri ile gelen istek api.mydomain.com adresi ile geliyorsa bu istek site1 backend’ine gitsin, benzer mantığı kullanır isek, www.mydomain.com adresi ile istek geliyorsa site2 backend’ine gitsin. backend kısımlarında da arka planda çalışan web sunucularımızı tarif ediyoruz. mydomain kısmına da tabi kendi alan adınızı yazmanız gerekiyor.

Reverse proxy servisini çalıştırmak için komutumuzu çalıştıralım:

sudo service haproxy start

Yazımızda belirttiğimiz izleme (monitoring) ve istatistiksel sonuçları görebileceğimiz bir arayüzü aktif hale getirmek için frontend kısmında stats olarak belirttiğimiz kısımları eklememiz gerekiyor. Bu sayede www.mydomain.com/haproxy?stats adresinde reverse proxy ile ilgili istatistiki verilere bakma şansımız olur. stats auth kısmında belirttiğimiz kullanıcı adı, sifre (username:password) değerlerine göre arayüze erişebilirsiniz.

Faydalandığım Kaynaklar

http://www.haproxy.org/

https://www.digitalocean.com/community/tutorials/how-to-use-haproxy-to-set-up-http-load-balancing-on-an-ubuntu-vps

Not:

Oracle linux üzerinde denemeler yaparken, aşağıdaki hatayı almıştım:

 Layer4 connection problem, info: “General socket error (Permission denied)

Çözmek için stackoverflow sitesinden bulduğum aşağıdaki değişikliği yapmak zorunda kaldım.

getsebool haproxy_connect_any   # by default 0
setsebool -P haproxy_connect_any 1

Değişikliği yaptıktan sonra haproxy servisini restart edince, problem düzeldi:

systemctl restart haproxy

 

 

 

1 thought on “Haproxy ile Ters Vekil (Reverse Proxy) Denemesi”

  1. Geri bildirim: Bedava SSL için Let's Encrypt ve Haproxy Entegrasyonu - Yazılım Mekanı

Yorum bırakın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Scroll to Top