Nginx Reverse Proxy Yapılandırması: Güvenli ve Performanslı Mimari Kurulumu
Modern web mimarilerinde Nginx reverse proxy kullanımının temelleri, SSL/TLS sonlandırma süreçleri ve üretim ortamına yönelik adım adım yapılandırma rehberi.
Caner Serbest
Sistem ve Altyapı
4 dk okuma
Nginx Reverse Proxy Yapılandırması: Güvenli ve Performanslı Mimari Kurulumu
Modern web uygulamaları genellikle tek bir monolitik yapıdan ziyade, mikro servisler, konteynerler ve farklı portlar üzerinde koşan arka plan (backend) servislerinden oluşur. Bu dağıtık yapıyı dış dünyaya güvenli, hızlı ve tek bir kapıdan sunmak ise sistem yöneticilerinin temel sorumlulukları arasındadır. Bu senaryoda en çok tercih edilen ve endüstri standardı haline gelen araçların başında Nginx gelir.
Bu yazıda, Nginx’in bir reverse proxy olarak nasıl konumlandırılacağını, iç ağdaki servislerin dış dünyaya güvenli bir şekilde nasıl açılacağını, SSL/TLS sonlandırma işlemlerinin (SSL Termination) nasıl yapılacağını ve üretim ortamı (production) için dikkat edilmesi gereken performans optimizasyonlarını ele alacağız.
Reverse Proxy Nedir ve Neden Kullanılır?
Klasik bir web mimarisinde istemciler (tarayıcılar) doğrudan web sunucusuna bağlanır. Ancak reverse proxy mimarisinde, dışarıdan gelen tüm istekler önce Nginx gibi bir proxy sunucusuna ulaşır. Nginx bu isteği alır, arkadaki (upstream) uygun uygulama sunucusuna iletir, gelen yanıtı alır ve tekrar istemciye geri döner.
Bu yaklaşımın sağladığı temel avantajlar şunlardır:
- Güvenlik: Arka plandaki sunucular (Node.js, Python, Go vb.) doğrudan internete maruz kalmaz. Doğrudan hedef alınamadıkları için saldırı yüzeyi (attack surface) daralır.
- Merkezi SSL/TLS Yönetimi: Sertifikalar her bir uygulama sunucusunda ayrı ayrı yönetilmek yerine tek bir noktada (Nginx üzerinde) toplanır.
- Yük Dengeleme (Load Balancing): Gelen trafik, birden fazla arka plan sunucusuna dağıtılarak sistemin ölçeklenebilirliği artırılır.
- Önbellekleme ve Sıkıştırma: Statik dosyalar veya sık kullanılan yanıtlar Nginx seviyesinde önbelleğe alınarak arka uç sunucuların yükü hafifletilir.
Temel Mimari Senaryo
Bu rehberde ele alacağımız senaryo şu şekildedir:
- İstemci: İnternet üzerinden gelen HTTP/HTTPS istekleri.
- Nginx (Reverse Proxy): 80 ve 443 portlarında dinleme yapar, gelen istekleri karşılar ve SSL işlemlerini çözer.
- Backend Servis: İç ağda veya localhost üzerinde
3000portunda çalışan bir uygulama (örneğin bir Node.js veya Go servisi).
Adım Adım Nginx Reverse Proxy Kurulumu
1. Nginx Kurulumu
Öncelikle hedef Linux sunucumuzda Nginx’in kurulu olduğundan emin olalım. Ubuntu/Debian tabanlı bir sistem kullanıyorsanız:
sudo apt update
sudo apt install nginx -y
Servisin çalışır durumda olduğunu ve sistem başlangıcında aktifleştiğini kontrol edin:
sudo systemctl start nginx
sudo systemctl enable nginx
2. Upstream ve Server Bloklarının Yapılandırılması
Nginx konfigürasyonları genellikle /etc/nginx/sites-available/ dizini altında tutulur ve /etc/nginx/sites-enabled/ dizinine sembolik bağ (symlink) verilerek aktif hale getirilir.
/etc/nginx/sites-available/uygulama.com adında yeni bir dosya oluşturun:
# Arka plandaki uygulama sunucularını tanımlıyoruz
upstream node_backend {
server 127.0.0.1:3000;
# Birden fazla sunucu varsa buraya eklenebilir:
# server 127.0.0.1:3001;
}
server {
listen 80;
server_name uygulama.com www.uygulama.com;
# HTTP isteklerini doğrudan HTTPS'e yönlendiriyoruz
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name uygulama.com www.uygulama.com;
# SSL Sertifika Yolları (Let's Encrypt örneği)
ssl_certificate /etc/letsencrypt/live/uygulama.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/uygulama.com/privkey.pem;
# Modern ve Güvenli SSL Parametreleri
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
# Log Kayıtları
access_log /var/log/nginx/uygulama_access.log;
error_log /var/log/nginx/uygulama_error.log;
location / {
proxy_pass http://node_backend;
# Kritik Proxy Header Tanımlamaları
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
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;
# Zaman Aşımı (Timeout) Ayarları
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
3. Yapılandırma Detaylarının İncelenmesi
Yukarıdaki blokta yer alan bazı kritik direktifler, uygulamanın sağlıklı çalışması için hayati önem taşır:
proxy_set_header Host $host;: İstemcinin orijinal host bilgisini arka plandaki uygulamaya iletir. Bu, uygulamanın doğru alan adı üzerinden link üretmesi için gereklidir.proxy_set_header X-Real-IPveX-Forwarded-For: Arka plandaki uygulamanın, istek yapan kullanıcının gerçek IP adresini görmesini sağlar. Aksi takdirde tüm istekler Nginx sunucusunun IP adresinden geliyormuş gibi görünür.proxy_set_header X-Forwarded-Proto $scheme;: İsteğin HTTP mi yoksa HTTPS mi geldiğini arka uç uygulamaya bildirir.
4. Yapılandırmayı Aktif Etme ve Test Etme
Dosyayı kaydettikten sonra Nginx sözdiziminde (syntax) bir hata olup olmadığını kontrol edin:
sudo nginx -t
Eğer çıktıda syntax is ok ve test is successful mesajlarını alıyorsanız, yapılandırmayı etkinleştirmek için dosyayı sites-enabled dizinine bağlayın:
sudo ln -s /etc/nginx/sites-available/uygulama.com /etc/nginx/sites-enabled/
Varsayılan konfigürasyon çakışmalarını önlemek için /etc/nginx/sites-enabled/default dosyasını kaldırabilirsiniz:
sudo rm /etc/nginx/sites-enabled/default
Son olarak Nginx servisini yeniden yükleyin:
sudo systemctl reload nginx
Üretim Ortamı İçin İleri Düzey İpuçları ve En İyi Uygulamalar
Bir reverse proxy yapılandırması sadece çalışır hale getirmekle bitmez. Uzun vadeli kararlılık ve güvenlik için şu noktalara dikkat edilmelidir:
1. Güvenlik Başlıkları (Security Headers)
Tarayıcı tabanlı saldırıları (XSS, Clickjacking vb.) önlemek için Nginx seviyesinde bazı HTTP başlıkları eklemek iyi bir pratiktir:
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
2. Dosya Yükleme Boyutu Sınırları
Eğer uygulamanız üzerinden dosya yüklemesi (file upload) yapılacaksa, Nginx’in varsayılan istek boyutu sınırı (1MB) sorun yaratabilir. server veya location bloğu içinde bu değeri artırmanız gerekebilir:
client_max_body_size 50M;
3. Keepalive Bağlantılar
Performansı artırmak ve her istek için yeni TCP bağlantısı açma maliyetini düşürmek adına upstream bloğunda keepalive bağlantıları aktif edebilirsiniz:
upstream node_backend {
server 127.0.0.1:3000;
keepalive 32;
}
server {
location / {
proxy_pass http://node_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
Sorun Giderme (Troubleshooting)
Üretim ortamında karşılaşılan en yaygın hatalardan biri 502 Bad Gateway hatasıdır. Bu hata genellikle Nginx’in arka plandaki uygulama sunucusuna (127.0.0.1:3000) erişemediği anlamına gelir.
Sorunu çözerken şu adımları izleyebilirsiniz:
- Arka plandaki uygulamanın çalışıp çalışmadığını kontrol edin (
systemctl status uygulamaveyapm2 status). - Uygulamanın doğru portta dinleme yapıp yapmadığını doğrulayın (
ss -tulpn | grep 3000). - SELinux veya yerel güvenlik duvarı kurallarının (UFW) iç haberleşmeyi engellemediğinden emin olun.
- Nginx hata loglarını (
/var/log/nginx/error.log) inceleyerek detaylı hata kodunu analiz edin.
Sonuç
Nginx reverse proxy yapılandırması, doğru planlandığında ve en iyi pratikler uygulandığında web altyapınızın en güçlü ve güvenilir bileşenlerinden biri haline gelir. SSL sonlandırma, trafik yönlendirme ve güvenlik katmanlarını Nginx üzerinde merkezileştirerek arka uç servislerinizi izole edebilir, performansınızı artırabilir ve operasyonel sürdürülebilirliği sağlayabilirsiniz.
Bu yazı Gemini ile otomatik oluşturulmuştur.