Nginx: Reverse Proxy ve SSL Yönetimi
Geleneksel web sunucularının yüksek trafik altındaki performans darboğazlarını aşmak için geliştirilen Nginx (okunuşuyla Engine-X), günümüzde sadece bir web sunucusu olmanın çok ötesine geçmiştir. Modern ağ mimarilerinde Nginx; yük dengeleyici (load balancer), HTTP önbelleği ve en önemlisi Reverse Proxy (Ters Vekil Sunucu) olarak kritik bir rol oynar.
Özellikle Python (Flask, Django) veya Node.js gibi modern uygulama geliştirme ortamlarında, uygulamanın kendisini doğrudan internete açmak güvenlik ve performans açısından risklidir. Nginx, internet ile uygulamanız arasına girerek bir kalkan görevi görür.
Nginx'i Neden Tercih Ediyoruz?
Nginx'in asenkron ve olay güdümlü (event-driven) mimarisi, her bir bağlantı için yeni bir işlem (thread) açmak yerine, tek bir iş parçacığı üzerinden on binlerce eşzamanlı bağlantıyı yönetebilmesini sağlar. Bu da minimum CPU ve RAM tüketimi ile maksimum verim anlamına gelir.
Temel kullanım senaryoları şunlardır:
-
Reverse Proxy: Dışarıdan gelen istekleri karşılayıp, arka planda çalışan (örn. 127.0.0.1:5000) uygulama sunucusuna iletir.
-
SSL Termination: Şifreleme ve şifre çözme (kriptografi) yükünü uygulama sunucusundan alır. Tüm SSL sertifikaları doğrudan Nginx üzerinde yapılandırılır.
-
Statik Dosya Sunumu: CSS, JavaScript ve görsel dosyalarını uygulamanıza (örn. Gunicorn veya uWSGI) hiç uğratmadan doğrudan diskten, çok yüksek hızda sunar.
-
Ağ Segmentasyonu: İnternet trafiği sadece Nginx'in dinlediği portlara (80 ve 443) ulaşır. Veritabanı (PostgreSQL vb.) ve uygulama sunucuları kapalı bir ağda dış dünyadan izole şekilde güvende kalır.
Server Blocks (Virtual Hosts) ve Güvenli Yayınlama
Nginx, tek bir sunucu üzerinden birden fazla web sitesini veya uygulamayı barındırmanıza olanak tanıyan Server Blocks yapısını kullanır. Kurumsal bir web uygulamasını güvenli bir şekilde dışarıya açarken en çok başvurulan yapılandırma, tüm güvensiz HTTP (Port 80) trafiğini zorunlu olarak HTTPS'e (Port 443) yönlendirmek ve lokal SSL sertifikalarını araya koymaktır.
Aşağıda, kurumsal bir iç uygulamanın dışarıya güvenli bir şekilde açılmasını sağlayan örnek bir yapılandırma görebilirsiniz:
# 1. Aşama: HTTP'den HTTPS'e Zorunlu Yönlendirme
server {
listen 80;
server_name portal.sirket.local;
# Gelen tüm güvensiz istekleri 443 portuna yönlendir
return 301 https://$host$request_uri;
}
# 2. Aşama: SSL Termination ve Reverse Proxy
server {
listen 443 ssl;
server_name portal.sirket.local;
# Lokal SSL sertifika yolları
ssl_certificate /etc/nginx/ssl/kurumsal_cert.pem;
ssl_certificate_key /etc/nginx/ssl/kurumsal_key.pem;
# Güvenlik başlıkları (Best Practices)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
# Trafiği arka planda çalışan Flask/Uygulama sunucusuna ilet
proxy_pass http://127.0.0.1:5000;
# Orijinal istemci IP'sini ve protokol bilgilerini uygulamaya taşı
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;
}
}
Yapılandırmanın Kritik Noktaları
-
return 301: Kullanıcı tarayıcısına adresihttp://olarak yazsa bile Nginx bu isteği uygulama sunucusuna ulaştırmadan doğrudan güvenli protokole yönlendirir. Bu, kurum içi uygulamalarda araya girme (Man-in-the-Middle) saldırılarını önler. -
proxy_pass: Uygulamanın dış dünyadan izole bir şekilde sadece localhost üzerinden yayın yapmasına olanak tanır. -
X-Forwarded-For: Nginx araya girdiği için, uygulama sunucusu varsayılan olarak gelen tüm istekleri Nginx'ten (127.0.0.1) geliyormuş gibi görür. Bu başlıklar, kullanıcıların gerçek IP adreslerini uygulamanın loglarında veya veritabanı kayıtlarında görebilmeniz için kritik öneme sahiptir.
Nginx, esnek yapısı sayesinde önünde FortiWeb gibi bir WAF (Web Application Firewall) bulunan ortamlarda da sorunsuz entegre olarak tam kapsamlı bir web güvenliği mimarisi oluşturmanıza yardımcı olur.
yazar: Asrın Haktan Şahin
