<-
Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.0 > Sanal Konaklar

Sanal Konak Eşlemenin Derinliğine İncelenmesi

Mevcut Diller:  en  |  ko  |  tr 

Sanal konak kodu Apache 1.3 sürümünde baştan yeniden yazıldı. Bu belgede, bir istek aldığında Apache’nin hangi sanal konak ile hizmet sunacağına nasıl karar verdiği açıklanmaya çalışılmıştır. NameVirtualHost yönergesi sayesinde sanal konak yapılandırması 1.3 sürümünün öncesine göre daha kolay ve daha güvenilir hale gelmiştir.

Sanal konakların nasıl çalıştığını öğrenmeden sadece çalıştırmak isterseniz doğrudan örneklerin bulunduğu sayfaya bakabilirsiniz.

top

Yapılandırma Dosyasının Çözümlenmesi

Bu belgede <VirtualHost> bölümleri dışında kalan tanımlardan bahsederken ana_sunucu, <VirtualHost> bölümlerindeki tanımlamalardan bahsederken sankonlar diyeceğiz.

Listen, ServerName, ServerPath ve ServerAlias yönergeleri bir sunucu yapılandırmasının her yerinde karşımıza çıkabilir. Bununla birlikte, sunucu dahilinde son göründükleri yerlerde önceki eşdeğerlerini geçersiz kılarlar.

Listen yönergesinin ana_sunucu için öntanımlı değeri 80’dir. ServerPath ve ServerAlias yönergelerinin ana_sunucu için öntanımlı değerleri yoktur. Öntanımlı ServerName değeri ise sunucunun IP adresinden elde edilir.

Ana_sunucu Listen yönergesinin iki işlevi vardır. Biri Apache’nin dinleyeceği öntanımlı ağ portunu belirlemek, diğeri ise yönlendirmeler sırasında mutlak URI’lerde kullanılan port numarasını belirlemektir.

Ana_sunucunun aksine sankonların portları Apache‘nin dinleyeceği portlar üzerinde etkili değildir.

VirtualHost yönergesinde görünen her adresin seçimlik bir portu olabilir. Eğer bir port belirtilmemişse öntanımlı olarak ana_sunucunun son Listen yönergesinin değeri kullanılır. Port olarak * belirtildiği takdirde bütün portlar dinlenir. Adreslerin tamamını (DNS sorgularındaki çoklu A kayıtları dahil) içeren kümeye sankonların adres kümesi denir.

NameVirtualHost yönergesi ilk sankonun IP adresi için kullanılmadığı takdirde bu IP adresine sahip ilk sankon IP’ye dayalı sankon olarak ele alınır. IP adresi olarak * belirtmek de mümkündür.

Eğer isme dayalı sankonlar kullanılacaksa NameVirtualHost yönergesinin bu isme dayalı sankonların IP adresi kümesini içermesi gerekir. Başka bir deyişle, yapılandırma dosyanızın NameVirtualHost yönergesine sankonların sunucu isimlerinin karşı düştüğü IP adresini yazmalısınız.

Çok sayıda NameVirtualHost yönergesi belirtebilirse de her IP:port çifti için birden fazla NameVirtualHost yönergesi belirtilmemelidir.

Aşağıdaki iki örneğin eşdeğer olması için NameVirtualHost ve VirtualHost yönergelerinin sıralamasının bir önemi yoktur. (Sadece tek adreslik küme içindeki VirtualHost yönergelerinin sırası önemlidir; aşağıya bakınız:)

NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
# sunucu A
...
</VirtualHost>
<VirtualHost 111.22.33.44>
# sunucu B
...
</VirtualHost>

NameVirtualHost 111.22.33.55
<VirtualHost 111.22.33.55>
# sunucu C
...
</VirtualHost>
<VirtualHost 111.22.33.55>
# sunucu D
...
</VirtualHost>

<VirtualHost 111.22.33.44>
# sunucu A
</VirtualHost>
<VirtualHost 111.22.33.55>
# sunucu C
...
</VirtualHost>
<VirtualHost 111.22.33.44>
# sunucu B
...
</VirtualHost>
<VirtualHost 111.22.33.55>
# sunucu D
...
</VirtualHost>

NameVirtualHost 111.22.33.44
NameVirtualHost 111.22.33.55

(Okuma kolaylığı bakımından soldaki sürümü tercih etmenizi öneririz.)

VirtualHost yönergesi çözümlendikten sonra sankon sunucusuna yönergedeki ilk isme atanmış portun öntanımlı olduğu bir Listen verilir.

Eğer tüm VirtualHost isimlerinin listesi aynı adres kümesine çözümleniyorsa bu isimler birer ServerAlias gibi ele alınırlar (bir ServerAlias yönergesi ile geçersiz kılınmadıkça). Bir sankon tanımından sonra gelen Listen satırlarının o sankonun adres kümesine atanmış portlara bir etkisinin olmayacağına dikkat ediniz.

İsim listeleri IP adreslerine göre gruplanır ve bir çiftler tablosuna kaydedilir. Eğer IP adresi bir NameVirtualHost yönergesinde kullanılmışsa, liste bu IP adresi için tanımlanmış tüm sankonları içerir. Eğer bu IP adresinin tanımlandığı bir sankon yoksa o NameVirtualHost yönergesi yoksayılır ve günlüğe bir hata kaydı düşülür. IP’ye dayalı sankonlar için çiftler listesinde isim alanları boştur.

Çiftler listesini işleyen işlevin hızı nedeniyle bir istek sırasında IP adresine göre gruplama yaparken kaynak harcaması en düşük düzeyde olur hatta neredeyse hiç olmaz. Ek olarak, tablo, IP adresinin son sekizlisindeki değişikliklere göre de en iyilenir.

Her sankon için bazı değerler öntanımlı olarak atanır. Bunların başlıcaları:

  1. Sankon bir ServerAdmin yönergesi içermiyorsa, Timeout, KeepAliveTimeout, KeepAlive, MaxKeepAliveRequests, ReceiveBufferSize ve SendBufferSize yönergeleri için öntanımlı değerler ana_sunucudaki eşdeğerlerinden miras alınır. (Yani, bu yönergeler için ana_sunucudaki son değerler miras alınır.)
  2. Sankon için öntanımlı dizin erişim izinlerinin tanımlandığı "arama öntanımlıları" ana_sunucununkilere katılır. Buna her modülün dizinlere özgü yapılandırma bilgileri dahildir.
  3. Her modülün ana_sunucudaki sunuculara özgü yapılandırmaları sankon sunucusununkilerle katıştırılır.

Esasen, ana_sunucu, sankon sunucularını oluştururken bir öntanımlılar listesi veya öntanımlı değerlere dayanak noktası olarak ele alınır. Fakat bu ana_sunucu tanımlarının yapılandırma dosyasındaki yerlerinin saptanmasının konumuzla ilgisi yoktur; ana_sunucu yapılandırmasının tamamı son katıştırma yapılacağı zaman çözümlenir. Bu bakımdan, ana_sunucu tanımlarından bir kısmı sankon tanımlarından sonra yer alsa bile sankon tanımlarında etkili olabilir.

Eğer, bu noktada ana_sunucu hiçbir ServerName satırı içermiyorsa httpd programının çalıştığı makinenin konak ismi öntanımlıdır. Ana_sunucunun ServerName için yaptığı DNS sorgusundan dönen IP adreslerine ana_sunucu adres kümesi diyoruz.

Tanımsız ServerName alanları için bir isme dayalı sankon, sankonu tanımlayan VirtualHost yönergesinde belirtilen ilk adresi öntanımlı değer kabul eder.

Sihirli _default_ sankonları için ana_sunucunun ServerName değeri kullanılır.

top

Sanal Konağın Belirlenmesi

Sunucu bir istek durumunda hangi sankonun kullanılacağını şöyle belirler:

Değer çiftleri tablosu aranır

Bir istemci tarafından bağlantı ilk yapıldığında önce IP-isim çiftleri tablosunda istemcinin bağlandığı IP adresi için bir arama yapılır.

Arama başarısız olursa (IP adresi yoksa) hizmet, istekte belirtilen port için bir _default_ sankon varsa, o sankondan, yoksa ana_sunucudan sunulur.

Eğer çiftler tablosunda IP adresi yoksa port numarası ile eşleştirme çabası ayrıca, diğer isme dayalı sanal konaklardaki gibi ard arda ele alınmayı gerektiren NameVirtualHost * durumundaki bir girdiyle sonuçlanabilir.

Arama sonucunda tabloda IP adresi bulunursa sonraki adım hizmetin bir IP’ye dayalı sankondan mı yoksa isme dayalı bir sankondan mı sunulacağına karar vermektir.

IP’ye dayalı sankon

Eğer tabloda bulduğumuz girdinin isim alanları boşsa bir IP’ye dayalı sanal konak bulmuşuz demektir. Artık karar vermek için başka bir şey yapmaya gerek yoktur ve istek bu sankondan sunulur.

İsme dayalı sankon

Tabloda bulduğumuz girdi için bir isim listesi varsa bir isme dayalı sankon sözkonusudur. Bu isim listesi, sankonları, ilgili VirtualHost bölümlerinin yapılandırma dosyasında yer alış sırasına göre içerir.

Bu listedeki ilk sankon (yapılandırma dosyasında belirtilen IP adresine sahip ilk sankon) en yüksek önceliğe sahiptir ve sunucu ismi belirtilmeyen veya Host: başlık alanı olmayan istekleri bu sankon karşılar.

Eğer istemci bir Host: başlık alanı ile istek yapmışsa liste bu sankon için aranır ve hizmet ServerName veya ServerAlias ile ilk eşleşmenin sağlandığı sankondan sunulur. Host: alanında bir port belirtilebilirse de Apache daima istemcinin isteği gönderdiği portu gerçek port kabul eder.

Eğer istemci Host: başlık alanı bulunmayan bir HTTP/1.0 isteği yapmışsa istemcinin hangi sankona bağlanmayı denediğini bilemeyiz ve istekteki URI ile mevcut ServerPath değerini eşleştirmeye çalışırız. Listedekilerden ilk eşleşen yola sahip sankondan hizmeti sunarız.

İstekle eşleşen bir sankon bulunamazsa IP listesinde istemcinin bağlandığı portla eşleşen ilk sankondan hizmeti sunarız.

Kalıcı bağlantılar

Yukarıda açıklanan IP araması belli bir TCP/IP oturumunda bir defaya mahsus yapıldığı halde bir kalıcı/KeepAlive bağlantı sırasında her istek için ayrı bir arama yapılır. Başka bir deyişle, bir istemci tek bir kalıcı bağlantı üzerinde farklı isme dayalı sankonlardan sayfa talebinde bulunabilir.

Mutlak URI

Eğer istekte belirtilen URI bir mutlak URI ise ve istek yapılan konak ismi ve port ana sunucuyla veya sankonlardan biriyle eşleşiyorsa, şema/konakadı/port öneki ayrılır ve elde edilen göreli URI ilgili sankondan veya ana sunucudan sunulur. Eğer bir eşleşme sağlanamazsa URI’ye dokunulmaz ve istek bir vekil isteği olarak ele alınır.

İzlenimler

top

İpuçları

DNS konuları sayfasındaki ipuçlarına ilaveten burada da bazı ipuçları bulacaksınız:

Mevcut Diller:  en  |  ko  |  tr