Almost Every Web Servisi Önünde Ne Durur
Hoşgeldiniz
Eğer bir tarayıcıda example.com girersen, gerçekten uygulayı çalıştıran makineye neredeyse hiç ulaşmazsın. Gerçekleştiren bir makineye ulaşır ve bu makineyi forward yapar. Bu yönlendirme makinesi bir adı vardır: geriye yönelik proxy.
Bu ders, ne yapar öğrenir, hemen her public web hizmeti neden bir geriye yönelik proxy önünde saklanır ve aynı anda kenar katmanında ne kadar üç işi üstlenir.
Sonunda anlaman:
- client, proxy ve origin arasındaki farkı
- Bir köke yönelik bir proxy önünde koruma, ölçeklendirme ve parçaları değiştirmeyecek şekilde kimseye fark etmeden ne işe yarar
- Geriye yönelik bir proxy aynı anda üstlenen üç işi: köke saklamak, TLS sonlandırma ve klonlar arasında yükü dağıtma
- Bir istekte tarayıcıdan proxyye, upstream'a ve geri, atlamalarla ne kadar yol kat eder
Sonunda, proxy yerleştirme konusunda emin bir şekilde düşünmeye, kenar katmanında ayrımcılık konusunda düşünmeye ve pahalı olmayan bir köke karşılaştırıldığında stateless proxy katmanının nasıl katlanabileceğini kavrayacaksın.
Forward Proxy vs Geri Proxy
İki Proxy Yönlendirme
Her iki tür de, iki taraf arasındaki bir grup arasında ve trafiği iletmektedir. Farklılık hangi tarafı temsil ettiği üzerinedir.
Forward proxy: Bir grup client önünde durur. Dışarıdaki sunucu, proxy adresi yerine client adresi görür. İşçi çıkış proxy'leri, içerik filtreleri ve SOCKS proxy'leri bu modele uygundur.
Reverse proxy: Bir grup sunucu önünde durur. Dış dünya (kullanıcılar) proxy adresine konuşur; kullanıcılar, gerçekten bir sunucu arkasında saklanıyor olduğunu bilmez. Almost her public web service bunu kullanır.
Mnemonic: Bir forward proxy, client'leri sunuculardan gizler. Bir reverse proxy, client'leri sunuculardan gizler.
Nasıl önemli olduğunu neden düşünmelisin? İş, hata modları ve güvenlik sınırı farklıdır. Bir forward proxy, kullanıcılarının kimine iletişime geçtiğini endişelenir; bir reverse proxy, sunucularına kimin bağlanacağını endişelenir.
Bir client, her iki türde de trafiği gönderir: client -> forward_proxy -> internet -> reverse_proxy -> origin.
Neden Edge Katmanı Bu Kadar Fazla İş Yapar
Edge Katmanı İşini Kazanır
Bir geri proxy, aynı anda üç işi üstlenir. Her birinin katman için yeterli olduğu; tümünü aynı adres üzerinde taşıyabilen reason why almost every production web architecture looks the same shape at the front.
İş 1: Kökleri gizle. Proxy, bir halka IP'si üzerinde yanıt verir. Arka uçlar, internetin ulaşamayacağı özel IP'lerde bulunur. Proxy'ı ele geçirmek zorunda olan bir saldırgana karşı attacker who wants to hit the origin must first compromise the proxy.
İş 2: TLS sonlandır. Proxy, example.com için sertifikayı tutar ve gelen HTTPS isteklerini şifreler. Arka uçlar, proxy'ye güvendiği bir ağ segmenti üzerinden basit HTTP (veya daha basit iç TLS) ile proxy'a konuşur. Sertifika döngüsü, yenileme ve şifre politikası, bir yerlerde yaşamak üzere lives in one place.
İş 3: Yükü dağıt. Proxy, hangi arka uç tarafından her istekte yanıt verileceğini seçer. Proxy arkasında bir arka uç oluşturur; proxy, bir strateji (döngüsel-merdiven, en az bağlantı, bir başlık üzerinde hash) kullanarak her istekte bir seçer. Kapasiteyi artırmanın yolu, bir arka ucu havuzun içine eklemektir; istemcilere yeni bir adres söylemek zorunda değildir.
Her iş, küçük bir programdır. Birlikte, Python uygulamasından daha fazla tasarım ağırlığı taşıyan sadece 'Caddy'ın önünde bir Python uygulaması' katmanının neden bu kadar basit bir katman gibi göründüğünü açıklar.
Üç Tümünü Tasarlamak
Ekibiniz, tek bir Python sürecinde çalışan küçük bir API çalıştırır. Trafiğin büyüğü kadar ki artık tek bir VM'nin tutamadığı ve VM'nin kendi TLS sertifikası ile halka IP'ye sahip olduğu bir güvenlik inceleği tarafından işaret edildi.
Önüne bir geri proxy koymaya karar verin. Şemayı çizmek için: DNS nereye işaret eder, sertifika nerede bulunur, yük orijinal VM'ye nasıl ulaşır ve orijinal VM'de ne değişir?
Bir bileşeni değiştirip herkesin fark etmediği bir durum yarat
İndirgeme Özgürlük Alır
Bilgisayar bilimi adalarında eski bir ilke vardır: her sorun çözülebilir ek bir indireksiyon katmanı ekleyerek (katman sayısı çok fazla olan sorun hariç). Dağıtılmış sistemlerde en yararlı indireksiyonlardan biri ters proxy'dir.
Size ne sağlıyor:
- Değiştirilebilir backends. Uygulamayı Python'dan Go'ya taşıyalım mı? Bir veri merkezinden diğerine mı göç edelim? Sıfır kesintiyle yeni bir sürümünü yayınlamak mı? Her biri, kararlı bir public adres arkasında gerçekleşir. Kullanıcılar için hiçbir şey değişmez.
- Bağımsız ölçeklendirme. Proxy katmanı TLS katmanında CPU ve bant genişliği üzerine ölçülür. Arka uç katmanı uygulamaya göre ölçülür. Her biri kendi bağımsız ekseninde büyür çünkü farklı makinelerde yaşar.
- Hata izolasyonu. Arka uctta kötü bir dağıtımı yaparsanız, public adresi devre dışı bırakmaz. Proxy kalır; bir düzeltme yüklersiniz veya geri çekersiniz; dünya, arka uç tekrar geri döndüğünde bağlantısını yeniden kurar.
- Bir yerdeki kesmeleme konuları. Hız limiti, coğrafi engelleme, talep günlüğü, başlık yeniden yazma, önbellek, yanıt sıkıştırma: tüm bunlar proxy'de olur. Arka uç kodu sadece uygulama üzerinde odaklanır.
Proxy olmadan her biri uygulamanın içinde yaşamak zorunda kalır. Proxy ile bunlar sadece bir katman olur ve bu katmanı bir ekip yönetir.
Maliyet: başka bir katman işletmek maliyeti. Uyumlu ekipler, proxy katmanının kendisinin stateless ve yatay olarak ölçeklendirildiğini kabul ederler; bir proxy'yi ikiyle değiştirmek için koordinasyon gerektirmez.
Proxy üzerinden Mavi/Sarı Dağıtımı
Ekibiniz API'nin 1. sürümünü üç arka uç VM (mavi havuzu) arkasında bir ters proxy üzerinden çalıştırıyor. Sürüm 2'yi yayınlamak ve yanlış bir şey olursa geri dönüş süresi otuz saniyeden daha kısa sürede yapılabilmesini istiyor.
Sürüm 2'yi çalıştıran üç yeni arka uç VM (sarı havuzu) başlatın, mavi havuzuyla yan yana ama onlara herhangi bir trafik göndermeden önce ama hala trafiği onlara yönlendirmeden önce.
Tarayıcıdan Arka Uygulamaya ve Geri
Bir HTTPS GET İstemini Sonundan Sonuına İzle
Proxy'nın arkasında bir arka uç havuzu önünde https://api.example.com/users/42'yi takip eden bir ters proxy aracılığıyla tek bir HTTPS GET izleyin.
Atım 1: DNS çözümü. Tarayıcı, api.example.com'i bir çözücüden sorar. Çözücü, proxy'nin halka IP'sini (ör. 203.0.113.10) geri verir. Tarayıcı, 203.0.113.10:443'e bir TCP bağlantısı açar.
Atım 2: TLS el sıkışması. Proxy, api.example.com için sertifikasını sunar. Tarayıcı, sertifikayı doğrular, iki taraf arasında bir oturum anahtarı anlaşılır ve şifreli kanal açılır.
Atım 3: TLS içinde HTTP isteği. Tarayıcı, GET /users/42 HTTP/1.1\nHost: api.example.com\n...'yi gönderir. Proxy, isteği şifreler.
Atım 4: Arka uç seçimi. Proxy, api.example.com için upstream havuzuna bakar ve bir arka uç seçer (ör. 10.0.0.21:8000) kendi yük dengesizliği stratejisi kullanılarak.
Atım 5: Üst bilgisayaraya istek. Proxy, 10.0.0.21:8000'e (veya yeniden kullanmak için) bir basit HTTP bağlantısı açar ve isteği yönlendirir. Proxy, başlıkleri değiştirirken ilerler: X-Forwarded-For: <client-ip> ekler, Host: doğru şekilde ayarlar, başlıkleri hop-by-hop gibi siler.
Atım 6: Arka uç işleme. Arka uç uygulaması isteği okur, veritabanına sorgular ve bir JSON cevabı oluşturur.
Atım 7: Üst bilgisayaradan yanıt. Arka uç, cevabı proxy'ye basit HTTP üzerinden geri gönderir.
Atım 8: Kıyı cevabı. Proxy, cevabı yeniden yazabilir veya sıkıştırabilir ve TLS oturumunu yeniden kullanarak şifreler ve tarayıcıya geri gönderir.
Atım 9: Bağlantı yaşam döngüsü. TLS oturumu genellikle sonraki isteğe kadar açık kalır (HTTP/2, bir bağlantı üzerinde birçok isteği aynı anda kullanarak çoklupleksler). Proxy-arka uç bağlantısı genellikle yeniden kullanmak için havuzlanır.
Herhangi bir halka web hizmeti bu şekli takip eden bir varyant izler. Atımları bilmek, gecikmeyi neden olduğu konusunda düşünmek, izlemekte ve başarısızlıkta gizlenebilecek yerleri anlamak yardımcı olur.
Zaman Nerede Kaldı?
Bir kullanıcı API'nin yavaş olduğunu şikayet ediyor. İstemi ölçüyor ve toplamda 850 ms sürenin istemi aldığını görüyor. Arka uç server logları ise isteği 40 ms içinde sunduğunu gösteriyor. Proxy logları ise proxy'nin (TLS el sıkışması + yönlendirme + yanıt yazma) tarafında 50 ms harcadığını belirtiyor.
Yeni Bir Hizmet için Azaltılmış Kenar Tasarımı
Sendrom
Ön ve geri proxy arasındaki farkı, bir geri proxy'nin aynı anda üç işi üstlendiğini, kökeni gizlemenin her zaman değişiklikler yapmanız gerektiğinde getirilerini anladınız ve isteklerin kenar boyunca hop-hop şeklinde nasıl geçtiğini öğrendiniz.
Şimdi bunu uygulayın.
Küçük bir ekip, notes.example.com adlı yeni bir hizmet başlatma planıyor. Kullanıcılar kişisel notlar okuyacak ve yazacak. Ekip başlangıçta iki arka uç VM çalıştıracak ve bir yıl içinde on taneye çıkacak. Kullanıcılar için HTTPS, yeni sürümler için aşamalı başlatma ve arka uç IP'lerinin kamuya açılması istenmiyor.
Bu Kursun Sonrasında Nereye Gidiyor
Bu Kursun Sonrasında Nereye Gidiyor
Bu ders, kenar katmanının şeklini kurdu. Bu kursta dört ders daha bu üzerinde inşa edilir:
- Devreksiz Yatay Kalıtım: neden bir proxy katmanı (& arkasındaki backends) ucuzca katlanır ve patlamalar altındaki sayıları boyutlandırmak için matematik.
- Giriş / Çıkış Bölünmesi: neden sonunda beklenmedik şekilde başarısız olan tek bir proxy kutu, hem gelen hem giden trafiği işler ve katmanları nasıl böleriz.
- Hata Modları & Patlama Alanı: neden bir yapı değişikliği zincir reaksiyonlara dönüşür ve tekrar önlenmesini sağlayacak suçsuz eylem maddeleri nasıl yazmalısınız.
- Gözlenebilirlik & Kapasite: kenarında ne ölçmeyi öğrenin böylece kullanıcılar önce sorunları fark ederler.
Her ders tek başına geçerlidir. Birlikte size bir web-ölçekte bir filo üzerinde çalışan bir zihinsel model sunar.
Etkin ders: geometry_of_proxies_and_origins bu dersi bir yönlendirme grafiği olarak yeniden sunar ve istek yolunu grafolarla ne söyleyebileceğini keşfeder.
Mükemmel. İleri.