Eğitimler

Nginx ve Apache karşılaştırması

Bu makalede Nginx veya Apache'nin mimarisini, performansını ve yapılandırmalarını karşılaştırıyor, her birinin hangi senaryo için daha uygun olduğunu ve ikisinin nasıl birleştirilebileceğini inceliyoruz.

Eğitimler

Giriş: Nginx veya Apache Arasında Seçim Yapmak Neden Önemlidir?

Ciddi bir web sitesi kurmaktan bahsettiğimizde, vermeniz gereken ilk teknik karar web sunucusunu seçmektir. Çoğu durumda, tartışma iki ana seçeneğe indirgenir: Nginx ve Apache. Her ikisi de yıllardır dünyadaki web sitelerinin yaklaşık %60 ila %70'ini birlikte kapsıyor, ancak mimarileri ve tasarım felsefeleri tamamen farklıdır.

Yeni bir sunucuya geçiş yapıyorsanız veya yüksek trafiğe dayanacak bir web sitesi kurmak istiyorsanız, Nginx veya Apache arasındaki seçim; kaynak tüketimi, yanıt hızı ve hatta sunucu yönetiminin karmaşıklığı açısından önemli bir fark yaratabilir. Bu makalede, hiçbirine önyargılı olmadan, her ikisinin de mimarisini, performansını ve kullanım senaryolarını inceliyor ve sonunda her ikisinden aynı anda nasıl yararlanabileceğinizi gösteriyoruz.

İstek İşleme Mimarisi: Nginx veya Apache Arasındaki Temel Fark

Nginx veya Apache arasındaki en önemli fark, bağlantıların yönetilme ve isteklerin işlenme biçimine dayanır. Bu mimari fark, diğer tüm performans farklılıklarının kökenidir.

Apache: Çok İşlemli Model (Process-based)

Apache başlangıçtan itibaren bir bağlantı, bir işlem modeline dayalı olarak tasarlanmıştır. Sunucuya ulaşan her HTTP isteği, yeni sürümlerde ayrı bir işlem (Process) veya ayrı bir iş parçacığı (Thread) alır. Bu model, web'in ilk sürümlerinde çok basit ve güvenilirdi, ancak doğal bir sorunu vardır: her işlem belirli bir miktarda RAM tüketir.

Örneğin, her Apache işlemi ortalama 50 MB RAM tüketiyorsa ve 1000 eşzamanlı bağlantınız varsa, 50 GB RAM'e ihtiyacınız olacaktır. Bu, yüksek yüklerde Apache'nin sunucu kaynaklarını hızla tükettiği anlamına gelir.

Elbette Apache, mpm_event ve mpm_worker modüllerini tanıtarak bu sorunu çözmeye çalışmıştır. mpm_event modunda, tutulan bağlantılar (Keep-Alive) ayrı iş parçacıklarına aktarılır ve yalnızca gerçek istekler iş parçacığı tüketir. Ancak bu optimizasyonla bile, bellek tüketimi ve eşzamanlılık yönetimi hala Nginx'in seviyesine ulaşamaz.

Nginx: Olay Güdümlü Model (Event-driven)

Nginx tamamen farklı bir mimariyle tasarlanmıştır: olay güdümlü ve eşzamansız. Her bağlantı için bir işlem oluşturmak yerine, Nginx bir veya birkaç çalışan işlem (Worker Process) ile on binlerce bağlantıyı yönetebilen bir olay döngüsü (Event Loop) kullanır.

Her Nginx çalışan işlemi, her biri için ayrı bir iş parçacığı veya işlem oluşturmadan aynı anda binlerce bağlantıya yanıt verebilir. Bu, eşzamanlı bağlantı sayısı 100'den 10000'e çıksa bile bellek tüketiminin neredeyse sabit kaldığı anlamına gelir.

Daha iyi anlamak için bir restoranınız olduğunu hayal edin. Apache, her müşteri için özel bir garson tutan bir restoran gibidir. Nginx, aynı anda 100 müşteriye hizmet verebilen çevik bir garsonu olan bir restoran gibidir. Normal durumda her ikisi de çalışır, ancak restoran kalabalıklaştığında ikinci model açıkça daha verimlidir.

Yüksek Yükte Performans: Nginx veya Apache'nin Gerçek Testi

Bu mimari farkı gerçek bir senaryoda inceleyelim. Aynı anda 5000 kullanıcının ziyaret ettiği bir haber siteniz olduğunu varsayalım.

Yüksek Yükte Kaynak Tüketimi

Varsayılan mpm_prefork modunda Apache ile 5000 işleme ihtiyacınız olacaktır. Her işlem 30 MB RAM tüketiyorsa, toplamda 150 GB RAM gerekir. Bu sayı çoğu sanal veya özel sunucu için kabul edilemez.

Nginx ile, aynı 5000 bağlantıyı 4 çalışan işlemle (genellikle CPU çekirdek sayısına eşdeğer) ve toplamda yaklaşık 200 MB RAM ile yönetebilirsiniz. Bu, Nginx'in Apache'nin zorlukla 500 bağlantıyı yönetebildiği donanımda 5000 bağlantıya kolayca yanıt verebileceği anlamına gelir.

Pratikte, kıyaslama testleri Nginx'in aynı donanımla Apache'den 2 ila 3 kat daha fazla saniyede istek (RPS) işleyebildiğini, özellikle statik dosyalar söz konusu olduğunda gösteriyor.

Statik Dosya Sunumunun Karşılaştırılması

Nginx'in ana güçlü yönlerinden biri, statik dosyaların (görseller, CSS, JavaScript) sunumudur. Nginx, Linux çekirdeğindeki sendfile mekanizmasını kullanarak dosyaları doğrudan diskten ağ soketine aktarır, verilerin kullanıcı alanından (User Space) geçmesine gerek kalmaz. Bu, CPU yükünün neredeyse sıfır olduğu anlamına gelir.

Apache, statik dosya sunmak için veriyi diskten okumalı, belleğe aktarmalı ve ardından sokete göndermelidir. Bu çok aşamalı süreç daha fazla CPU ve bellek tüketir.

ab (ApacheBench) aracıyla 10 KB'lık bir dosya üzerinde basit bir testte:

ab -n 10000 -c 100 http://your-server.com/test.jpg

Sonuçlar genellikle Nginx'in saniyede yaklaşık 15.000 ila 20.000 isteğe yanıt verdiğini, Apache'nin ise aynı donanımda saniyede 5.000 ila 8.000 isteğe ulaştığını gösterir.

Esneklik ve Uyumluluk: Apache'nin Güçlü Noktası

Nginx'in performanstaki üstünlüğüne rağmen, Apache bazı alanlarda hala başı çekiyor. Apache'nin en önemli avantajı, yapılandırma esnekliği ve geniş bir modül yelpazesiyle uyumluluğudur.

.htaccess Dosyaları

Apache, yapılandırmaları her dizinde .htaccess dosyalarına koymanıza izin verir. Bu özellik, paylaşımlı hostingler ve ana sunucu yapılandırmasına erişimi olmayan kullanıcılar için hayati önem taşır. Ana yapılandırma dosyasına erişmeden yeniden yazma (Rewrite) kuralları, erişim kısıtlamaları ve önbellek ayarları uygulayabilirsiniz.

Nginx varsayılan olarak .htaccess desteklemez. Tüm yapılandırmalar ana yapılandırma dosyasında (genellikle /etc/nginx/sites-available/) yapılmalıdır. Bu, ayarları değiştirmek için sunucuya SSH erişiminizin olması ve her değişiklikten sonra servisi yeniden başlatmanız gerektiği anlamına gelir.

Web siteniz WordPress veya Joomla kullanıyorsa ve .htaccess kurallarını değiştiren eklentilere bağımlıysa, Apache daha basit bir seçimdir. Ancak sunucu üzerinde tam kontrole sahipseniz, Nginx'in bu sınırlaması çok önemli değildir.

CGI ve Eski Modül Desteği

Apache, mod_php, mod_perl ve mod_python gibi modüllerle derin bir uyumluluğa sahiptir. Uygulamanız bu modüllere bağımlıysa, Nginx'e geçiş kodun bir kısmının yeniden yazılmasını veya alternatif çözümlerin (PHP-FPM gibi) kullanılmasını gerektirecektir.

Ayrıca Apache, CGI'yi yerel olarak desteklerken, Nginx varsayılan olarak CGI desteklemez ve FastCGI kullanmanız gerekir. Bu, yalnızca CGI bilen eski uygulamalar için ciddi bir engeldir.

Nginx veya Apache'nin Birleştirilmesi: İki Dünyanın En İyisi

Sık sorulan soru şudur: "Birini mi seçmeliyim yoksa ikisini de kullanabilir miyim?" Kısa cevap: Evet, kullanabilirsiniz ve bu kombinasyon birçok profesyonel altyapıda yaygındır.

Reverse Proxy Mimarisi

Bu mimaride Nginx ön uç sunucu (Front-end) olarak yer alır ve tüm HTTP isteklerini alır. Ardından statik dosyalarla ilgili istekleri kendisi yanıtlar ve dinamik istekleri arkada (Back-end) çalışan Apache'ye iletir.

Bu kombinasyon her ikisinin de avantajlarına sahiptir:

  • Nginx yüksek performansla statik dosyaları sunar ve sunucuyu DoS saldırılarına karşı korur.
  • Apache, esnekliğiyle dinamik uygulamaları ve WordPress'i gerekli tüm modüllerle çalıştırır.
  • .htaccess ayarları çalışmaya devam eder, çünkü dinamik istekler Apache'ye ulaşır.

Örnek Yapılandırma

Nginx'in 80. portta ve Apache'nin 8080. portta çalıştığını varsayalım. PHP isteklerini Apache'ye iletmek için Nginx yapılandırması şu şekildedir:

server {
    listen 80;
    server_name example.com;

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

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

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

Bu yapılandırmada, statik dosya istekleri (görseller, CSS, JS) doğrudan Nginx tarafından 30 günlük önbellekle yanıtlanır. PHP istekleri 8080. porttaki Apache'ye iletilir ve Apache bunları mod_php veya PHP-FPM kullanarak işler.

Yapılandırmada Önemli Nokta

Bu mimaride yaygın bir hata, proxy_set_header ayarını unutmaktır. Bu başlıkları göndermezseniz, Apache gerçek kullanıcı IP adresini görmez ve tüm istekler 127.0.0.1'den gelir. Bu, Apache günlüklerini işe yaramaz hale getirir ve IP tabanlı çalışan WordPress güvenlik eklentilerinin devre dışı kalmasına neden olur.

Ayrıca Apache yapılandırmasında Listen 8080 ayarını etkinleştirmeli ve Apache'nin yalnızca localhost'u dinlediğinden emin olmalısınız:

Listen 127.0.0.1:8080

Bu, kullanıcıların Apache'ye doğrudan erişmesini engeller ve güvenliği artırır.

Nginx veya Apache Seçiminde Yaygın Hatalar

Bu bölümde gerçek projelerde sıkça gördüğümüz birkaç yaygın hataya değineceğiz.

İhtiyaca Göre Değil, Reklamlara Göre Seçim Yapmak

Birçok kişi yalnızca "daha modern" olduğu için Nginx'i veya "herkes kullanıyor" diye Apache'yi seçer. Bu düşünce tarzı yanlıştır. Web siteniz günde 100 ziyaretçisi olan kişisel bir blogsa, Nginx veya Apache arasındaki performans farkı sizin için tamamen anlamsızdır. Bu durumda, Apache'deki .htaccess kullanım kolaylığı daha iyi bir seçim olabilir.

Keep-Alive Ayarlarını Göz Ardı Etmek

Nginx'te keepalive_timeout ayarı varsayılan olarak 75 saniyedir. Bu değeri çok yüksek ayarlarsanız, çok sayıda boşta bağlantı tutulur ve bağlantı sınırına ulaşabilirsiniz. Çoğu web sitesi için 10 ila 30 saniye arasında mantıklı bir değer uygundur.

Apache'de KeepAliveTimeout varsayılanı 5 saniyedir ve çoğu durum için uygundur, ancak web siteniz WebSocket kullanıyorsa bu değeri artırmanız gerekir.

SSL ve HTTP/2'yi Unutmak

Her iki sunucu da SSL ve HTTP/2 destekler, ancak yapılandırma yöntemleri farklıdır. Nginx'te SSL yapılandırması çok basittir:

listen 443 ssl http2;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;

Apache'de mod_ssl modülünü etkinleştirmeniz ve benzer yapılandırmalar yapmanız gerekir. HTTP/2 kullanmıyorsanız, özellikle çok sayıda CSS ve JS dosyası olan web siteleri için yüksek yükte sayfa yükleme hızında belirgin bir fark göreceksiniz.

Sonuç: Hangisini Seçmeliyiz?

Nginx veya Apache arasındaki seçim, popülerliğe veya reklamlara değil, özel ihtiyaçlarınıza bağlıdır. Web siteniz yüksek trafiğe sahipse, çok sayıda statik dosya kullanıyorsa veya kaynak tüketimini en aza indirmek istiyorsanız, Nginx daha iyi bir seçimdir. .htaccess'e bağımlıysanız, eski Apache modüllerini kullanıyorsanız veya yalnızca Apache destekleyen paylaşımlı bir hostingdeyseniz, Apache daha uygun bir seçenektir.

Çoğu durumda en iyi çözüm ikisini birleştirmektir: önde statik dosya sunumu ve bağlantı yönetimi için Nginx, arkada dinamik kod işleme için Apache. Bu mimari profesyonel altyapılarda çok yaygındır ve her iki sunucunun avantajlarını bir arada sunar.

Yeni bir sunucu kuruyorsanız ve teknik danışmanlığa ihtiyacınız varsa, ServerNet destek ekibi web siteniz için en iyi mimariyi seçmenizde size rehberlik edebilir. Önemli olan, kararınızı piyasa gürültüsüne değil, projenizin gerçek ihtiyacına göre vermenizdir.

ServerNet Destek

ServerNet mühendislik ve yayın ekibi — altyapı, ağ ve web barındırma uzmanları.

WordPress Hosting
Paylaş:

Yorumlar 0

Henüz yorum yok — ilk siz olun!

Yorum bırakın

İlgili hizmet

WordPress Hosting

LiteSpeed Enterprise ve NVMe üzerinde WordPress'e özel altyapı — otomatik kurulum, güvenli güncelleme, staging ve sizi Google'da üstte tutan önbellek.