Tarayıcıya bir adres yazıldığında ve sayfa açıldığında, arada birkaç ayrı bileşen sırayla iş yapar. “Web sunucusu” denen şey bunların yalnızca biridir — ve hangi işi yaptığını bilmek, arıza ararken doğru yere bakmayı sağlar.
İsteğin izlediği yol
Sıra kabaca şudur.
Önce adres bir IP’ye çözülür; nasıl olduğu DNS nasıl çalışır yazısında. Sonra tarayıcı o adrese bağlanır ve şifreli bağlantı kurulur; mekanizması TLS sertifikası nasıl çalışır yazısında.
Ardından tarayıcı bir istek gönderir: hangi yolu istediğini, hangi konak adına bağlandığını ve neleri kabul edebileceğini söyler.
Web sunucusu bu isteği alır ve tek bir karar verir: bu isteği kendim mi yanıtlayacağım, yoksa başkasına mı devredeceğim?
Statik ile dinamik
Karar bu ayrımdan çıkar.
Statik içerik, diskte hazır duran dosyalardır: görseller, biçim dosyaları, betikler, önceden üretilmiş sayfalar. Web sunucusu bunları doğrudan okuyup gönderir. Bu iş çok hızlıdır ve sunucunun asıl uzmanlık alanıdır.
Dinamik içerik, isteğe göre üretilir: kullanıcıya özel bir sayfa, bir arama sonucu, bir sipariş listesi. Bunu web sunucusu üretmez; arkadaki uygulamaya devreder, yanıtı alır ve istemciye iletir.
Bu ayrım performansın temelidir. Bir sayfanın statik hâle getirilebilen her parçası, uygulamaya hiç uğramadan servis edilir.
Sanal konak
Tek bir sunucu, tek bir IP adresiyle onlarca farklı siteyi barındırabilir. Bunu sağlayan şey, isteğin içinde taşınan konak adı bilgisidir.
Sunucu bu ada bakar ve hangi sitenin yapılandırmasını kullanacağına karar verir. Aynı IP’ye gelen iki farklı ad, tamamen farklı iki siteye çözülür.
Şifreli bağlantıda bir incelik vardır: sunucunun hangi sertifikayı sunacağını, bağlantı kurulurken bilmesi gerekir. İstemci bu yüzden bağlanmanın en başında hangi adı istediğini bildirir. Çok eski istemciler bunu yapmaz ve yanlış sertifika alırlar.
En sık görülen yapılandırma hatası buradadır: tanımlı olmayan bir adla gelen istek, listedeki ilk siteye düşer. Beklenmedik bir siteyi görmenin klasik nedeni budur; çözümü, tanımsız adlar için açık bir varsayılan tanımlamaktır.
Uygulama sunucusu ayrı bir şeydir
Karışıklığın büyük bölümü buradan doğar.
Web sunucusu, HTTP konuşur ve dosya servis eder. Uygulama sunucusu ise kodu çalıştırır; kendi süreç havuzu, kendi bellek yönetimi ve kendi yaşam döngüsü vardır.
İkisi arasındaki bağlantı, ayrı bir protokol ya da yerel bir soket üzerinden kurulur.
Bu ayrım arıza aramada belirleyicidir. Sayfa açılmıyorsa soru şudur: web sunucusu mu yanıt vermiyor, yoksa uygulamadan yanıt alamıyor mu? İkisi farklı durum kodları üretir; ayrımı HTTP durum kodları yazısında.
Eşzamanlılık modeli
Web sunucularının performans farkı büyük ölçüde tek bir tasarım kararından gelir: aynı anda gelen binlerce bağlantı nasıl karşılanır?
Eski model her bağlantı için ayrı bir süreç ya da iş parçacığı ayırır. Anlaşılması kolaydır; ama her bağlantı bellek tüketir ve sayı arttıkça sunucu tükenir.
Modern model, az sayıda çalışanın çok sayıda bağlantıyı aynı anda takip etmesine dayanır. Bağlantı beklerken kaynak tüketmez.
Pratik sonucu şudur: yavaş istemcilerin çok olduğu ortamlarda — mobil ağlar, uzak kullanıcılar — ikinci model belirgin biçimde dayanıklıdır. Öndeki sunucunun yavaş istemciyi tamponlaması, arkadaki uygulamayı korur; ayrıntısı ters vekil nedir yazısında.
Yapılandırmanın üç kritik alanı
Bir web sunucusunu ilk kez ayağa kaldırırken üç şey ilk gün karara bağlanmalıdır.
Kök dizin ve erişim sınırı. Sunucunun hangi dizini servis edeceği ve o dizinin dışına çıkılamayacağı. Yanlış yapılandırma, yapılandırma dosyalarının indirilebilir olmasına yol açar.
Günlükler. Erişim ve hata günlüklerinin nereye yazıldığı ve ne kadar tutulacağı. Sonradan eklenmez — sorun yaşandığında zaten geçmiş kayıt gerekir. Okuma yöntemi erişim günlüğü okumak yazısında.
Sınırlar. Bir isteğin en fazla ne kadar büyük olabileceği ve ne kadar sürebileceği. Sınırsız bırakılan bir sunucu, tek bir istekle tüketilebilir.
İki yaygın sunucu, iki farklı gelenek
Bugün karşınıza çıkacak iki ana seçenek vardır ve aralarındaki fark yalnızca performans değildir.
Biri, yapılandırmayı dizin içine bırakılan dosyalarla da yapılabilir hâle getirir. Paylaşımlı barındırmada yaygınlaşmasının nedeni budur: her sitenin sahibi kendi kurallarını yazabilir. Bedeli, her istekte bu dosyaların aranmasıdır.
Diğeri yapılandırmayı tek merkezde tutar ve dizin içi dosyaları hiç okumaz. Daha hızlıdır ve daha öngörülebilirdir; buna karşılık her değişiklik yapılandırmanın yeniden yüklenmesini gerektirir.
Seçim, kimin yapılandırma yapacağına bakar.
Kısaca
Web sunucusu, HTTP isteğini alıp ya diskteki dosyayla yanıtlar ya da arkadaki uygulamaya devreder.
Statik ile dinamik ayrımını bilmek performansın, sanal konak mantığını bilmek yapılandırmanın, uygulama sunucusuyla ayrımını bilmek ise arıza aramanın temelidir. Üçü karıştırıldığında hata her seferinde yanlış yerde aranır.