Back to blog

Proxy ve Reverse Proxy

Distributed SystemsSystem Design ConceptsProgrammingNginxProxy

İnternette bir web sitesine girdiğinizde isteğiniz nadiren doğrudan hedef sunucuya gider. Arada mutlaka bir “vekil” vardır. Bu vekilleri anlamak, sistem mimarisinin temelini kavramaktır.

1. Proxy (Forward Proxy) Nedir?

Proxy, istemcinin (sizin) adınıza hareket eden bir araçtır.

Gerçek Dünya Örneği: Bir kütüphanede olduğunuzu düşünün. Bazı kitaplara erişim kısıtlı ve sadece görevli aracılığıyla alabiliyorsunuz. Siz kütüphaneciye (Proxy) gidip “Şu kitabı istiyorum” dersiniz. Kütüphaneci gider, kitabı alır ve size getirir. Kitabın asıl sahibi, kitabı kimin okuduğunu bilmez; sadece kütüphaneciye teslim ettiğini bilir.

  • Nerede kullanılır? İç ağlarda güvenliği sağlamak, trafiği filtrelemek veya anonimlik kazanmak için.

2. Reverse Proxy (Ters Vekil) Nedir?

Reverse Proxy, sunucunun önüne konumlandırılan bir yönetim katmanıdır. Forward Proxy istemciyi gizlerken, Reverse Proxy sunucuyu (backend) dış dünyadan izole eder.

Gerçek Dünya Örneği: Popüler bir restoranın paket servis hattını düşünün. Siz tek bir numarayı ararsınız. Operatör (Reverse Proxy) siparişi alır ve o an müsait olan şubeye (backend sunucusu) yönlendirir. Siz yemeğinizin hangi şubede hazırlandığını bilmezsiniz; sadece tek bir merkezle muhatap olursunuz.

  • Nerede kullanılır? Yük dengeleme (load balancing), güvenlik ve merkezi yönetim için.

3. Neden Bu Görevde Nginx Sıklıkla Tercih Edilir?

Piyasada HAProxy, Apache, Traefik veya Caddy gibi bu işi başarıyla yapan pek çok güçlü alternatif bulunmaktadır. Nginx’in endüstride standart haline gelmesinin temel sebepleri şunlardır:

  • Olay Güdümlü (Event-Driven) Mimari: Her istek için yeni bir “işlem” (process) başlatmak yerine, tek bir iş parçacığıyla binlerce bağlantıyı yönetebilir. Bu, düşük kaynak tüketimi sağlar.

  • Hibrit Yetenekler: Sadece bir reverse proxy değil, aynı zamanda çok hızlı bir web sunucusu ve cache (önbellek) merkezidir.

  • Esnek Konfigürasyon: Modüler yapısı sayesinde karmaşık yönlendirme kuralları kolayca tanımlanabilir.

4. Teknik Uygulama: Nginx ile Yükü Dağıtmak ve Yönetmek

Kavramları anladığımıza göre, Nginx’i bir “orkestra şefi” olarak nasıl yapılandıracağımıza bakalım. Burada iki ana bloğumuz var: Upstream (Sunucu havuzu) ve Server (Karşılama kapısı).

Adım 1: Sunucu Havuzunu (Upstream) ve Dağıtım Algoritmasını Tanımlama

Nginx, gelen isteği hangi kriterlere göre dağıtacağını burada belirler. En sık kullanılan üç yöntemi inceleyelim:

upstream uygulama_havuzu {
    # 1. Round Robin: Varsayılan yöntemdir. İstekleri sırayla dağıtır.
    # 2. Least Connections: En az aktif bağlantısı olan sunucuya yönlendirir.
    # least_conn; 
 
    # 3. IP Hash: Kullanıcının IP adresine göre hep aynı sunucuya gitmesini sağlar.
    # ip_hash; 
 
    server 192.168.1.10:8080 weight=3; # Bu sunucu daha güçlü, 3 kat fazla yük alabilir
    server 192.168.1.11:8080;
    server 192.168.1.12:8080 backup;   # Diğerleri çökerse devreye girer
}

Adım 2: İstekleri Karşılama ve Header Yönetimi

Ziyaretçi example.com adresine geldiğinde Nginx bu isteği karşılar. Ancak isteği arkadaki sunucuya paslarken ziyaretçinin "pasaport bilgilerini" (IP, Host vb.) de beraberinde göndermelidir.

server {
    listen 80;
    server_name example.com;
 
    location / {
        # Trafiği yukarıda tanımladığımız havuza gönderiyoruz
        proxy_pass http://uygulama_havuzu;
 
        # --- Kritik Header Değişkenleri ---
        
        # Kullanıcının tarayıcıya yazdığı asıl domain bilgisini iletir
        proxy_set_header Host $host; 
 
        # Nginx'e bağlanan kullanıcının gerçek IP adresini taşır
        proxy_set_header X-Real-IP $remote_addr;
 
        # Aradaki tüm proxy duraklarını liste olarak iletir (IP1, IP2...)
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
        # İsteğin http mi yoksa https mi olduğunu iletir
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

5. Özet: Bu Mimari Bize Ne Kazandırdı?

Bu yapıyı kurduğunuzda, uygulamanız artık sadece bir kod yığını değil, profesyonel bir altyapı haline gelir:

  1. Hata Toleransı (Failover): Havuzdaki bir sunucu (örneğin 192.168.1.10) kapandığında, Nginx bunu otomatik fark eder ve trafiği diğerlerine yönlendirir. Kullanıcı hatayı hissetmez.

  2. Ölçeklenebilirlik: Trafik arttığında sisteme yeni bir sunucu ekleyip upstream bloğuna yazmanız yeterlidir. Kodunuzda hiçbir değişiklik gerekmez.

  3. Performans: Nginx; SSL şifreleme yükünü, statik dosya sunumunu ve sıkıştırma (Gzip) işlemlerini üstlenerek backend sunucularınızın sadece asıl işine odaklanmasını sağlar.