Elasticsearch için Nginx Yük Dağıtıcı

İbrahim ÖZGÖN
Arabam Labs
Published in
5 min readDec 15, 2017

Yazımda, pas tutmamak için haftasonu yaptığım araştırmalardan birini anlatmaya çalışacağım :)

Şirketimizde ve kişisel projelerimde vazgeçilmez bir arama platformu olan Elasticsearch’ü Nginx reverse proxy(ters vekil sunucusu) arkasında çalıştırmaya çalıştım. Başlıca amacım tabii ki daha az kaynakla daha az çalışan bir sistem kurmaktı. Bunun yanında yük dağıtma, sürekli ve kesintisiz çalışan bir sistem vardı.

Yaptıklarımı kısaca özetlersem;

  • Docker linux üzerinde nginx kurulumu
  • Elasticsearch sunucularına bağlanma
  • Windows üzerindeki konfigürasyon dosyasını docker a tanıtıp yük dağıtımı ve ön bellekleme(caching)

Elasticsearch nedir ?

Elasticsearch, açık kaynak kodlu, dağıtılabilen, ölçeklenebilen, son derece hızlı arama yapabilen bir arama motorudur.

Java tabanlı geliştirilmiştir. Platform bağımsız olarak çalışabilmektedir. Elasticsearch ile standard RESTful API ve JSON kullanarak arama yapılmaktadır.

Nginx (Engine x) nedir ?

nginx [engine x], Igor Sysoev tarafından yazılan bir HTTP ve ters vekil sunucusu(reverse proxy) sunucusudur. Uzun süredir ağır yüklü Rus sitelerinde (Yandex, Mail.Ru, VK)çalışmaktadır. Netcraft’ın araştırmasına göre, nginx, Kasım 2017'de en yoğun çalışan sitelerin % 29.64'unda başarıyla çalışmıştır.

Hafif ve stabildir. İlk başta mail sunucusu olarak yazılsa da sonra geliştirilerek tüm sunucular için kullanılmıştır.

BSD lisansı olarak ücretsiz sunumu yayınlanmaktadır. Bunun yanında ücretli olarak Nginx plus sürümü de sunulmaktadır. Aradaki fark için buraya göz atabilirsiniz.

Docker nedir ?

Docker, konteyner hareketini yönlendiren ve karma buluttaki tüm uygulamalara hitap eden tek konteyner platform sağlayıcısıdır.

Windows üzerinde kod geliştiriyorum. Ne yazık ki nginx windows üzerinde çalıştırılması pek önerilmiyor. Windows için yayınlanan bir sürümü olsa da 1024 bağlantı ile kısıtlı oluşu, udp fonksiyonu desteklememesi gibi bilinen hataları bulunmakta. Canlı ortamda linux işletim sistemi üzerinde çalıştırılacağını düşünerek nginx i docker üzerinde çalıştırdım. Bunun bir diğer ve bence en önemli avantajı kolay ve hızlı kurulumu.

Docker üzerinde nginx kurulumu çok basit. Docker ı işletim sisteminize kurduktan sonra powershell veya cmd üzerinden kısa bir komut ile nginx i çalışır hale getirebiliyoruz.

Nginx kurumsal olarak docker hub ını paylaşıyor. Tüm detayları burada bulabilirsiniz. Ben ayrıca kendi yaptığım ufak ayarları da paylaşıyor olacağım.

Nginx i docker üzerinde kurup-çalıştırmak için sadece altta ki komutu çalıştırmanız yeterli olacaktır.

docker run --name elastic-nginx-default -d nginx

Bu komut nginx in docker üzerinde kurulumu yapıp 80 portundan yayına alır. Ancak sistemizde IIS kurulu ise(büyük olasıkla kuruludur.) http://localhost/ adresine gittiğinizde IIS in güzel sayfasıyla karşılaşırsınız.

iis

Nginx açılış sayfası için alttaki komutu çalıştırarak 887 portundan host edebilirsiniz.

docker run --name elastic-nginx-887 -d -p 887:80 nginx
887 portu üzerinden nginx

Nginx in çalıştığına eminiz. Şimdi ayarları yapıp, elasticsearch sunucularımızı nginx üzerinden sunabiliriz. Bunun için nginx bize bir konfigürasyon dosyası veriyor. Bu dosya nginx in hangi adreslere ters proxy yapacağını, sıkıştırma, cacheleme, hata sayfalarını ve say say bitmez özelliklerini tanımlayabileceğimiz dosyadır. Detaylı anlatım için buyurun.

proxy_cache_path üzerinde ne kadar sürelik bir cacheleme yapılacağı ve cache in nerede tutulacağını tanımlıyoruz.

upstream elasticsearch_servers üzerinde kullanılacak elasticsearch sunucularının adreslerini ve ağırlıklarını tanımlıyoruz. Ben hepsine weight=1 verdim. Eğer bazı sunucularınız daha güçlü bazıları daha güçsüz ise bu ağırlığı değiştirebilirsiniz.

server üzerinde ise hangi portu dinleyeceği(listen 80),gzip, header ayarları(proxy_set_header), hangi cache tanımı kullanacağı( proxy_cache elasticsearch), hangi http sonuçlarını ne kadar cacheleyeceği, ve timeout gibi (proxy_connect_timeout, proxy_read_timeout)tanımlar yapılıyor. Aynı zamanda hata sayfaları için belirlenmiş html sonuçları da tanımlanabilir. access_log ile de log dosyamızı veriyoruz.

Ayrıca cache için daha detaylı tanım da yapılabiliyor. Mesela cache’in ne kadar geçerli olacağının yanında belirli bir boyut sınırı belirlenebiliyor. Ben bu örneğimizde 10dk cache lemesini ve 60dk sonra bu cache i temizlemesini söyledim.

Bu dosyayı oluşturup ben windows bilgisayarımda C:\temp\default.conf altına koydum. Bu dosyayı docker üzerine paylaşım yaparak nginx in okumasını sağlamamız gerekiyor. Bunun için de alttaki komutu çalıştırmamız yeterli olacaktır. c:/temp/default.conf altındaki konfigürasyon dosyasını docker’a etc/nginx/conf.d/default.conf altında göstermesini istiyoruz.

docker run --name elastic-nginx -p 887:80 -v c:/temp/default.conf:/etc/nginx/conf.d/default.conf -d nginx
Nginx Elasticsearch

Bunun yanında tüm sayfaları değil sadece belirli sayfaları cacheleme de eklenebilir.

Canlı sunucularda kullanımında ilk aklıma gelen: geliştirmelerde model değişikliklerinde nginx eski sonuçları belirli bir süre cachelediği için sorun oluşturacaktır. Ayrıca yeni sunucu vs eklemede konfigürasyon dosyasını güncellemek sorun oluşturabilir.

Canlı ortamda kullanmadığım için ne yazık ki artılarını veya eksilerini yazamıyorum. Birgün canlı ortamda kullanırsak sözüm olsun yaşadığımız sorunları ve performans sonuçlarını paylaşacağım (:

Buraya kadar okuyup zamanınızı ayırdığınız için teşekkür ederim. Bir sonraki yazıya kadar esen kalın.

Referanslar

--

--