format_list_bulletedBu İçerikte Bahsedilen Konular
- arrow_rightNginx Üzerinde Gelişmiş Önbellekleme ve Performans Ayarları
- arrow_rightNginx Önbellekleme Mekanizmasının Temelleri
- arrow_rightProxy Cache Nasıl Çalışır?
- arrow_rightProxy Cache Yapılandırması
- arrow_rightÖnbellekleme Süre Stratejileri
- arrow_rightÖnbellek Doğrulama ve PURGE İşlemleri
- arrow_rightFastCGI ve PHP Önbellekleme
- arrow_rightWordPress için Önbellekleme Optimizasyonu
- arrow_rightGzip Sıkıştırma Ayarları
- arrow_rightBrotli Sıkıştırma Desteği
- arrow_rightTarayıcı Önbellekleme (Browser Caching)
- arrow_rightETag ve Last-Modified Header'ları
- arrow_rightWorker Process ve Connection Ayarları
- arrow_rightEpoll ve kqueue Yöntemleri
- arrow_rightOpen File Cache Yapılandırması
- arrow_rightTCP/UDP Optimizasyonları
- arrow_rightLoad Balancing ile Performans
- arrow_rightSağlık Kontrolleri ve Failover
- arrow_rightBuffer ve Proxy Buffer Ayarları
Nginx Üzerinde Gelişmiş Önbellekleme ve Performans Ayarları
Nginx, dünya genelinde en popüler web sunucularından biri olarak milyonlarca web sitesine hizmet vermektedir. Performans ve önbellekleme ayarlarını doğru yapılandırmak, sunucu yanıt sürelerini %60-80 oranında azaltabilir ve sunucu kaynak tüketimini önemli ölçüde düşürebilir. Bu kapsamlı rehberde, Nginx'in gelişmiş önbellekleme mekanizmalarını ve performans optimizasyon tekniklerini detaylı olarak inceleyeceğiz.
Nginx Önbellekleme Mekanizmasının Temelleri
Nginx'in önbellekleme sistemi, edge computing mimarisinde kritik bir rol oynar. Proxy katmanında çalışan bu sistem, arka uç sunucularına olan istekleri minimize ederek hem kullanıcı deneyimini hem de sunucu performansını artırır.
Önbellekleme mekanizması temel olarak ikiye ayrılır: proxy cache (ters proxy önbellekleme) ve FastCGI cache (uygulama düzeyinde önbellekleme). Her iki yöntem de farklı use case'ler için optimize edilmiştir.
Proxy Cache Nasıl Çalışır?
Nginx, gelen istekleri arka uç sunucularına iletmeden önce önbellekte olup olmadığını kontrol eder. Bulunan yanıtlar, yapılandırılan süre boyunca disk veya bellekte saklanır. Bu sayede, dinamik içerikler bile statik içerik gibi hızlı bir şekilde sunulabilir.
Önbellekleme oranı (cache hit ratio) %70'in üzerinde tutulduğunda, sunucu yükü dramatik şekilde azalır. Yapılan araştırmalara göre, etkili bir önbellekleme stratejisi ortalama yanıt süresini 200ms'den 50ms'ye düşürebilir.
Proxy Cache Yapılandırması
Proxy cache'i etkinleştirmek için Nginx konfigürasyon dosyasında belirli direktifler kullanılmalıdır. Aşağıda temel bir proxy cache yapılandırması bulunmaktadır:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=app_cache:10m max_size=100m inactive=60m use_temp_path=off;
server {
location / {
proxy_cache app_cache;
proxy_cache_valid 200 60m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
proxy_cache_lock on;
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://backend;
}
}
Bu yapılandırmada, keys_zone parametresi önbellek meta verileri için ayrılan bellek miktarını belirler. max_size ise diske kaydedilecek maksimum önbellek boyutunu tanımlar.
Önbellekleme Süre Stratejileri
İçerik türüne göre önbellekleme sürelerini optimize etmek kritik önem taşır. Aşağıdaki tablo, farklı içerik türleri için önerilen süreleri göstermektedir:
| İçerik Türü | Önbellekleme Süresi | Katman |
|---|---|---|
| Statik dosyalar (CSS, JS, Images) | 7-30 gün | Tarayıcı + Proxy |
| API yanıtları | 5-60 dakika | Proxy |
| HTML sayfaları | 1-24 saat | Proxy |
| Kullanıcıya özel içerik | 0 (önbelleksiz) | Yok |
Önbellek Doğrulama ve PURGE İşlemleri
İçerik güncellendiğinde önbelleğin temizlenmesi gerekir. Nginx, ngx_cache_purge modülü ile bu işlemi destekler. Veritabanı yedekleme gibi kritik operasyonlardan sonra önbellek temizliği yapılması önerilir.
location ~ /purge(/.*) {
proxy_cache_purge app_cache $1;
access_log off;
}
FastCGI ve PHP Önbellekleme
PHP gibi dinamik içerik üreten diller için FastCGI cache, en etkili çözümlerden biridir. Bu yöntem, PHP-FPM ile Nginx arasında çalışarak uygulama sunucusunun yükünü önemli ölçüde azaltır.
fastcgi_cache_path /var/cache/fastcgi levels=1:2 keys_zone=php_cache:10m max_size=100m inactive=60m;
fastcgi_cache php_cache;
fastcgi_cache_valid 200 60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
# Koşullu önbellekleme
set $skip_cache 0;
if ($query_string != "") {
set $skip_cache 1;
}
if ($request_uri ~* "/wp-admin|/wp-login.php") {
set $skip_cache 1;
}
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
WordPress gibi içerik yönetim sistemlerinde, yönetici paneli isteklerinin önbelleğe alınmaması kritik önem taır. Yukarıdaki yapılandırma, bu durumu $skip_cache değişkeni ile ele almaktadır.
WordPress için Önbellekleme Optimizasyonu
WordPress sitelerinde FastCGI cache kullanımı, sayfa yüklenme sürelerini %90'a varan oranlarda iyileştirebilir. W3 Total Cache veya WP Super Cache eklentileri ile entegrasyon sağlanabilir. Özellikle Docker Swarm ortamlarında çalışan WordPress kurulumlarında bu yapılandırma kritik önem taşır.
Gzip Sıkıştırma Ayarları
Gzip sıkıştırma, aktarılan veri miktarını %60-80 oranında azaltarak bantwidth tasarrufu sağlar ve sayfa yüklenme sürelerini kısaltır. Nginx'te Gzip'i etkinleştirmek için:
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
gzip_min_length 1000;
gzip_disable "msie6";
gzip_comp_level parametresi 1 ile 9 arasında değer alır. Optimal değer genellikle 5-6 arasındadır; daha yüksek değerler CPU yükünü artırırken çok az bandwidth tasarrufu sağlar.
Brotli Sıkıştırma Desteği
Brotli, Gzip'e göre %15-25 daha iyi sıkıştırma oranları sunar. Google'ın geliştirdiği bu algoritma, modern tarayıcılar tarafından desteklenmektedir. Brotli kullanımı için ngx_brotli modülü gereklidir:
brotli on;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
brotli_comp_level 6;
brotli_min_length 1000;
Tarayıcı Önbellekleme (Browser Caching)
expires ve cache-control header'ları, kullanıcının tarayıcısında içeriklerin önbelleklenmesini sağlar. Bu yöntem, tekrarlayan ziyaretlerde sunucuya istek atılmasını tamamen engeller:
location ~* \.(jpg|jpeg|png|gif|ico|css|js|webp|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
access_log off;
}
Statik dosyalar için 30 günlük önbellekleme süresi önerilir. CSS ve JavaScript dosyaları için version query string'leri kullanılması, dosya güncellendiğinde tarayıcının yeni sürümü yüklemesini sağlar.
ETag ve Last-Modified Header'ları
ETag ve Last-Modified header'ları, tarayıcının sunucuya koşullu istek göndermesini sağlar. İçerik değişmemişse, sunucu 304 Not Modified yanıtı döner ve aktarılan veri miktarı sıfıra yakın olur:
etag on;
if_modified_since exact;
Worker Process ve Connection Ayarları
Nginx'in performansı, worker process ve connection yapılandırmasına doğrudan bağlıdır. Yanlış yapılandırılmış bir Nginx sunucusu, mevcut donanım potansiyelinin çok altında performans sunabilir.
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 4096;
use epoll;
multi_accept on;
}
worker_processes auto parametresi, Nginx'in mevcut CPU çekirdek sayısına göre worker process sayısını otomatik ayarlamasını sağlar. worker_connections değeri, her worker'ın eşzamanlı kaç bağlantıyı yönetebileceğini belirler.
Epoll ve kqueue Yöntemleri
Linux sistemlerde epoll, FreeBSD sistemlerde kqueue kullanılmalıdır. Bu yöntemler, yüksek bağlantı sayılarında select/poll yöntemlerine göre 10 kata kadar performans artışı sağlar.
events {
worker_connections 10240;
use epoll;
multi_accept on;
}
Open File Cache Yapılandırması
Sık erişilen dosyaların descriptor'larını önbelleğe almak, disk I/O operasyonlarını azaltır:
open_file_cache max=10000 inactive=30s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
TCP/UDP Optimizasyonları
Socket ayarlarını optimize etmek, yüksek trafikli sunucularda bağlantı verimliliğini artırır:
http {
keepalive_timeout 65;
keepalive_requests 100;
tcp_nopush on;
tcp_nodelay on;
# Buffer ayarları
client_body_buffer_size 10k;
client_header_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 4 16k;
}
keepalive_timeout parametresi, boşta kalan bağlantıların ne kadar süre açık kalacağını belirler. tcp_nopush ve tcp_nodelay birlikte kullanıldığında, ağ performansı optimize edilir.
Load Balancing ile Performans
Yüksek trafikli uygulamalarda, birden fazla arka uç sunucusu kullanarak yük dengeleme yapılması önerilir. Nginx'in yerleşik load balancing özellikleri, bu senaryoyu verimli şekilde yönetir:
upstream backend {
least_conn;
server backend1.example.com:8080 weight=3;
server backend2.example.com:8080 weight=2;
server backend3.example.com:8080 backup;
keepalive 32;
}
server {
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
least_conn algoritması, en az bağlantıya sahip sunucuya istek göndererek daha dengeli bir yük dağılımı sağlar. keepalive parametresi, arka uç sunucularıyla açık bağlantıların korunmasını sağlar ve yeni bağlantı oluşturma overhead'ını azaltır.
Sağlık Kontrolleri ve Failover
Arka uç sunucularının sağlık durumunu izlemek ve hatalı sunucuları otomatik olarak devre dışı bırakmak kritik önem taşır. DDoS koruma hizmetleri ile entegre çalışan sağlık kontrolleri, sunucu availablity'ini artırır.
Buffer ve Proxy Buffer Ayarları
Proxy buffer'ları, arka uç sunucularından gelen yanıtların Nginx tarafından tamponlanmasını sağlar. Doğru boyutlandırma,