Node.js İle Sıkıştırılmış Gzip Dosya Sunumu Nasıl Yapılır?

Node.js İle Sıkıştırılmış Gzip Dosya Sunumu Nasıl Yapılır?
Node.js İle Sıkıştırılmış Gzip Dosya Sunumu Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Gzip sıkıştırmasını projenize entegre etmeden önce sisteminizde güncel bir Node.js sürümünün kurulu olduğundan emin olmalısınız. 2026 yılı standartları gereği, Node.js 22 veya üzeri LTS (Long Term Support) sürümlerini kullanmanız önerilir.

Projenizi başlatmak ve gerekli bağımlılıkları yüklemek için aşağıdaki adımları takip edin:

# Proje dizinini oluşturun
mkdir node-gzip-sunumu
cd node-gzip-sunumu

# Projeyi başlatın
npm init -y

# Gerekli olan compression kütüphanesini yükleyin
npm install compression express

Bu adımlar, Express.js çatısını ve HTTP yanıtlarını otomatik olarak sıkıştıran compression ara katman yazılımını (middleware) projenize dahil edecektir.

Temel Gzip Sıkıştırması Uygulaması

Express.js içerisinde Gzip sıkıştırmasını etkinleştirmek oldukça basittir. compression kütüphanesi, gelen istekleri kontrol eder ve uygun olanları Gzip formatına dönüştürerek istemciye gönderir. Bu işlem, sunucunun CPU yükünü hafif bir miktarda artırırken, ağ üzerindeki veri aktarımını büyük oranda azaltır.

const express = require('express');
const compression = require('compression');
const app = express();

// Tüm yanıtları sıkıştır
app.use(compression());

app.get('/', (req, res) => {
  res.send('Bu içerik Gzip ile sıkıştırılarak gönderiliyor.');
});

app.listen(3000, () => console.log('Sunucu 3000 portunda çalışıyor.'));

Yukarıdaki kod bloğu, uygulamanızdaki tüm HTTP yanıtlarını sıkıştırır. app.use(compression()) satırı, uygulamanın en başında tanımlanmalıdır; böylece sonraki tüm rotalar bu sıkıştırma işleminden geçer.

Gzip Sıkıştırma Filtreleme İşlemi

Her zaman her içeriği sıkıştırmak verimli olmayabilir. Örneğin, zaten sıkıştırılmış olan resim dosyalarını (JPEG, PNG) tekrar sıkıştırmaya çalışmak CPU kaynaklarını boşuna tüketir. compression kütüphanesi, filter fonksiyonu ile hangi içeriklerin sıkıştırılacağını belirlemenize olanak tanır.

const compression = require('compression');

function shouldCompress(req, res) {
  if (req.headers['x-no-compression']) {
    return false;
  }
  // Sadece JSON ve HTML içeriklerini sıkıştır
  return compression.filter(req, res);
}

app.use(compression({ filter: shouldCompress }));

Bu yöntemle, belirli başlıkları (header) kontrol ederek veya içerik türüne (MIME type) göre filtreleme yaparak sunucu performansını optimize edebilirsiniz.

Gzip Sıkıştırma Seviyesini Ayarlama

Sıkıştırma seviyesi, CPU kullanımı ile dosya boyutu arasındaki dengeyi belirler. 1 (en hızlı, en düşük sıkıştırma) ile 9 (en yavaş, en yüksek sıkıştırma) arasında bir değer verebilirsiniz. Varsayılan değer genellikle 6'dır.

app.use(compression({
  level: 9, // Maksimum sıkıştırma
  threshold: 1024, // 1KB'dan küçük dosyaları sıkıştırma
}));

threshold değeri, küçük dosyaların sıkıştırılmasının getirdiği maliyetin, sağladığı kazançtan daha fazla olduğu durumları engellemek için kullanılır.

Performans ve Yöntem Karşılaştırması

Node.js uygulamalarında sıkıştırma stratejilerini seçerken aşağıdaki tabloyu referans alabilirsiniz:

Yöntem Avantaj Dezavantaj
Node.js Middleware Dinamik içerik için mükemmel CPU kullanımı artar
Nginx/Reverse Proxy Daha hızlı, Node.js'i rahatlatır Konfigürasyon karmaşıklığı
Statik Sıkıştırma CPU yükü sıfır Disk alanı kullanımı artar

Statik Dosyalar İçin Ön Sıkıştırma

Statik dosyalar (CSS, JS, resimler) sık değişmediği için bunları sunucuya her istek geldiğinde sıkıştırmak yerine, önceden sıkıştırıp diskte saklamak en performanslı yöntemdir. Bu işlem için express.static ile birlikte serve-static kullanılabilir.

const express = require('express');
const app = express();

// Statik dosyaları önceden sıkıştırılmış (.gz) halleriyle sun
app.use(express.static('public', {
  setHeaders: (res, path) => {
    if (path.endsWith('.js')) {
      res.setHeader('Content-Encoding', 'gzip');
    }
  }
}));

Güvenlik Uyarısı: Sıkıştırma algoritmaları, özellikle HTTPS üzerinden gönderilen verilerde "CRIME" veya "BREACH" gibi saldırılara karşı savunmasız kalabilir. Kullanıcıya özel hassas verileri (token, kişisel bilgiler) sıkıştırırken dikkatli olunmalı ve mümkünse bu tür içerikler için sıkıştırma devre dışı bırakılmalıdır.

Sıkça Sorulan Sorular

Node.js'de Gzip neden gereklidir?

Gzip, metin tabanlı dosyaların boyutunu %70'e varan oranlarda düşürür. Bu, özellikle mobil kullanıcılar için daha hızlı sayfa yükleme ve daha düşük veri tüketimi anlamına gelir.

Sıkıştırma seviyesini 9 yapmak mantıklı mı?

Genellikle hayır. 6 ile 9 arasındaki sıkıştırma farkı çok düşüktür ancak CPU maliyeti ciddi oranda artar. Çoğu uygulama için varsayılan değer veya 6 idealdir.

Bütün dosya türleri sıkıştırılmalı mı?

Hayır. Zaten sıkıştırılmış olan formatlar (JPEG, PNG, MP4, PDF) tekrar sıkıştırıldığında boyutları küçülmez, aksine işlemci gereksiz yere meşgul edilir.

Gzip sıkıştırmasının çalıştığını nasıl test ederim?

Tarayıcınızın Geliştirici Araçları (Network sekmesi) üzerinden yanıt başlıklarını (Response Headers) kontrol edin. Eğer Content-Encoding: gzip başlığını görüyorsanız, sıkıştırma başarıyla çalışıyor demektir.

Nginx mi yoksa Node.js mi kullanmalıyım?

Eğer yüksek trafikli bir uygulamanız varsa, sıkıştırma işlemini Node.js yerine bir Reverse Proxy olan Nginx'e devretmek, Node.js event-loop yapısını rahatlatacak ve performansı artıracaktır.

Brotli Sıkıştırma Algoritmasına Geçiş: Gzip'in Ötesi

Modern web standartlarında Gzip hala yaygın olsa da, Google tarafından geliştirilen Brotli algoritması, metin tabanlı dosyalar için Gzip'ten %15 ile %25 arasında daha iyi sıkıştırma oranları sunar. Node.js ekosisteminde shrink-ray-current gibi kütüphaneler, istemcinin desteklediği durumlarda otomatik olarak Brotli'ye geçiş yapmanıza olanak tanır.

Aşağıdaki örnekte, hem Gzip hem de Brotli desteği sunan dinamik bir sıkıştırma katmanının nasıl yapılandırılacağını görebilirsiniz:

const express = require('express');
const shrinkRay = require('shrink-ray-current');
const app = express();

// Otomatik olarak istemci desteğine göre Brotli veya Gzip seçer
app.use(shrinkRay());

app.get('/api/data', (req, res) => {
    res.json({ message: "Bu yanıt hem Brotli hem Gzip ile sıkıştırılabilir." });
});

app.listen(3000, () => console.log('Sunucu 3000 portunda çalışıyor.'));

Sıkıştırma Süreçlerinde Hata Ayıklama ve İzleme

Üretim ortamında sıkıştırma mekanizmalarının doğru çalışıp çalışmadığını denetlemek için Content-Encoding başlığını izlemek hayati önem taşır. Eğer yanıtlarınız sıkıştırılmıyorsa, genellikle şu iki durumdan biri yaşanıyordur: dosya boyutu çok küçüktür (eşik değerin altındadır) veya Content-Type başlığı sıkıştırma listesine dahil edilmemiştir.

Hata ayıklama sürecinde kullanabileceğiniz basit bir middleware ile hangi yanıtların sıkıştırıldığını konsola yazdırabilirsiniz:

app.use((req, res, next) => {
    const send = res.send;
    res.send = function (body) {
        const encoding = res.getHeader('Content-Encoding');
        console.log(`Yanıt sıkıştırma durumu: ${encoding || 'Sıkıştırılmadı'}`);
        send.call(this, body);
    };
    next();
});

Performans Metriklerini Analiz Etme

Sıkıştırma uyguladıktan sonra uygulamanızın performansını şu metriklerle ölçmeniz önerilir:

  • Time to First Byte (TTFB): Sıkıştırma işlemi CPU maliyeti getireceği için TTFB değerindeki değişimleri izleyin.
  • Content Download Time: Dosya boyutu küçüldüğü için ağ üzerinden indirme süresindeki iyileşmeyi kaydedin.
  • CPU Usage: Yüksek trafikli sunucularda, sıkıştırma seviyesini 9 yerine 4-6 arasında tutarak CPU üzerindeki yükü dengeleyin.
İpucu: Eğer uygulamanızda çok fazla dinamik içerik varsa, compression kütüphanesindeki threshold değerini 1kb veya 2kb gibi düşük seviyelere çekmek, küçük JSON yanıtlarının bile sıkıştırılmasını sağlayarak mobil kullanıcılar için veri tasarrufu sağlar.

Sonuç

Node.js ile Gzip sıkıştırması yapmak, web uygulamanızın hızını ve SEO skorunu doğrudan olumlu yönde etkileyen temel bir optimizasyon sürecidir. Bu rehberde, middleware kurulumundan gelişmiş filtreleme tekniklerine ve statik dosya sunumuna kadar kritik adımları öğrendiniz. Bir sonraki adım olarak, HTTP/3 protokolüne geçişi ve Brotli sıkıştırma algoritmasının Gzip'e kıyasla sunduğu avantajları araştırmanızı öneririm.

Kod güvenliği sorumluluk reddi: Bu rehberde paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamına almadan önce girdi doğrulama, hata yönetimi ve güvenlik denetimlerini (security audit) mutlaka yapınız.

Bu yazıya tepkinizi paylaşın:
Zeynep Arslan

Mutfak pratikleri ve organizasyonel hayat tüyoları üzerine uzman bir içerik üreticisiyim. Günlük rutinleri optimize eden yöntemleri, anlaşılır ve uygulanabilir rehberler haline getiriyorum.

Yorumlar (0)

Yorum Yaz