Nginx Reverse Proxy ve SSL ile Güvenli ve Etkili Uygulama Sunumu
Günümüzün modern web mimarilerinde, uygulamalar genellikle tek bir sunucu üzerinde barındırılmaz; bunun yerine, mikroservisler, API’ler ve çeşitli backend bileşenlerinden oluşan dağıtık sistemler haline gelirler. Bu karmaşık yapıların istemcilere güvenli, performanslı ve tutarlı bir şekilde sunulması için bir reverse proxy (ters vekil) büyük önem taşır. Nginx, hafifliği, yüksek performansı ve esnek yapılandırma yetenekleriyle bu görev için ideal bir araçtır.
Bu blog yazısında, Nginx’i bir reverse proxy olarak nasıl yapılandıracağınızı ve Let’s Encrypt aracılığıyla SSL/TLS şifrelemesini nasıl entegre edeceğinizi adım adım inceleyeceğiz. Bu sayede uygulamanızın güvenliğini artıracak ve modern web standartlarına uygun hale getireceksiniz.
Neden Nginx Reverse Proxy Kullanmalısınız?
- Güvenlik: Backend sunucularınızın doğrudan internete açık olmasını engeller, potansiyel saldırı yüzeyini azaltır.
- SSL/TLS Sonlandırma: SSL şifrelemesini proxy seviyesinde sonlandırarak backend sunucularınızın yükünü azaltır ve sertifika yönetimini merkezileştirir.
- Yük Dengeleme: Gelen istekleri birden fazla backend sunucuya dağıtarak uygulamanızın ölçeklenebilirliğini ve erişilebilirliğini artırır.
- Önbellekleme (Caching): Sık erişilen statik veya dinamik içerikleri önbelleğe alarak yanıt sürelerini iyileştirir ve backend yükünü azaltır.
- URL Yönlendirme ve Yeniden Yazma: İstemci tarafında karmaşıklık yaratmadan URL yapılarını yönetmenizi sağlar.
- Statik Dosya Sunumu: Statik dosyaları (resimler, CSS, JS) doğrudan ve hızlı bir şekilde sunarak backend sunucunuzun iş yükünü azaltır.
Ön Gereksinimler
Başlamadan önce aşağıdaki maddelerin hazır olduğundan emin olun:
- Bir Linux sunucusu (Ubuntu veya CentOS tavsiye edilir)
- Nginx’in kurulu olması (
sudo apt update && sudo apt install nginxveyasudo yum install nginx) - Yapılandırılacak bir alan adı (örneğin,
sizin-alanadiniz.com) - Bu alan adının DNS kaydının Nginx sunucunuzun IP adresine yönlendirilmiş olması (A kaydı)
- Proxy’lenecek bir backend uygulaması veya servisi (örneğin,
http://localhost:3000veyahttp://192.168.1.100:8080) - Certbot aracı için root veya sudo erişimi
Temel Nginx Reverse Proxy Yapılandırması
Nginx yapılandırması genellikle /etc/nginx/nginx.conf ana dosyasında veya daha iyi bir uygulama olarak /etc/nginx/sites-available/ dizinindeki ayrı bir dosyada yapılır ve bu dosya /etc/nginx/sites-enabled/ dizinine sembolik olarak bağlanır.
Yeni bir yapılandırma dosyası oluşturalım: sudo nano /etc/nginx/sites-available/sizin-alanadiniz.com
server {
listen 80; # Gelen HTTP isteklerini dinle
server_name sizin-alanadiniz.com www.sizin-alanadiniz.com; # Alan adınızı buraya yazın
location / {
proxy_pass http://localhost:3000; # Backend uygulamanızın adresi ve portu
}
}
Bu temel yapılandırma, sizin-alanadiniz.com adresine gelen tüm HTTP isteklerini localhost:3000 adresindeki backend uygulamanıza iletecektir.
Önemli Proxy Başlıkları (Headers)
Backend uygulamanızın istemci hakkında doğru bilgilere sahip olması, özellikle IP adresleri ve protokol bilgisi açısından önemlidir. Nginx bu bilgileri proxy başlıkları aracılığıyla iletebilir:
Host: Orijinal istekteki Host başlığını backend’e iletir. Backend’deki çoklu sanal host yapılandırmaları için kritik öneme sahiptir.X-Real-IP: İstemcinin gerçek IP adresini backend’e iletir.X-Forwarded-For: Bir isteğin bir proxy veya yük dengeleyici zincirinden geçerken aldığı tüm IP adreslerini gösteren bir listedir.X-Forwarded-Proto: İstemcinin Nginx’e bağlanmak için kullandığı protokolü (HTTP veya HTTPS) backend’e bildirir. Bu, backend uygulamasının doğru URL’ler oluşturması için önemlidir.
Yukarıdaki location bloğunu aşağıdaki gibi güncelleyelim:
location / {
proxy_pass http://localhost: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; # Nginx ile istemci arasındaki protokol (http/https)
}
SSL/TLS Ekleme (Let’s Encrypt ile)
Web sitenizin güvenliğini sağlamak, kullanıcı verilerini korumak ve SEO sıralamanızı iyileştirmek için SSL/TLS kullanmak vazgeçilmezdir. Let’s Encrypt, ücretsiz SSL/TLS sertifikaları sağlayan harika bir servistir ve Certbot aracı bu sertifikaları otomatik olarak almanızı ve Nginx ile yapılandırmanızı kolaylaştırır.
Certbot Kurulumu ve Sertifika Alma
İlk olarak, Certbot’u sunucunuza kurun. Ubuntu için:
sudo apt update
sudo apt install certbot python3-certbot-nginx
Sertifikaları almak ve Nginx yapılandırmasını otomatik olarak güncellemek için Certbot’u çalıştırın:
sudo certbot --nginx -d sizin-alanadiniz.com -d www.sizin-alanadiniz.com
Certbot, size e-posta adresi soracak, hizmet şartlarını kabul etmenizi isteyecek ve HTTP trafiğini HTTPS’e yönlendirip yönlendirmeyeceğinizi soracaktır (genellikle “2” seçeneğini seçerek yönlendirmeyi onaylayın). Bu işlem, /etc/nginx/sites-available/sizin-alanadiniz.com dosyanızı otomatik olarak güncelleyecektir.
Nginx SSL Yapılandırması (Certbot sonrası)
Certbot’un otomatik olarak yaptığı güncellemeyi inceleyelim. Dosyanız yaklaşık olarak aşağıdaki gibi görünecektir:
server {
listen 80;
server_name sizin-alanadiniz.com www.sizin-alanadiniz.com;
return 301 https://$host$request_uri; # HTTP'den HTTPS'e yönlendirme
# certbot tarafından eklenenler:
# listen 443 ssl; # managed by Certbot
# ssl_certificate /etc/letsencrypt/live/sizin-alanadiniz.com/fullchain.pem; # managed by Certbot
# ssl_certificate_key /etc/letsencrypt/live/sizin-alanadiniz.com/privkey.pem; # managed by Certbot
# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
# ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
listen 443 ssl;
server_name sizin-alanadiniz.com www.sizin-alanadiniz.com;
ssl_certificate /etc/letsencrypt/live/sizin-alanadiniz.com/fullchain.pem; # Certbot yolu
ssl_certificate_key /etc/letsencrypt/live/sizin-alanadiniz.com/privkey.pem; # Certbot yolu
include /etc/letsencrypt/options-ssl-nginx.conf; # Certbot tarafından eklenen güvenlik ayarları
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Certbot tarafından eklenen Diffie-Hellman parametreleri
# Güvenlik En İyi Uygulamaları (Opsiyonel ama Şiddetle Tavsiye Edilir)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s; # DNS çözümleyicilerinizi ayarlayın
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; # HSTS
location / {
proxy_pass http://localhost:3000; # Backend uygulamanız
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_redirect off; # Bazı durumlarda backend uygulamasının yönlendirmelerini düzeltmek için
}
}
Certbot, HTTP trafiğini HTTPS’e yönlendiren bir server bloğu ve SSL sertifikalarını kullanan yeni bir server bloğu oluşturmuştur. options-ssl-nginx.conf dosyası, Certbot tarafından önerilen güçlü güvenlik ayarlarını içerir. Yukarıdaki ek ssl_protocols, ssl_ciphers ve HSTS gibi ayarlarla güvenliğinizi daha da artırabilirsiniz.
Nginx Yapılandırmasını Test Etme ve Yeniden Yükleme
Yapılandırma dosyanızı kaydettikten sonra, Nginx sözdizimini kontrol etmek kritik öneme sahiptir:
sudo nginx -t
Eğer “test is successful” (yapılandırma başarılı) mesajını alırsanız, Nginx servisini yeniden yükleyerek yeni yapılandırmayı uygulayabilirsiniz:
sudo systemctl reload nginx
Artık tarayıcınızdan alan adınıza (https://sizin-alanadiniz.com) erişebilir ve Nginx’in isteği güvenli bir şekilde backend uygulamanıza ilettiğini görebilirsiniz.
Gelişmiş Konfigürasyon Notları
- Yük Dengeleme: Birden fazla backend sunucunuz varsa,
upstreambloğu ile yük dengeleme yapabilirsiniz.upstream backend_servers { server 192.168.1.100:8080; server 192.168.1.101:8080; } # location bloğunda: proxy_pass http://backend_servers; - Önbellekleme: Nginx’i sık erişilen içerikler için bir önbellek sunucusu olarak kullanabilirsiniz.
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off; server { location / { proxy_cache my_cache; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; # ... } } - WebSockets: WebSocket tabanlı uygulamalar için özel proxy ayarları gerekebilir:
proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
Sonuç
Nginx’i bir reverse proxy olarak kullanmak, web uygulamalarınızın güvenliğini, performansını ve esnekliğini önemli ölçüde artıran güçlü bir yöntemdir. SSL/TLS entegrasyonu ile (özellikle Certbot gibi araçlarla) trafiğinizi şifrelemek ve modern güvenlik standartlarını karşılamak artık çok daha kolaydır. Bu yapılandırmalar sayesinde, kullanıcılarınıza daha hızlı, daha güvenli ve daha güvenilir bir deneyim sunabilirsiniz.
Unutmayın, her yapılandırma senaryosu benzersizdir. Bu blog yazısı temel bir başlangıç noktası sunar; uygulamanızın özel ihtiyaçlarına göre Nginx yapılandırmasını daha da optimize etmekten çekinmeyin.
