Nginx Konfigürasyonu: Performans, Güvenlik ve SSL
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_connectionsformü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.