Apache HTTP Sunucusu Sürüm 2.2
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.
Bu belgede <VirtualHost>
bölümleri dışında kalan
tanımlardan bahsederken ana_sunucu, <VirtualHost>
bölümlerindeki tanımlamalardan
bahsederken sankonlar diyeceğiz.
ServerName
ve
ServerPath
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.
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.
VirtualHost
yönergesinde belirtilen port numaraları
Apache'nin dinleyeceği port numaraları olarak değerlendirilmez. Bunlar
sadece, bir isteği işleme sokmak üzere seçilecek
VirtualHost
'lar arasında ayrım yapabilmek için kullanılır.
VirtualHost
yönergesinde görünen her adresin seçimlik bir
portu olabilir. Eğer bir port belirtilmemişse *
belirtildiği
varsayı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,
VirtualHost
yönergesindeki IP adresini ve portu aynen
içermediği takdirde, Apache bu çiftle en iyi eşleşeni seçer. Eğer çok
sayıda eşleşen varsa yapılandırma dosyasında ilk eşleşen
VirtualHost
seçilir.
Eğer Apache'nin istemci tarafından sağlanan HTTP Host
başlığına dayanarak ayrım yapmasını istiyorsanız
NameVirtualHost
yönergesindeki IP adresi ve portun
VirtualHost
yönergesindeki ile tamamen eşleşmesi gerekir.
İsme dayalı sanal konak seçimi sadece tek bir IP'ye dayalı sanal konak seçildikten sonra ve bu sanal konaklar aynı IP-port çiftini taşıyorlarsa mümkün olabilir.
Bir sanal konak tanımında IP adresi yerine konak ismi de kullanılabilirse de çözümleme işlemi sunucu başlatılırken yapılacağından bu önerilmez.
Ç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:)
|
|
(Okuma kolaylığı bakımından soldaki sürümü tercih etmenizi öneririz.)
İ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ı:
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 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.
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.
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.
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.
NameVirtualHost
yönergesi ile
tanımlanmış adres kümesindeki bir IP adresi üzerinden
erişilebilir.ServerAlias
ve
ServerPath
değerine bakılmaz._default_
sankonlar ile NameVirtualHost
yönergelerinin yer alış sırasının birbirlerine göre bir önemi yoktur.
Sıralama sadece aynı IP adresine sahip isme dayalı sankonlar arasında
önemlidir. Aynı adres kümesine mensup isme dayalı sankonlardan
yapılandırma dosyasında ilk sırada yer alanı en yüksek önceliğe
sahiptir.Host:
başlık alanı eşleştirme işlemi sırasında asla
kullanılmaz. Apache istemcinin bağlantı kurduğu gerçek portu
kullanır.ServerPath
yönergesinin değeri için
önek olan bir ServerPath
yönergesi yapılandırma
dosyasında daha önce yer alıyorsa sonrakiyle eşleşme asla
gerçekleşmez. (Bu belirsizliği giderecek bir Host:
başlık
alanının mümkün olmadığı varsayılır.)_default_
sankon sadece istekle eşleşen bir IP
adresi bulunamadığında port numarası eşleştiği takdirde isteğe hizmet
sunabilir. Port düzeyinde eşleşmenin olabilmesi için isteğin geldiği
port ile sankon için belirtilen port eşleşmelidir. Olası tüm portlarla
eşleşmeyi sağlamak üzere yıldız imi (_default_:*
şeklinde) kullanılabilir. Aynı şey NameVirtualHost *
sankonlarına da uygulanır. Bunun, "en iyi eşleşme" kuralının bir uzantısı
olarak bir basitleştirme oluşuna dikkat ediniz; belirgin ve tıpatıp bir
eşleşme yıldız imine göre önceliklidir._default_
dahil hiçbir sankon ile eşleşme sağlanamamış
olmalıdır. Başka bir deyişle, istemcinin bağlandığı port ile eşleşen
bir _default_
sankon olmadıkça adres ve port belirtmeyen
bir isteğe ana_sunucu yanıt verecektir.Host:
başlık alanı içermeyen veya hedefi bilinmeyen bir
istek geldiği takdirde, eğer bu istemcinin bağlandığı adres ve port
için (örneğin, NameVirtualHost
ile) tanımlanmış bir isme
dayalı sankon varsa bu isteğe ne ana_sunucu ne de bir
_default_
sankon hizmet sunabilir.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.)NameVirtualHost
ve
VirtualHost
tanımlarını okunabilirliği arttırmak için
gruplayın.ServerPath
için önek olan tanımlamalar
yapmaktan kaçının. Bundan kaçınamıyorsanız, yolu uzun olanı yolu kısa
olanın öncesine yerleştirin. Örneğin, "ServerPath /abc/def" önce
"ServerPath /abc" sonra yer alsın.