Veritabanı & DevOps

Nginx Konfigürasyonu: Performans, Güvenlik ve SSL

Fatih Algül
21.03.2026 316 görüntülenme

Nginx Nedir ve Neden Tercih Edilir?

Nginx, yüksek performanslı bir web sunucusu, reverse proxy ve load balancer olarak modern web altyapısının temel taşlarından biridir. Apache'ye kıyasla event-driven mimarisi sayesinde düşük bellek tüketimi ile binlerce eşzamanlı bağlantıyı kararlı biçimde yönetebilir. Bu yazıda Nginx'i performans, güvenlik ve SSL açısından nasıl optimize edeceğinizi adım adım inceleyeceğiz.

Performans Optimizasyonu

Worker Ayarları

Nginx'in performansının temelinde worker_processes ve worker_connections direktifleri yatar. Doğru yapılandırıldığında sunucunuzun kapasitesinden maksimum verim alabilirsiniz.

worker_processes auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 4096;
    multi_accept on;
    use epoll;
}
  • worker_processes auto: CPU çekirdek sayısına göre otomatik olarak worker sayısını belirler.
  • worker_connections: Her bir worker'ın aynı anda kabul edebileceği maksimum bağlantı sayısını tanımlar. Toplam eşzamanlı bağlantı kapasitesi worker_processes × worker_connections formülüyle hesaplanır.
  • multi_accept on: Bir worker'ın aynı anda birden fazla yeni bağlantıyı kabul etmesine izin verir.
  • use epoll: Linux sistemlerde en verimli I/O multiplexing yöntemidir.

Gzip Sıkıştırma

Statik dosyaların sıkıştırılması bant genişliği kullanımını önemli ölçüde azaltır ve sayfa yüklenme sürelerini kısaltır.

http {
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 5;
    gzip_min_length 256;
    gzip_types
        text/plain
        text/css
        text/javascript
        application/javascript
        application/json
        application/xml
        image/svg+xml;
}

gzip_comp_level değeri 1-9 arasında ayarlanabilir. 5 seviyesi, sıkıştırma oranı ve CPU kullanımı arasında iyi bir denge sunar. Çok yüksek değerler CPU'yu gereksiz yere yorar.

Buffer ve Timeout Ayarları

http {
    client_body_buffer_size 16k;
    client_header_buffer_size 1k;
    client_max_body_size 8m;
    large_client_header_buffers 4 8k;

    client_body_timeout 12;
    client_header_timeout 12;
    keepalive_timeout 65;
    send_timeout 10;
}

Bu ayarlar hem bellek kullanımını kontrol altında tutar hem de yavaş istemcilerin sunucu kaynaklarını tüketmesini engeller. keepalive_timeout değeri, aynı TCP bağlantısı üzerinden birden fazla isteğin gönderilmesine olanak tanıyarak handshake maliyetini düşürür.

Statik Dosya Önbellekleme

location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2|webp)$ {
    expires 30d;
    add_header Cache-Control "public, immutable";
    access_log off;
}

Statik dosyalar için tarayıcı önbellekleme başlıkları eklemek, tekrar eden ziyaretlerde sunucuya yapılan istek sayısını büyük ölçüde azaltır. access_log off ile bu dosyalar için gereksiz log yazımını da engellemiş olursunuz.

Güvenlik Yapılandırması

Temel Güvenlik Başlıkları

HTTP güvenlik başlıkları, yaygın web saldırılarına karşı ilk savunma hattınızdır.

add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline';" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
  • X-Frame-Options: Clickjacking saldırılarını önler, sayfanızın iframe içinde yüklenmesini kısıtlar.
  • X-Content-Type-Options: MIME type sniffing'i engeller.
  • Content-Security-Policy: Hangi kaynaklardan içerik yüklenebileceğini tanımlar, XSS riskini azaltır.
  • Permissions-Policy: Tarayıcı API'lerine (kamera, mikrofon vb.) erişimi kısıtlar.

Sunucu Bilgilerini Gizleme

http {
  server_tokens off;
}

server_tokens off direktifi, hata sayfalarında ve yanıt başlıklarında Nginx sürüm bilgisinin gösterilmesini engeller. Saldırganların sürüme özel açıkları hedeflemesini zorlaştırır.

Rate Limiting

Brute-force saldırılarını ve kötüye kullanımı engellemek için istek hız sınırlaması uygulayabilirsiniz.

http {
    limit_req_zone $binary_remote_addr zone=genel:10m rate=10r/s;
    limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
}

server {
    location / {
        limit_req zone=genel burst=20 nodelay;
    }

    location /api/login {
        limit_req zone=login burst=3 nodelay;
        limit_req_status 429;
    }
}

Bu yapılandırma genel sayfa isteklerini saniyede 10 ile sınırlarken, login endpoint'ini saniyede 1 istekle çok daha sıkı bir şekilde korur. burst parametresi, kısa süreli trafik artışlarına tolerans tanır.

İstenmeyen Erişimleri Engelleme

# Gizli dosyalara erişimi engelle
location ~ /\. {
    deny all;
    access_log off;
    log_not_found off;
}

# Hassas dosya uzantılarını engelle
location ~* \.(sql|bak|config|env|ini|log)$ {
    deny all;
}

SSL/TLS Yapılandırması

Temel SSL Kurulumu

Günümüzde HTTPS kullanmak bir tercih değil zorunluluktur. Let's Encrypt ile ücretsiz SSL sertifikası alarak başlayabilirsiniz.

server {
    listen 80;
    server_name ornek.com www.ornek.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name ornek.com www.ornek.com;

    ssl_certificate /etc/letsencrypt/live/ornek.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ornek.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;
}

İlk server bloğu HTTP trafiğini otomatik olarak HTTPS'e yönlendirir. http2 parametresi HTTP/2 protokolünü etkinleştirerek multiplexing, header sıkıştırma ve server push gibi performans avantajları sağlar.

SSL Oturum Önbellekleme ve OCSP Stapling

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;
resolver_timeout 5s;
  • ssl_session_cache: SSL oturumlarını önbelleğe alarak tekrarlayan bağlantılarda TLS handshake süresini azaltır.
  • ssl_session_tickets off: Forward secrecy'yi korumak için oturum biletlerini devre dışı bırakır.
  • OCSP Stapling: İstemcinin sertifika geçerliliğini kontrol etmek için ayrıca CA sunucusuna bağlanmasını gereksiz kılar, bağlantı süresini kısaltır.

HSTS (HTTP Strict Transport Security)

add_header Strict-Transport-Security "max-age=63072000;

includeSubDomains;
preload" always;

HSTS başlığı, tarayıcıya bu siteye yalnızca HTTPS üzerinden bağlanması gerektiğini bildirir. max-age değeri saniye cinsindendir (burada yaklaşık 2 yıl). includeSubDomains tüm alt alan adlarını da kapsar. Bu başlığı eklemeden önce tüm alt domain'lerinizin HTTPS'i desteklediğinden emin olun.

Diffie-Hellman Parametresi

# Terminal'de oluşturun:

# openssl dhparam -out /etc/nginx/dhparam.pem 4096

ssl_dhparam /etc/nginx/dhparam.pem;

Özel bir Diffie-Hellman parametre dosyası oluşturmak, anahtar değişim güvenliğini artırır. 4096 bit uzunluğu güncel standartlara uygundur ancak oluşturulması birkaç dakika sürebilir.

Reverse Proxy Yapılandırması

Nginx'in en yaygın kullanım senaryolarından biri, arkasındaki uygulama sunucularına (Node.js, Django, Spring Boot vb.) reverse proxy olarak hizmet vermektir.

upstream backend {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
    keepalive 32;
}

server {
    location /api/ {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        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_connect_timeout 5s;
        proxy_read_timeout 60s;
        proxy_send_timeout 30s;
    }
}

upstream bloğu ile birden fazla backend sunucusu arasında yük dengeleme yapabilirsiniz. keepalive 32 ayarı, Nginx ile backend arasındaki bağlantıların yeniden kullanılmasını sağlayarak TCP handshake yükünü azaltır. WebSocket desteği için Upgrade ve Connection başlıklarının proxy üzerinden iletilmesi gereklidir.

Yapılandırmayı Test Etme ve Uygulama

Herhangi bir değişiklik yaptıktan sonra mutlaka yapılandırmayı test edin:

# Sözdizimi kontrolü
sudo nginx -t

# Sorunsuzsa yeniden yükle (downtime olmadan)
sudo systemctl reload nginx

# Detaylı hata ayıklama için log'ları kontrol et
sudo tail -f /var/log/nginx/error.log

reload komutu, mevcut bağlantıları kesmeden yeni yapılandırmayı uygular. restart yerine her zaman reload tercih edin.

SSL Yapılandırmasını Doğrulama

SSL yapılandırmanızın gücünü test etmek için SSL Labs (ssllabs.com) aracını kullanabilirsiniz. Yukarıdaki ayarlarla A+ notu almanız beklenir. Ayrıca komut satırından hızlı bir kontrol için:

# Desteklenen protokolleri ve cipher'ları göster
nmap --script ssl-enum-ciphers -p 443 ornek.com

# Sertifika bilgilerini kontrol et
openssl s_client -connect ornek.com:443 -servername ornek.com

Sonuç

Nginx yapılandırması, performans, güvenlik ve SSL boyutlarıyla bir bütün olarak ele alınmalıdır. Worker ve buffer ayarlarıyla performansı optimize edin, güvenlik başlıkları ve rate limiting ile saldırı yüzeyini daraltın, modern TLS yapılandırmasıyla iletişimi şifreleyin. Yapılandırmanızı düzenli olarak güncel güvenlik standartlarına göre gözden geçirmeyi ve nginx -t ile her değişikliği test etmeyi alışkanlık haline getirin.

Yazar Hakkında
Fatih Algül
TechSoft Solutions
Proje mi var?

Yazılım, IoT veya otomasyon konularında destek almak ister misiniz?

İletişime Geç