Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Nginx'de Statik Dosya Sunumunu Optimize Etme: sendfile, tcp_nopush ve tcp_nodelay Direktiflerini Anlama

codexor

Üye
Katılım
14 Mart 2026
Mesajlar
14
Merhaba arkadaşlar, bugün sizlere özellikle statik dosya (CSS, JS, resim, font gibi) sunan sunucularınızda Nginx performansını gözle görülür şekilde artırabileceğiniz üç önemli direktifi anlatacağım. Bu ayarlar, sunucunuzun kaynak kullanımını azaltırken kullanıcılarınıza dosyaları daha hızlı ulaştırmanızı sağlayacak.

Benim sunucularda genelde yeni bir Nginx kurulumu yaptığımda ilk baktığım noktalardan biridir. Doğru yapılandırıldığında, özellikle yüksek trafik altında sunucu yükünüzde ciddi bir rahatlama hissedersiniz.

🔍 Optimizasyonun Temel Direktifleri

Bu üç direktif, işletim sistemi çekirdeği (kernel) seviyesindeki özellikleri yöneterek, verinin ağ üzerinden nasıl gönderileceğini kontrol eder. Gelin teker teker inceleyelim.

⚙️ 1. sendfile Direktifi

Bu direktif, Nginx'in bir dosyayı istemciye gönderirken kullandığı mekanizmayı değiştirir. Normalde Nginx, dosyayı okur, kendi belleğine (buffer) alır ve sonra ağ soketine (socket) yazar. `sendfile` aktif olduğunda ise, dosya doğrudan çekirdek alanından (kernel space) sokete kopyalanır. Bu, gereksiz bellek kopyalama işlemlerini ortadan kaldırır.

NGINX:
sendfile on;

Bu ayar, statik dosya sunumunda performansı önemli ölçüde artırır ve CPU kullanımını düşürür. Ancak dikkat etmelisiniz, dosya sunucusu (örneğin NFS) üzerindeki dosyaları sunarken veya ağ üzerinden dosya okurken (`sendfile` maksimum boyutu aşan dosyalar için) `off` yapmanız gerekebilir. Benim sunucularda genelde her zaman `on` durumdadır.

📦 2. tcp_nopush Direktifi

Bu direktif, `sendfile on;` ile birlikte kullanıldığında gerçek anlamını bulur. Amacı, paketleri "doldurmak" ve ağ verimliliğini artırmaktır.

NGINX:
tcp_nopush on;

Açık olduğunda, Nginx çekirdeğe, bir TCP paketini yalnızca tamamen doldurulduğunda (maximum segment size - MSS'ye ulaştığında) göndermesini söyler. Bu, ağ üzerindeki paket sayısını azaltarak verimliliği artırır. Yani, küçük küçük çok sayıda paket yerine, daha dolgun ve daha az sayıda paket gönderilir. Bu, özellikle yüksek hızda ve gecikmesi düşük (low-latency) bağlantılarda faydalıdır.

⚡ 3. tcp_nodelay Direktifi

Bu direktif, adından da anlaşılacağı gibi, gecikmeyi (delay) ortadan kaldırmak için vardır. Nagle algoritmasını devre dışı bırakır.

NGINX:
tcp_nodelay on;

Nagle algoritması, ağ trafiğini optimize etmek için küçük paketleri bir araya getirip tek paket olarak göndermeye çalışır. Bu verimlilik için iyidir ancak gerçek zamanlı (real-time) tepki süresi gerektiren durumlarda (örneğin bir SSH bağlantısı veya bir web sayfasının ilk baytının hızla gönderilmesi) gecikmeye neden olur. `tcp_nodelay on;` ile bu algoritma kapatılır ve veri hazır olduğu an hemen gönderilir.

⚠️ Peki, Bu Üçü Birlikte Nasıl Çalışır?

Burada kafa karıştırıcı olan nokta şu: Hem `tcp_nopush on` hem de `tcp_nodelay on` nasıl oluyor da bir arada çalışıyor? Aslında birbirlerini tamamlıyorlar.

- `tcp_nodelay on`, Nagle'ı devre dışı bırakır, böylece ACK (onay) paketi beklemeden veri hemen gönderilebilir.
- `tcp_nopush on` ise, paketlerin tamamen doldurulmasını sağlar, ancak bu kural yalnızca çıkış tamponu (output buffer) bir paketi dolduracak kadar veri içerdiğinde geçerlidir.

`sendfile` ile birlikte kullanıldığında sistem şöyle çalışır: Büyük bir dosya (`sendfile` ile) gönderilirken, çekirdek paketleri mümkün olduğunca doldurur (`tcp_nopush`). Ancak, gönderim sırasında tamponda kalan son veri parçası (last chunk) için `tcp_nopush` kuralı uygulanmaz ve bu son parça, gecikme olmadan hemen gönderilir (`tcp_nodelay`). Bu, hem verimliliği hem de hızlı sonlanmayı sağlar.

🔧 Örnek Nginx Konfigürasyonu

İşte benim statik dosya sunucu bloklarımda (örneğin `server` bloğu içinde veya `http` bloğunda) genellikle kullandığım yapılandırma:

NGINX:
http {
    # Temel performans ayarları
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    # Tampon boyutlarını da unutmayalım (Opsiyonel ama faydalı)
    client_body_buffer_size 10K;
    client_header_buffer_size 1k;
    client_max_body_size 8m;
    large_client_header_buffers 2 1k;

    # ... diğer http ayarları
}

server {
    listen 80;
    server_name statik.bingunluk.com;

    root /var/www/static;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
        # Önbellekleme başlıkları eklemeyi unutmayın!
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}

Bu ayarları yaptıktan sonra mutlaka Nginx konfigürasyonunuzun geçerliliğini kontrol edin ve servisi yeniden başlatın:

Bash:
sudo nginx -t

Bash:
sudo systemctl reload nginx  # veya sudo service nginx reload

UYARI: Bu ayarlar genel geçer olmakla birlikte, özellikle yüksek gecikmeli (high-latency) ağ bağlantılarında veya çok özel iş yüklerinde farklı testler yapmanız gerekebilir. Her zaman önce bir test/staging ortamında deneyin.

Sonuç olarak, bu üç küçük ama etkili direktif, sunucunuzun ağ verimliliğini artırarak hem sunucu kaynaklarınızı korumanıza hem de kullanıcı deneyimini iyileştirmenize yardımcı olacaktır.

Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir deneyiminiz veya eklemek istediğiniz bir püf noktası var mı? Aşağıya yorumlarınızı bekliyorum. Sorularınız için çekinmeyin, hep birlikte öğrenelim.
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri