Apache HTTP Sunucusu Sürüm 2.5
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.
Çoğu kullanıcı hangi türü kullanacağına karar vermek için önce İsme dayalı ve IP’ye dayalı Sanal Konak bölümünü, sonra İsme Dayalı Sanal Konak Desteği veya IP’ye Dayalı Sanal Konak Desteği belgesini okumalı ve bazı örneklere göz atmalıdır.
Bunlardan sonra tüm ayrıntıları anlamak isterseniz tekrar bu sayfaya gelebilirsiniz.
Bu belgede <VirtualHost>
bölümleri dışında kalan
tanımlardan bahsederken ana_sunucu diyeceğiz.
<VirtualHost>
bölümlerindeki tanımlamalardan bahsederken sankonlar
diyeceğiz.
Her VirtualHost
bölümü en az bir adres ve isteğe bağlı
portlar içerir.
Sanal konak tanımlarının içindeki IP adreslerinin yerine konak isimleri kullanılabilir, fakat bunlar başlatma sırasında çözümleneceklerinden çözümlemedeki bir başarısızlık bu sanal konak tanımlarının yoksayılması ile sonuçlanacaktır. Bu bakımdan önerilmez.
VirtualHost
yönergesinde görünen her adresin seçimlik bir
portu olabilir. Eğer bir port belirtilmemişse, port olarak *
belirtilmiş gibi bütün portlar dinlenir.
(VirtualHost
yönergesinde belirtilen port numaraları Apache
httpd'nin dinleyeceği port numaraları olarak yorumlanmaz, sadece bir
isteği işleme sokarken hangi VirtualHost
bölümünün
seçileceğini belirlerler. Sunucunun dinleyeceği adresleri ve portları
belirtmek için Listen
yönergesini kullanın.)
Adreslerin tamamını (DNS sorgularındaki çoklu sonuçlar dahil) içeren kümeye sankonların adres kümesi denir.
Apache httpd, bir IP adresi ve port birleşimi için en belirgin
eşleşmelerin listelendiği çok sayıdaki sanal konak arasında ayırdedici
olarak istemci tarafından sağlanan HTTP Host
başlığını
kullanır.
ServerName
yönergesi sunucu
tanımının içinde herhangi bir yerde görünebilirse de her göründüğü yerde
bir öncekini iptal eder. Hiç ServerName
belirtilmemişse,
Apache httpd, sunucu ismini sunucunun IP adresinden saptamaya
çalışır.
Belli bir IP adresi ve port çifti için yapılandırma dosyasındaki ilk isme dayalı sankon önemlidir, çünkü başka hiçbir sankonun ServerName veya ServerAlias yönergesi ile eşleşmeyen bu adres ve port çifti için alınmış tüm isteklerde bu sankon kullanılır. Ayrıca, sunucunun Sunucu İsmi Belirtimini desteklemediği durumlarda tüm SSL bağlantıları için bu sankon kullanılır.
Her sankon için bazı değerler öntanımlı olarak atanır. Bunların başlıcaları:
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.)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.
Sunucu bir istek durumunda hangi sankonun kullanılacağını şöyle belirler:
Bir adres ve port için bağlantı ilk alındığında Apache httpd tüm
VirtualHost
tanımlarında bu çifti arar.
Arama başarısız olursa *
(herşey) eşleşmelerine
bakılır.
Bir eşleşme bulunamazsa hizmet ana sunucudan sunulur.
Arama sonucunda bu IP adresi için bulunmuş VirtualHost
tanımları varsa sonraki adım hizmetin bir IP’ye dayalı sankondan mı yoksa
isme dayalı bir sankondan mı sunulacağına karar vermektir.
Eğer en iyi eşleşme olarak saptanmış IP adresi ve port çiftini içeren
sadece bir VirtualHost
yönergesi varsa artık karar vermek
için başka bir şey yapmaya gerek yoktur ve istek bu sankondan
sunulur.
Eğer en iyi eşleşme olarak saptanmış IP adresi ve port çiftini içeren
birden fazla VirtualHost
yönergesi varsa, sonraki
adımlardaki "liste" eşleşen sankonların listesi olup sankonlar listede
yapılandırma dosyasındaki yerlerine göre sıralanırlar.
Bağlantı SSL kullanıyorsa, sunucunun Sunucu İsmi Belirtimini
desteklediği durumlarda SSL istemci uzlaşımı, istenen konak ismiyle
birlikte TLS eklentisini de içeriyorsa, konak ismi, SSL olmayan
bağlantılardaki Host:
başlığı kullanımına benzer şekilde
aşağıdaki gibi kullanılır. Aksi takdirde, SSL bağlantıları için adresin
eşleştiği ilk isme dayalı sankon kullanılır. Sunucunun bağlantı için
hangi sertifikayı kullanacağını sankon belirlediği için bu önemlidir.
İstek bir Host:
başlık alanı içeriyorsa, listede
ServerName
veya ServerAlias
alanı başlık alanı
ile eşleşen ilk sankona bakılır. Host:
alanı bir port
içerebilirse de Apache httpd bunu yoksayarak daima istemcinin isteği
gönderdiği portu gerçek port kabul eder.
Yapılandırma dosyasındaki belirtilen IP adresiyle eşleşen ilk sankon en
yüksek önceliğe sahiptir ve sunucu ismi bilinmeyen ve (bir HTTP/1.0
isteği gibi) Host:
başlık alanı içermeyen istekleri de
yakalar.
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.
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.
ServerAlias
ve
ServerPath
değerine bakılmaz.Host:
başlık alanında belirtilen port asla kullanılmaz. Apache httpd daima
istemcinin isteği gönderdiği gerçek portu kullanır._default_
sankon olmadıkça adres ve port belirtmeyen bir isteğe ana_sunucu yanıt
verecektir.VirtualHost
yönergelerinde asla DNS isimleri
belirtmemelisiniz. Aksi takdirde sunucuyu başlatma sırasında DNS
sorgusu yapmaya zorlamış olursunuz. Listelenen tüm alanlar için DNS
üzerinde tam denetime sahip değilseniz bu ayrıca bir güvenlik
tehdidine yol açar. Bu konuda daha ayrıntılı bilgi edinmek için DNS ile ilgili konular ve Apache
belgesine bakınız.ServerName
her sankon için ayrı ayrı belirlenmiş
olmalıdır. Aksi takdirde her sankon için bir DNS sorgusu gerekir.DNS konuları sayfasındaki ipuçlarına ilaveten burada da bazı ipuçları bulacaksınız:
VirtualHost
tanımlarının öncesinde bitirin. Bu ayrıca yapılandırmanızın
okunabilirliğini de arttırır; VirtualHost
tanımlarının
sonrasına sarkan yapılandırmaların katıştırılması işlemi tüm sanal
konakları etkileyebilen tanımlar bakımından bir
karışıklığa/belirsizliğe sebep olabilir.)