15/11/2018 · tomcat nginx X-Forwarded-For

Nginx + Tomcat Yük Denegeleme

Web sitenize bağlanan bir kullanıcın gerçek (public) IP adresi nedir?

Bu soru yoğun bir tarafiği olan siteler için çok anlamlı değil, fakat trafiği yoğun olan bir web siteniz var ise gerçektende çözmeniz gereken bir soru.

Anlatacağım senoryoda Tomcat üzerinde koşan yoğun kullanıcı sayısına sahip bir web sitesi için yük dengeleme nasıl yapılır ve bağlı kullanıcının gerçek IP adresini Tomcat'e nasıl iletirsiniz ve Tomcat içinde nasıl yakalarsınız buna değineceğim.

Yük dengeleme için Nginx'in açık kaynak versiyonunu kullanarak etkili bir çözüm oluşturabilirsiniz.

Aşağıdaki Nginx konfigürasyon ile sitenize (example.com, 10.1.40.150) gelen kullanıcıları backend'de bulunan 3 sunucudan birine sırasıyla (round_robin) yönlendirebilirsiniz.

upstream backend {  
     round_robin; # ip_hash, least_conn
     server 10.40.1.151:8080;
     server 10.40.1.152:8080;
     server 10.40.1.153:8080;
}

server {  
    listen 80;
    server_name example.com;

    location / {
      proxy_pass http://backend;
    }
}

Fakat bu yapı ziyaretçinin gerçek IP adresi yerine web sitenizin bulunduğu sunucun IP adresini (example.com, 10.1.40.150) Tomcat'e iletecektir.

Tomcat'e ziyaretçinin gerçek IP adresini iletmek için aşağıdaki Nginx parametlerini kullanmanız gerekecek.

proxy_set_header Host $host;  
proxy_set_header X-Forwarded-Host $host;  
proxy_set_header X-Forwarded-Server $host;  
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  

Nginx konfigürasyon dosyanız sonuç olarak aşağıdaki gibi olmalıdır.

upstream backend {  
     server 10.40.1.151:8080;
     server 10.40.1.152:8080;
     server 10.40.1.153:8080;
}

server {  
    listen 80;
    server_name example.com;

    location / {
      proxy_pass http://backend;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Tomcat'e web sitenizi ziyaret eden kullanıcın gerçek IP adresini ilettik, şimdi Tomcat tarafında bu IP adresini yakalayalım.

Bunun için Tomcat için sunucu ayarlarının bulunduğu server.xml dosyasında aşağıdaki yapıyı kullanmalısınız. Bu yapıda 127.0.0.1 sunucun kendisini, 10.1.40.150 ise sunucun kullandığı IP adresi belirtmektedir.

<Valve className="org.apache.catalina.valves.RemoteIpValve" internalProxies="127\.0\.0\.1|10\.1\.40\.150" remoteIpHeader="x-forwarded-for" proxiesHeader="x-forwarded-by" protocolHeader="x-forwarded-proto" />