Reverse proxy ile forward proxy
Forward proxy istemci için çalışır. Tarayıcı onu kullanacak şekilde ayarlanır ve o da tarayıcı adına internete gider — kurumsal çıkış filtrelemesi ve insanların "proxy" aradığında kastettiği şeyin çoğu budur.
Reverse proxy sunucu için çalışır. İstemcilerin varlığından haberi yoktur; alan adınızı çözerler, o cevap verir ve istekle ne yapılacağına o karar verir. Uygulamanız başka bir makinede, bir container'da ya da on makineye yayılmış olabilir.
Ayrım önemli çünkü arama sonuçları ikisini birbirine karıştırıyor. "Proxy sunucuları" hakkında bir sayfa site engeli aşmaktan bahsediyorsa, uygulamanızın önündeki şeyden bahsetmiyor demektir.
Gerçekte ne kazanırsınız
TLS sonlandırma. Sertifikalar her uygulama sunucusunda değil tek bir yerde yaşar. Yenileme tek bir iş hâline gelir.
Yönlendirme. Tek alan adı, birden çok arka uç: /api Node servisine, / WordPress'e, /static object storage'a. İstemci tek bir site görür.
Önbellekleme. Tekrar eden isteklere proxy kendisi cevap verir. Çoğu sitenin elindeki en büyük tek performans kazancı budur ve en sık kapalı bırakılanıdır.
Sıkıştırma. Brotli ya da gzip, her uygulamada ayrı ayrı değil, yığınınızın kenarında bir kez uygulanır.
Rate limiting ve filtreleme. Limitleri uygulayacağınız ve trafiği, çalışması para eden koda ulaşmadan engelleyeceğiniz bir yer.
Origin'i gizlemek. Uygulama sunucunuza yalnızca proxy'den erişilebiliyorsa, saldırıların sizin kontrol ettiğiniz kapıdan gelmesi gerekir.
Davranışı değiştirebileceğiniz bir yer. Uygulama deploy'u gerektirmeyen yönlendirmeler, başlık düzenlemeleri ve bakım sayfaları.
Çalışan bir nginx yapılandırması
Gerçekten doğru olan asgari hâli — aşağıdaki başlıklar isteğe bağlı süs değil, uygulamanızın proxy'yi değil istemciyi görmesini sağlayan şey:
``` server { listen 443 ssl; server_name example.com;
ssl_certificate /etc/ssl/example.com/fullchain.pem; ssl_certificate_key /etc/ssl/example.com/privkey.pem;
location / { proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } ```
Host — olmazsa arka uç 127.0.0.1 görür ve kurduğu her mutlak URL yanlış olur.
X-Forwarded-For ve X-Real-IP — olmazlarsa uygulama logunuzdaki her istek proxy'den gelir ve IP bazlı ne mantığınız varsa sessizce ziyaretçiye değil proxy'ye uygulanır.
X-Forwarded-Proto — olmazsa TLS sonlandırmanın arkasındaki bir uygulama kendini düz HTTP'de sanır ve http:// bağlantıları üretir; herkesin en az bir kez yarım gününü yiyen yönlendirme döngüsü de buradan çıkar.
Upgrade ikilisi — olmazsa WebSocket'ler çalışmaz ve arıza bir proxy sorunu değil uygulama hatası gibi görünür.
Proxy'de önbellekleme, kısaca
nginx, upstream yanıtlarını proxy_cache ile önbelleğe alabilir. Mekanik yeterince basit: bir önbellek yolu tanımlayın, location içinde etkinleştirin ve neyin ne kadar süreyle saklanacağına karar verin.
``` proxy_cache_path /var/cache/nginx keys_zone=site:50m max_size=5g inactive=24h;
location / { proxy_cache site; proxy_cache_valid 200 10m; proxy_cache_key "$scheme$request_method$host$request_uri"; add_header X-Cache-Status $upstream_cache_status; proxy_pass http://127.0.0.1:3000; } ```
Bunun yardımcı mı olacağını yoksa zarar mı vereceğini iki şey belirler.
Önbellek anahtarı. Varsayılan anahtar URI'nin tamamını içerir; yani ?utm_source=twitter temiz URL'den ayrı bir kayıt oluşturur. Bir kampanya, önbelleğinizi tek bir sayfanın binlerce kopyasına bölebilir ve isabet oranını sıfıra indirebilir. Yanıtı değiştirmeyen parametreleri ayıklayın.
Purge. Açık kaynak nginx'te purge mekanizması yoktur; ya TTL'in dolmasını beklersiniz ya da her makinede önbellek dizinindeki dosyaları elle silersiniz. "Kendi proxy'mizi işletiyoruz" tercihinin canınızı yakmaya başladığı yer genelde burasıdır, çünkü bir düzeltmeyi yayımlayıp görünmesi için on dakika beklemek kimsenin keyif aldığı bir akış değildir.
Kendinizinkini işletmek gerçekte neye mal olur
Tek bir uygulamanın önündeki tek bir nginx ucuzdur ve tamamen makuldür. Maliyet sonradan, parça parça gelir.
Tek bir makinedir. İçeri girmenin tek yolu olan bir reverse proxy, aynı zamanda ayakta kalmak zorunda olan tek şeydir. Onu yedekli hâle getirmek ikinci bir makine, bir yüzen adres ya da DNS yük devretmesi ve iki tarafta birebir aynı yapılandırma demektir.
Sertifikalar. Otomatik yenileme çözülmüş bir sorundur — ta ki ikinci düğümdeki yenileme kancası sessizce başarısız olana ve durumu bir tarayıcı uyarısından öğrenene kadar.
Düğümler arası önbellek geçersizleştirme. İki proxy'niz varsa iki önbelleğiniz vardır ve purge, ikisinde birden, güvenilir biçimde ve deploy hattınızdan yapılmalıdır.
Tek bir yerdedir. Ziyaretçileriniz değil. Bir veri merkezindeki proxy, başka bir ülkedeki kullanıcılara yakın olamaz; bu bir yapılandırma sorunu değil fizik sorunudur.
Ayar işi hiç bitmez. Arabellek boyutları, zaman aşımları, upstream'e keepalive, worker bağlantıları — bunların her biri bugünkü trafiğinizde doğru, on katında yanlıştır.
İşi ne zaman devretmeli
CDN, başkasının birçok lokasyonda işlettiği bir reverse proxy'dir. İşlevler aynıdır — TLS sonlandırma, önbellekleme, sıkıştırma, filtreleme, yönlendirme — farklar ise zor olan kısımlardadır: coğrafya, yedeklilik ve her düğümde anında purge.
Makul çizgi şu. Kendi proxy'nizi yerel iş yaptığı sürece tutun: tek bir makinenin ya da tek bir kümenin içinde servisler arası yönlendirme, iç duruma bağlı kurallar çalıştırma. Kendinizi dağıtım problemleri çözerken bulduğunuzda dışarıya bakan tarafı devredin — yedeklilik için ikinci bir düğüm, makineler arası önbellek purge'ü, sizinkine gidip gelen bir turu bekleyen başka ülkedeki ziyaretçiler.
Çoğu ekip ikisiyle birden devam eder ve makul düzen de budur: internete bakan bir CDN, içeride iyi olduğu yönlendirmeyi yapan küçük bir nginx. İstemeyeceğiniz şey, bir CDN'in ilk gün verdiği parçaları bir çeyrek boyunca ve kötü biçimde yeniden inşa etmektir.
Reverse proxy SSS
Reverse proxy ile yük dengeleyici aynı şey mi?
Örtüşürler. Yük dengeleyici istekleri birden çok arka uca dağıtır; reverse proxy ayrıca TLS'i sonlandırır, önbelleğe alır, yeniden yazar ve filtreler. nginx ikisini de yapar; terimlerin birbirinin yerine kullanılmasının sebebi de budur. Tek iş trafiği birbirinin aynı sunuculara yaymaksa, "yük dengeleyici" daha isabetli kelimedir.
Reverse proxy sitemi yavaşlatır mı?
Bir durak ekler; proxy origin'e yakınsa tek haneli milisaniyelerle ölçülür ve önbellekleme açıkken bundan çok daha fazlasını geri kazandırır — önbellekten dönen bir yanıt uygulamanıza hiç uğramaz. Zarar verdiği durum, hem kullanıcılarınızdan hem origin'inizden farklı bir bölgedeki proxy'dir.
Uygulamam neden ziyaretçi yerine proxy IP'sini görüyor?
Ya iletilen başlıklar eksik olduğu için ya da uygulama onlara güvenecek şekilde ayarlanmadığı için. İki yarım da gerekir: proxy X-Forwarded-For gönderir, çerçeveye de hangi proxy adreslerine inanabileceği söylenir. Başlığa her yerden güvenmek, istemcinin kendi IP'sini taklit etmesine izin verir.
Giriş yapılmış sayfaları önbelleğe alabilir miyim?
Varsayılan olarak hayır ve genelde istemeniz de gerekmez — bir kullanıcının başka bir kullanıcının panosunu görmesi böyle olur. Normal kalıp, oturum çerezi varken önbelleği atlamak ve çoğu sitede trafiğin büyük kısmını oluşturan anonim ziyaretçiler için cömertçe önbelleğe almaktır.
nginx proxy önbelleğini nasıl purge'lerim?
Açık kaynak nginx'te purge direktifi yoktur. Seçenekler: her düğümde önbellek dizinindeki ilgili dosyaları silmek, üçüncü taraf purge modülünü kullanmak ya da TTL'in dolmasını beklemek. Makineler arası istek üzerine purge, önbellek katmanını bir CDN'e taşıyarak elde ettiğiniz somut şeylerden biridir.