21 Haziran 2015

Nginx Sunucular Üzerinde HTTP Load Balancer Konfigürasyonu

Bu yazımızda bir web sunucunun HTTP Load Balancer olarak nasıl konfigüre edileceğini ele alacağız. Buradaki amacımız yük altında kalan sunucularımızın hizmet kesintisine uğramasını elimizden geldiğince engellemek olacak.

Konfigürasyonları son yıllarda oldukça popüler olan Nginx web sunucular üzerinde gerçekleştireceğiz. Yazıda bahsedeceğimiz LB ayarları  temel düzeyde konfigürasyonları içerecek.  Benzer ayarlar  Apache web sunucular üzerinde de gerçekleştirilebilir.

İşletim sistemi olarak Ubuntu Server kullanılmıştır.

Senaryomuzu özetleyecek olursak;

Toplamda 3 adet Nginx web sunucu. Bunlardan 1 tanesi LB diğer ikisi bu LB arkasında çalışan web sunucular olarak ayarlanacak.

Nginx LB metodlarından round robin adı verilen metodu kullanarak işlemlerimizi gerçekleştireceğiz.


Konfigürasyon Adımları

Öncelikle tüm sunucularımıza Nginx yükleyelim.

apt-get install nginx –y

Kurduğumuz sunuculara IP adreslerini atayalım. Ben sırasıyla 192.168.2.222, 192.168.2.223, 192.168.2.224 IP adreslerini atıyorum. Yapılan işlemin daha iyi anlaşılabilmesi için Web sunucuların isimlerini web01 ve web02 olarak değiştiriyorum. Ayrıca html sayfalarına da bu isimleri ekleyerek gönderilen isteklerin hangi sunucuya gittiğinin anlaşılmasını kolaylaştırmaya çalıştım.

Default kurulumda html ayarları için aşağıdaki yol izlenebilir;




Load Balancer Ayarı

Yazımızın başında bahsettiğim gibi burada round-robin metodu kullanarak bir yük dengeleme yapmaya çalışacağız. Round-robin metodu kısaca isteklerin belirtilen IP adreslerine eşit veya sizin belirlediğiniz yüke göre dağıltılmasını sağlayan metoda verilen isimdir. 

Örneğin bizim senaryomuzda ilk istek 223 adresine giderken ikinci istek 224 adresine gidecek ve HTTP üzerinden gelen isteklerin dağılımı sağlanacak. Bu konfigürasyon için aşağıdaki adımlar izlenebilir;


Konfigürasyon dosyasına /etc/nginx/sites-available altından erişebiliriz.




Buradaki default dosyası herhangi bir text editör ile açıyoruz. Sadece senaryomuza uygun olan bilgileri  girmek için ayarlara başlamadan önce bu dosyada bulunan bilgileri temizledim.




Aşağıdaki resimde görüldüğü gibi öncelikle senaryomuz için isteklerin dağıtılacağı sunucu adreslerimizi bir blog halinde tanımlıyoruz. Bu işlem için “upstream” parametresi ve bu parametreden sonra gelecek bir isim belirtmemiz gerekiyor.




Sunucu bloglarımızı tanımladıktan sonra isteklerin hangi port üzerinden hangi dizine gideceğini aşağıdaki gibi server blogu altına tanımlıyoruz. Burada gelen tüm isteklerin daha önce belirlediğimiz sunuculara dağılması için “proxy_pass” parametresi ve bir önceki ayarda tanımladığımız ismi başına “http” koyarak buraya ekliyoruz.



İşlemleri tamamladıktan sonra konfigürasyonu dosyasını kaydedip editörden çıkıyoruz.

Yaptığımız konfigürasyonun aktif  hale gelmesi için aşağıdaki komutu kullanabiliriz. Eğer bir hata olursa nginx servisi bu komut çalıştırılırken size bilgi verecektir.


İşlem başarı ile gerçekleştiyse şimdi yapılan konfigürasyonlarımızı test edebiliriz.

Ben LB olarak ayarladığım sunucum üzerinden http istekleri oluşturarak test ettim. Bu işlem için “curl” komutu kullanılabiliriz.

Aşağıda görüldüğü IP adresine istek gönderdiğimde yazının başında içeriğini düzenlediğimiz Web01 sunucusu yanıt veriyor. 


Erişimi teyit etmek için erişim logları da kontrol edebiliriz. Aşağıda görüldüğü gibi web01 sunucusuna gelen istek 192.168.2.222 LB olarak konfigüre ettiğimiz sunucudan gelmiş durumda.


Web01 isimli sunucumuza gelen isteği teyit ettikten sonra aynı IP adresine bir istek daha yapıyoruz.

Bu sefer isteğimize cevap Web02 sunucumuzdan geldi. Şimdi bir önceki istekte olduğu gibi erişim loglarını kontrol edelim.


Sunucumuza gelen istek web01 sunucusunda olduğu gibi 192.168.2.222 üzerinden gelmektedir. 


Sürekli oluşturulan http isteklerinde loglar aşağıdaki gibi görünecektir. Gönderilen istekler bu şekilde iki sunucu üzerine dağıtılacak ve web sunucularınıza binen yük dengelenmiş olacaktır.