Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Nginx'te HTTPS, Security Header'ları, Rate Limiting ve Load Balancing
Nginx'te TLS termination, http2 on ve listen quic ile HTTP/3, add_header_inherit merge ile kaybolmayan security header'ları, tek yerden HSTS, limit_req ile 429 ve upstream zone'u olmadan round robin'in dengesiz dağıldığı gerçek koşularla. ip_hash, 1.29.6 ile gelen sticky cookie ve max_fails ile passive health check: bir instance ölünce client tek hata görmüyor, ama idempotent olmayan istekler ve sağlıksız ama ayakta process'ler ayrı ele alınmalı.
Nginx ile Angular Yayınlamak: SPA Fallback, Cache Header'ları, Compression ve /api Proxy
Angular'ı Nginx ile yayınlarken try_files ile SPA fallback, hash'li bundle'lara immutable ve index.html'e no-cache şart; aksi hâlde deploy sonrası eski chunk'ı isteyen tarayıcı 200 ile HTML alıyor. gzip_static, runtime config.json, aynı origin'de /api proxy ile CORS'suz kurulum, base href ile alt yolda yayın ve Angular SSR'ı Node ile Nginx arkasına koyarken allowedHosts tuzağı gerçek koşularla.
Nginx ile ASP.NET Core Reverse Proxy: proxy_pass, Header'lar, WebSocket/SignalR ve Timeout'lar
Nginx 1.29.7'den beri upstream keepalive ve HTTP/1.1 varsayılan, ama yalnız upstream block'u kullanırsan: doğrudan adrese giden proxy_pass her istekte yeni bağlantı açıyor. Microsoft'un referans config'ini satır satır açıyor, WebSocket upgrade map'i olmadan SignalR'ın sessizce long polling'e düştüğünü, SSE'de buffering'i, Nginx ile Kestrel'in body ve header limit'lerini hizalamayı ve 502 ile 504'ü log'dan ayırt etmeyi ölçüyoruz.
Nginx Temelleri: Kurulum, nginx.conf Yapısı, server ve location Block'ları
Nginx'i nginx.org deposundan kurmak güncel stable dalı (1.30) verir; Ubuntu 24.04'ün paketi 1.24'te kalıyor. Master ve worker process'leri, nginx.conf context'lerini, default_server ile bilinmeyen host'u reddetmeyi, location eşleşme algoritmasını (=, en uzun prefix, ^~, regex), root ile alias farkını, proxy_pass'teki sondaki slash'i ve bozuk config ile reload ve restart'ın farklı sonuçlarını gerçek koşularla görüyoruz.
Reverse Proxy Arkasında ASP.NET Core: Forwarded Headers, KnownIPNetworks ve Doğru Client IP
Proxy arkasındaki uygulama client'ın IP'sini ve HTTPS'i ancak UseForwardedHeaders doğru kurulursa görür: hangi header'ların işleneceğini söylemek ve proxy'nin adresini KnownProxies ya da .NET 10'daki KnownIPNetworks'e eklemek gerekir. HTTPS redirection döngüsünü, ASPDEPR005 uyarısını, ForwardLimit ile sahte X-Forwarded-For'u, X-Forwarded-Prefix ile PathBase'i ve birden fazla instance'ta Data Protection key'lerini gerçek koşularla görüyoruz.
Kestrel'i Tanımak: Endpoint'ler, ASPNETCORE_HTTP_PORTS, Limit'ler ve HTTP/2–HTTP/3
Kestrel'in dinlediği adresi kodda Listen, Kestrel:Endpoints, --urls/ASPNETCORE_URLS ve ASPNETCORE_HTTP_PORTS belirler; öncelik bu sırayla ve ezilen her ayar log'a uyarı olarak düşer. Dokuz koşuyla önceliği ölçüyor, PEM certificate ve SNI'yi, restart'sız certificate yenilemeyi, varsayılan limit'leri, libmsquic ile HTTP/3'ü, Nginx'e Unix socket ile bağlanmayı ve container'da localhost tuzağını görüyoruz.
Web Server, Application Server ve Reverse Proxy: Bir HTTP İsteği Uygulamana Nasıl Ulaşır?
Kestrel hem web server hem application server; reverse proxy ise isteği karşılayıp arkadaki uygulamaya ileten, TLS termination, statik dosya, compression, buffering ve load balancing'i üstlenen katman. Aynı isteği önce doğrudan Kestrel'e, sonra Nginx üzerinden gönderip uygulamanın gördüğü IP'yi, header'ları ve Angular deep link davranışını karşılaştırıyor, beş hosting topolojisini yan yana koyuyoruz.
Uçtan Uca Zero-Downtime: Bookstore'u GitHub Actions ile Blue-Green ve Canary Deploy Etmek
Serinin bütün parçaları tek bir GitHub Actions workflow'unda: image'ı bir kez build et, migration gate'i ve expand migration bundle'ı, boştaki renge deploy, preview'den smoke test, %10 ve %50 canary gate'leri, tam geçiş ve manuel rollback job'ı. act ile yerelde koşulan pipeline başarıdan önce dört kez düştü: Down()'ı tarayan gate, act'in artifact v7 uyumsuzluğu, eski renge bakan preview ve yetersiz canary trafiği.
Rollback mı Roll Forward mı? Geri Alma Planı, Kill Switch ve Otomatik Geri Dönüş Kriterleri
Geri dönüşün dört yolu var: kill switch, artifact rollback, roll forward ve etkiyi sınırlamak; seçim flag'e, önceki artifact'ın hazırlığına ve şemanın uyumuna bağlı. Atomik symlink switch, Down migration'ın kolonu geri getirip 300.004 ismi getirememesi, merge commit'in git revert'ü, %20 hatalı sürümü 10 sn'de geri alan otomatik tetikleyici (85 istekten 18'i hata), runbook template'i ve DORA ile ölçüm.
Feature Flag'ler: Deploy'u Release'ten Ayırmak, Microsoft.FeatureManagement ve OpenFeature
Feature flag kodu deploy edip davranışı bir config değişikliğiyle release etmeyi sağlar. Microsoft.FeatureManagement 4.8 ile targeting (1000 kullanıcıda %10,1, kullanıcıya sabit), variant'lar, minimal API'de WithFeatureGate ve 0,4 sn'de etkili olan kill switch; Angular'da signal tabanlı flag service ve test edilmiş structural directive; OpenFeature'ın preview provider'ında targeting'li boolean flag'in false dönmesi ve flag borcu.
Migration'ların Deploy'daki Yeri: Expand-Contract, EF Core Migration Bundle ve Geriye Uyumlu Şema
Bir kolonu iki sürüm yan yana çalışırken güvenle bölmek üç deploy ister: ekle ve çift yaz, yeni kolonlara geç, eskiyi kaldır. PostgreSQL'de 300.000 satırla gerçek koşular: v1 ve v2'nin aynı şemada birlikte çalışması, CONCURRENTLY index'in transaction hatası, Npgsql'in transaction'a bağlı migration kilidi yüzünden paralel bundle'larda deadlock, 8 sn kilitleyen UPDATE yerine 135 ms'lik batch'ler ve DROP COLUMN'u durduran review gate.
Canary Release: Trafiği Yüzdeyle Açmak, Metrik ile Karar Vermek ve Otomatik Analiz
Canary yeni sürümü trafiğin küçük bir payıyla çalıştırır ve aynı anda çalışan control ile karşılaştırarak karar verir. Nginx'te weight (900/100, yapışkan değil), split_clients ile kullanıcıya yapışan canary ve boş anahtar tuzağı, 1.30'un sticky cookie'si; 4.000 istekte %4,80'e %0 fark ama 19 istekte anlamsız sonuç, WAIT/ABORT/PROMOTE veren gate, Gateway API weight'leri ve Argo Rollouts'un hatalı sürümü otomatik durdurması.