Bloğa geri dön

Web Sunucularının Dünyası: Apache vs. Nginx

Web Sunucularının Dünyası: Apache vs. Nginx

Apache and Nginx'e Giriş

Web sunucuları ve protokolleri, kullanıcıların web sayfalarını görüntülemesini sağlamak için tasarlanmıştır. Sunucu tarafından kabul edilen bir belgeyi görüntülemek için bir istek gönderirler. Ardından ana makine, belgeyi veya bilgiyi izleyiciye sunar. Web sunucusu, tarayıcınızda web sayfalarını görüntülemenizde ve bunlara erişmenizde merkezi bir rol oynar.

web server

İstemci ve Uygulama Sunucuları Arasındaki İletişimi Kolaylaştıran Web Sunucusu

Bu amaçla kullanabileceğiniz birçok web sunucusu vardır. En popülerleri arasında Nginx ve Apache bulunur. Aslında bu sunucular, şu anda internette bulunan web sitelerinin çoğunu barındırmaktadır.

Apache ve Nginx birçok yönden oldukça benzerdir. Başlangıç olarak, her iki web sunucusu da açık kaynaklıdır. Bu, dünyadaki herkesin bunları tamamen ücretsiz olarak kullanabileceği anlamına gelir. Ancak her bir sunucuya özgü birçok özellik vardır. Bu özel nitelikler, onları çeşitli uygulamalar ve amaçlar için en uygun hale getirir.

Size yardımcı olmak için, hangi web sunucusunun sizin için daha üstün veya ideal olduğuna karar vermeniz adına Nginx ve Apache'yi karşılaştıracağız. Karşılaştırma, web sunucusu kullanıcıları için kritik öneme sahip bir dizi temel parametre üzerinden gerçekleştirilecektir. Başlayalım!

Genel Bakış

İki web sunucusuna genel bir bakışla başlayacağız. Hem Apache hem de Nginx toplulukta harika bir itibar kazanmıştır. Performanslarıyla övülürler ve dünya çapında birçok tanınmış kuruluş tarafından kullanılırlar.

Apache

Apache 1995 yılında çıktı. Robert McCool bu HTTP sunucusunu the Apache Software Foundation bünyesinde geliştirdi, adı da buradan gelmektedir. Piyasaya sürülmesinden bu yana, dünya genelinde yüz binlerce insan Apache kullanıyor.

Muazzam popülaritesi, birçok üçüncü taraf yazılım ve kaynağın onunla sık sık iş birliği yaptığı anlamına gelir. Bu nedenle, çok sayıda entegrasyona sahip iyi bir destek ağı arıyorsanız, Apache tam size göredir. Apache, daha dinamik ve esnek olduğu için de birçok kişi tarafından tercih edilmektedir. Ayrıca yorumlayabildiği diller konusunda daha geniş bir yelpaze sunar.

Nginx

Nginx, 2004 yılında piyasaya sürülen nispeten daha yeni bir web sunucusudur. Igor Syosev'in günümüzde C10K problemi olarak bilinen sorunla başa çıkma çabalarının bir sonucudur. Bu sorun, sunucuların büyük miktarda trafiği işlemesinin zorlaşmaya başlamasıyla ortaya çıktı. Giderek daha fazla insan interneti kullanmaya başladıkça, web sitesi sunucuları aşırı yüklenmeye başladı. Bu sunucuların aynı anda birkaç bin bağlantıyı işleyememesi, sitelerin çökmesine ve hata vermesine neden oldu.

Nginx bu sorunu çözme girişimi olarak piyasaya sürüldü. Bu nedenle mimarisi, sınırlı kaynaklar ve donanımla çalışabilen inanılmaz derecede hafif bir tasarıma sahiptir. Statik içerikle çalışmak için en uygun olanı olsa da, dinamik içeriği de uygun şekilde işleyebilen yazılımlarla entegre olabilir.

Trafik İşleme Yetenekleri

Artık her bir sunucu hakkında temel bir fikrimiz olduğuna göre, daha fazla ayrıntıya girebiliriz. Başlayacağımız ilk özellik, her bir sunucunun trafik ve işleme yetenekleridir. Bu, bu iki platformu birbirinden ayıran ana noktalardan biridir. Aynı anda birden fazla bağlantıyı işleme söz konusu olduğunda mimarileri farklı ilkelerle çalışır.

Apache

Apache, MPM- Multi-Processing Modules adı verilen bir yapı kullanır. Yöneticiler, bağlantı işleme mimarisini manipüle etmek ve değiştirmek için çeşitli MPM'ler kullanır. Apache web sunucusunun cazibesinin bir parçası da mimarisinin sunduğu esnekliktir. İşlemeyi bireysel ve iş parçacığı gruplarına bölen bu tür modül tabanlı bir altyapı, ölçeklendirmeyi ve farklı bağlantı türlerine uyum sağlamayı kolaylaştırır.

Apache’de kullanılan bazı bireysel modüllere göz atalım:

  • mpm_prefork

Birincisi mpm_prefork'tur. Bu, ziyaretçilerden gelen istekleri işlemekten sorumlu bir işlem modülüdür. Herhangi bir zamanda tek bir bağlantıyı işlemek için bir iş parçacığı veya alt işlem oluşturur. Bu, istek sayısının işlem sayısından az olması durumunda mpm_prefork'un işlevinde oldukça verimli olduğu anlamına gelir.

Her bir istek ayrı bir alt işlem tarafından tek tek işlendiği için istekler hızlı bir şekilde işlenir. Ama bu aynı zamanda, istek sayısının işlem sayısını aşması durumunda işleri önemli ölçüde yavaşlatabileceği anlamına da gelir. Sonuç olarak, istek işleme adımı çok fazla RAM tüketir.

  • mpm_worker

Zaten bildiğimiz gibi, bir iş parçacığı bir bağlantıdan sorumludur. Bu modül bir adım daha ileri giderek aynı anda birden fazla iş parçacığını yönetmenizi sağlar. Bu, belirli bir eşiğin ötesinde zorlanan mpm_prefork ile karşılaştırıldığında çok daha ölçeklenebilir bir modüldür. Yeni bağlantılar, beklemek zorunda kalmak yerine hemen bir iş parçacığına bağlanabilir.

  • mpm_event

Mpm_event, keep-alive (bağlantıyı açık tutma) bağlantılarını sürdürmekten sorumludur. Bu modülün birincil amacı, keep-alive istekleri nedeniyle sistemin tıkanmasını önlemektir. Bunu, aktif bir istek olmasa bile bir iş parçacığını bir bağlantıya atayarak yapar. İş parçacığı, bağlantı canlı olduğu sürece özel olarak kalacaktır. Gelen tüm istekler boşta olan iş parçacıklarına aktarılır.

Nginx

Apache'nin aksine, Nginx çok özel bir amaç düşünülerek oluşturulmuştur. Bu düzeyde bağlantı ve ölçeklenebilirlik ile ilgili ortaya çıkan sorunları zaten biliyorduk. Bu nedenle asenkron ve bloklamayan (non-blocking) bir algoritma kullanır. Her bağlantı için ayrı iş parçacıkları atamaz. Bunun yerine Nginx, aynı anda binlerce bağlantıyı işleyebilen çok sayıda çalışan işlem üretir.

Nginx mimarisinin arkasındaki çalışma prensibi hızlı döngü mekanizmasıdır. Bu algoritma sürekli olarak olayları işler ve bunları izler. Bu, işlemlerin olay güdümlü (event-driven) olduğu ve her çalışan işlemin yalnızca kendi bağlantılarına adandığı anlamına gelir. Bir çalışan işlemin tüm bağlantıları bir olay döngüsünde yer alır. Burada, bir arada bulunurlar ve bu özel çalışan altındaki diğer bağlantılarla asenkron olarak işleme tabi tutulurlar.

Böyle bir mimarinin en büyük faydası, büyük bir ölçeklenebilirlik kapasitesine izin vermesidir. Bu, özellikle sınırlı kaynaklarınız varsa veya minimum donanımla çalışmak istiyorsanız geçerli olur. Çok büyük miktarda trafik alıyor olsanız bile, RAM kullanımı üzerinde çok az etkisi olacaktır. Bunun nedeni, her bağlantı için ayrı iş parçacıkları oluşturmuyor olmanızdır.

Statik ve Dinamik İçeriğin İşlenmesi

İki web sunucusunu karşılaştırmak için kullanabileceğimiz bir diğer parametre, statik ve dinamik içeriği nasıl işledikleridir.

Apache

Apache, statik içerikle başa çıkmak için dosya tabanlı bir yöntem kullanır. MPM işleme sistemi, bu geleneksel yöntemle çalışmasına olanak tanır.

Dinamik içeriğin işlenmesi söz konusu olduğunda, Apache bunu herhangi bir harici bileşenden yardıma ihtiyaç duymadan yapabilir. Bir modül yükleyerek dinamik işlemcileri etkinleştirebilirsiniz. Bu modül, dili analiz ederek içeriği işleyecek ve ardından ilgili işlemciyi çalışana yerleştirecektir.

Dinamik içeriği işlemek için harici bileşenler kullanmak zorunda kalmamanın en büyük faydası, yapılandırma ve koordinasyon sırasında açıkça görülür. Yalnızca dahili bileşenleri birbiriyle koordine etmek çok daha kolaydır.

Nginx

Apache ve Nginx'in içeriği işleme biçimleri arasındaki en büyük fark, Nginx'in dinamik içeriği dahili olarak işleme yeteneğine sahip olmamasıdır. Dinamik içerik isteklerini işlemek için harici bir bileşenle eşleştirilmesi gerekir. Bu, Nginx sunucunuzu harici bir işlemciyle birlikte kullanmanız gerekeceği anlamına gelir. Bileşen, PHP/dinamik içerik talebini alacak, işleyecek ve ardından sunucuya geri gönderecektir.

Bilginin iki bileşen arasında aktarılması gerektiğinden, aralarındaki iletişimi koordine etmeniz gerekecektir. Kaç bağlantıya izin vermek istediğinizi belirlemeniz ve protokolü yapılandırmanız gerekecektir. Diğerlerinin yanı sıra HTTP, FastCGI, SCGI, uWSGI veya memcache gibi Nginx tarafından okunabilen ve anlaşılabilen protokolü kullanmanız gerekecektir.

Öte yandan, Nginx statik içeriğin işlenmesinde gerçekten çok başarılıdır. Bunu yapmak için harici kaynaklardan yardıma ihtiyaç duyar. Ayrıca yorumlayıcıyı yalnızca ihtiyaç duyduğunda etkinleştirir. Bu, Nginx kullanmanın faydalarından biridir. Yorumlayıcı sürece dahil edilmemiştir. Bu, yalnızca dinamik içeriğin işlenmesi için mevcut olacağı anlamına gelir.

İçerik Dizinleri: Dağıtık ve Merkezi Yapılandırma

Her web sunucusunun kendi içerik dizini vardır. Apache ve Nginx'i değerlendirmek için en kritik parametrelerden biri, dizin düzeyinde yapılandırmaya izin verip vermedikleridir.

Apache

İçerik dizinlerinde yönergeler içeren bazı gizli dosyalar vardır. Bunlar .htaccess dosyalarıdır. Apache ile bu yönergeleri dizin bazında yorumlayabilirsiniz. Böylece, bir istek gönderdiğinizde Apache, bir .htaccess dosyası bulmak için dosyanın yolunu inceleyecektir. Bulduğunda, içindeki yönergeleri hemen yorumlayacak ve uygulayacaktır. Apache, bu yönergeleri uygulamak için sunucuyu yeniden yüklemeyecektir.

Yukarıda tanımlanan süreç, web sunucusundaki dizinlerin merkezi olmayan yapılandırmasına olanak tanır. Merkezi olmayan yapılandırma; URL yönlendirmeleri, erişim kısıtlamalarının uygulanması, yetkilendirmelerin onaylanması ve önbelleğe alma politikalarının belirlenmesi için kullanışlıdır.

.htaccess dosyasının faydalarından biri, kimlik doğrulaması olmayan kullanıcının tarayıcısında görüntülediği içeriğin en azından bazı yönlerini kontrol edebilmesi ve değiştirebilmesidir. Bu nedenle Apache, paylaşımlı barındırma sağlayıcıları tarafından sıklıkla kullanılır. Hizmet sağlayıcıların merkezi yapılandırmaya yetkili erişimi vardır. Müşteriler ise ana yapılandırmaya erişimleri olmadan belirli dizinler üzerinde kontrol sağlayabilirler.

İsterseniz Apache'de .htaccess yorumlamasını kapatmanız mümkündür.

Nginx

Apache'nin aksine, Nginx herhangi bir .htaccess dosyasıyla çalışmaz. Bu durum onu nispeten daha az esnek hale getirir. Ancak Nginx, bunun yerine yapılandırma tarzında bir dizi iyileştirme sunar. Başlangıç olarak, istekleri Apache'den çok daha hızlı bir şekilde işleyebilir. Bunun nedeni, yolunda bulduğu her bir .htaccess dosyasını aramıyor, okumuyor, yorumlamıyor ve uygulamıyor olmasıdır. Nginx, her bir üst dizini aramak yerine, bir istek için yalnızca tek bir dizin araması yapar.

Ayrıca Nginx, Apache'ye göre büyük bir güvenlik avantajına sahiptir. Nginx, Apache'nin aksine, içerik dizinlerinin yapılandırmasının hiçbir bölümünü bireysel kullanıcılara devretmez. Siz sıkı güvenlik önlemleri alıyor olsanız bile, bireysel kullanıcıların da aynısını yapabileceğini kim söyleebilir? Nginx ile tüm dizin ağının güvenlik durumu ve yapılandırması üzerindeki kontrolü elinizde tutarsınız.

İstek Yorumlama

İki sunucuyu birbirinden ayırmanın bir başka yolu da istekleri yorumlama biçimleridir.

Apache

Sunucu bir istek aldığında bunu yorumlar ve ardından ilgili sistem kaynaklarına bağlar. İsteği ya dosya sistemindeki fiziksel bir kaynak ya da bir URI konumu olarak yorumlar.

Fiziksel bir kaynak olarak yorumlarken <Directory> veya <Files>  bloklarını kullanır. Bu, sunucu için varsayılan yorumlama yöntemidir. Belgenin kök dizinini alır. Ardından, belge ağacındaki ilgili dosyayı bulmak için istekteki ana bilgisayar ve bağlantı noktası numarasını takip eder.

Diğer yandan URI konumu, soyut bir değerlendirme gerektirir. Bu nedenle Apache, dosya sistemiyle çalışmak yerine soyut kaynaklar için <Location> bloklarını kullanır.

URI dışında, varsayılan dosya tabanlı sistemi kullanmaya yönelik bir dizi başka alternatif de vardır. Örneğin, eşlenecek alternatif bir konum bulmak için Alias yönergesini kullanabilirsiniz. Dosya sistemi yapılandırmasını daha esnek hale getirmek için ifade varyantlarından da yararlanabilirsiniz.

Nginx

Apache bir web sunucusu olmak üzere doğmuşken, Nginx hem bir web hem de bir proxy sunucusu olarak ikili bir rol üstlenir. Bu nedenle Nginx, dosya sistemine yönelmek yerine URI'lerle çalışmayı tercih eder. Bu tercihi, Nginx'te bir dosya sistemi dizini için yapılandırma belirtmenizin hiçbir yolu olmamasından anlayabilirsiniz. Bununla birlikte, gerektiğinde dosya sistemine çeviri yapabilir.

Server ve location, Nginx'te öncelikli olarak kullanılan yapılandırma bloklarıdır. İlki, talep edilen ana bilgisayarı (host) yorumlar. İkincisi ise ana bilgisayar ve bağlantı noktasından (port) sonraki URI bölümlerini eşleştirir. Sonuç olarak sunucu, talebi sistemdeki gerçek bir dosya yerine bir URI konumu olarak yorumlar.

URI tabanlı yorumlama sistemi sayesinde Nginx; web sunucusu, proxy sunucusu ve posta sunucusu rollerini üstlenibilmektedir. Talebi yorumlarken dosya sistemine başvurmadığı için .htaccess dosyalarını da uygulamaması anlaşılır bir durumdur.

Modül Sistemleri

Hem Apache hem de Nginx genişletme için modül sistemleri desteği sunsa da, iç işleyişlerinde bazı büyük farklılıklar vardır.

Apache

Apache ile sunucuyu çalıştırırken modülleri dinamik olarak yükleyebilir ve kaldırabilirsiniz. Çekirdek, süreçlerin merkezinde kalır ve modüller işlevselliği genişletmeye hizmet eder. Bir dizi görevi gerçekleştirmek için bu eklenebilir modülleri kullanabilirsiniz. Apache'nin geniş kütüphanesiyle seçenekler neredeyse sonsuzdur.

Hatta mod_php gibi modülleri kullanarak sunucu çekirdeğinin işlevini bile değiştirebilirsiniz. Daha önce de belirttiğimiz gibi, bu modül her bir çalışan sürece (worker process) bir PHP yorumlayıcısı yerleştirmenize olanak tanır. Bu, dinamik içeriği işlemeniz gerektiğinde kullanışlıdır.

Ancak hikaye bununla bitmiyor. İstemci kimlik doğrulaması, sunucu sıkılaştırma (hardening), önbelleğe alma, URL yeniden yazma, proxy'ler, hız sınırlama, sıkıştırma ve şifreleme gibi işlevleri etkinleştirmek için de modüller ekleyebilirsiniz.

Nginx

Nginx'in modül sistemi, modülleri ana sunucuya dinamik olarak yükleyememeniz bakımından farklıdır. Bunun yerine, modüllerin çekirdek yazılım üzerinde toplanması ve derlenmesi gerekir. Bu durum, esneklik ve kullanım kolaylığı açısından pek çok eksiğe yol açar. Dağıtım paketlerinde bazı yaygın modüller bulunsa da, diğer modüller için sunucuyu kendiniz derlemeniz gerekecektir. Bu nedenle, derlenmiş yazılımınızı geleneksel paketleme sisteminin dışında nasıl koruyacağınızı bilmeniz gerekir.

Her halükarda, bu standart dışı modül sisteminin avantajı, size yüksek derecede özelleştirme imkanı sunmasıdır. Modüllerinizi yalnızca ihtiyacınız olan işlevleri dahil ederek özelleştirebilirsiniz. İhtiyacınız olmayan bileşenleri geride bırakmanıza ve bu süreçte kendinizi güvenlik risklerinden korumanıza olanak tanır. Aynı zamanda, Apache ile yapabildiğiniz URL yeniden yazma, günlük kaydı (logging), kimlik doğrulama vb. görevleri Nginx modülleriyle de gerçekleştirebilirsiniz.

Ekosistem ve Destek

Web sunucuları söz konusu olduğunda entegrasyonlar ve yazılım desteği çok önemlidir. Sırada, Apache ve Nginx için mevcut olan uyumluluk ve desteği inceleyeceğiz.

Apache

Apache daha eski ve daha popüler bir platformdur. Bu nedenle, Nginx'e kıyasla daha geniş bir destekleyici araç ve yazılım yelpazesine sahip olması anlaşılabilir bir durumdur. Çekirdek sunucuyu desteklemek için elinizin altında tonlarca üçüncü taraf dokümantasyon bulunur. Sadece bu da değil, belirli görevleri gerçekleştirmek için onu diğer yazılımlarla da eşleştirebilirsiniz. Bu araçları projenize veya paketinize ekleyebilirsiniz. Apache ekosistemi içinde kolayca entegre edilebilirler.

Nginx

Nginx bu konuda Apache'nin gerisinde olsa da, arayı kapatmak için kesinlikle elinden geleni yapıyor. Tam potansiyelini fark eden giderek daha fazla kişi Nginx'i tercih ediyor. Kullanışlı ve hızlı işlem yapan bir web sunucusu olarak organik büyümesinin yanı sıra platforma yönelik destek de artmaya devam ediyor.

Nginx'in aşması gereken en büyük destek engellerinden biri İngilizce dilinde dokümantasyon bulmaktı. Bunun nedeni, dokümantasyonunun büyük bir kısmı da dahil olmak üzere Nginx'in çoğunun başlangıçta Rusça yazılmış olmasıdır. Ancak sunucu yayıldıkça ve daha ünlü hale geldikçe, artık evrensel dilde pek çok üçüncü taraf kaynak mevcut.

İş Birlikçi Bir Çözüm mü?

Artık Apache ve Nginx'in temel bileşenlerini ve iç işleyişini çok daha iyi anladınız. Birbirlerinden oldukça farklı olsalar da, bazı kullanıcılar her iki dünyanın da en iyisini elde etmek için bu durumdan yararlanıyor. Doğru’dur - Apache ve Nginx'i birlikte kullanmanız mümkündür.

Geleneksel olarak kullanıcılar Nginx'i ters proxy (reverse proxy) olarak kullanma ve Apache'nin önüne yerleştirme eğilimindedir. Bu, Apache'nin istek karşılama ve işleme konusundaki hız eksikliğini telafi etmenizi sağlar. Nginx, en hızlı olduğu anda tüm istekleri alır ve işler. Ayrıca, çok fazla kaynak yatırımı yapmak zorunda kalmadan çok sayıda eşzamanlı istekle hızlı bir şekilde başa çıkmanızı sağlar.

Kullanıcıların yararlandığı bir diğer Nginx özelliği de statik içeriği verimli bir şekilde işleme yeteneğidir. Nginx'in dinamik içeriği işlemek için harici bir bileşene ihtiyaç duymasını telafi etmek amacıyla, PHP ve diğer ilgili istekleri bir proxy aracılığıyla Apache'ye yönlendirebiliriz. Apache isteği bir web sayfasına dönüştürecek ve istemciye sunması için Nginx'e geri gönderecektir.

Her iki web sunucusuna da başlamanızı sağlayacak ve blogumuzda bulabileceğiniz bazı kaynaklar:

Apache
Nginx

Sonuç

Günün sonunda, hem Apache hem de Nginx'in güçlü ve zayıf yönleri vardır. Projeniz için hangi sunucuyu kullanmanız gerektiğine dair kesin ve katı kurallar veya öneriler yoktur. Benzersiz gereksinimlerinize bağlı olarak uygulamanız için neyin en iyi çalışacağına dair en iyi kararı siz verirsiniz.

Ödün veremeyeceğiniz yönleri ve özellikleri belirlemeniz ve buna göre seçim yapmanız gerekir. Karar vermek zorsa, her zaman özelleştirilmiş bir çözümde her iki sunucuyu birlikte kullanmaya yönelebilirsiniz.

Keyifli Çalışmalar!

author

Akshay Nagpal

Yazar · CloudSigma

Preslav Dobrev, CloudSigma'da Kreatif Tasarımcı olarak görev yapmakta olup geleneksel ve yenilikçi pazarlama kanallarını kullanarak tutarlı bir kurumsal kimlik oluşturmaya odaklanmaktadır. Sanatsal vizyonu stratejik pazarlamayla harmanlayarak etkili marka anlatıları oluşturma konusunda oldukça yeteneklidir.

Yorumlar

Henüz yorum yapılmamış. İlk siz olun.