Sanal Konak Eşlemenin Derinliğine İncelenmesi - Apache HTTP Sunucusu

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Sanal Konaklar

# Sanal Konak Eşlemenin Derinliğine İncelenmesi

Mevcut Diller: en | fr | 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.

## 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.

`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:)

`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.)

İ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.

## 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

- Bir isme dayalı sankon asla bir IP’ye dayalı sankon ile (veya tersi) etkileşime girmez. IP’ye dayalı sankonlara sadece kendi adres kümesindeki bir IP adresi üzerinden erişilebilir, asla başka bir adresten erişilemez. Aynısı isme dayalı sankonlara da uygulanır; onlara sadece bir `NameVirtualHost` yönergesi ile tanımlanmış adres kümesindeki bir IP adresi üzerinden erişilebilir.
- Bir IP’ye dayalı sankon için asla `ServerAlias` ve `ServerPath` değerine bakılmaz.
- Yapılandırma dosyası içinde isme/IP’ye dayalı ve `_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.
- Değeri başka bir `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.)
- Eğer tek bir IP adresine sahip IP’ye dayalı iki sankon varsa eşleşme daima yapılandırma dosyasında ilk yer alanla gerçekleşir. Böyle bir şey kasten yapılmaz. Sunucu böyle bir durumu saptadığında hata günlüğünde bir uyarı verecektir.
- Bir `_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.
- Ana_sunucunun bir isteğe hizmet sunabilmesi için istemcinin bağlandığı IP adresi ve port hiçbir yerde belirtilmemiş ve `_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.

## İpuçları

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

- Ana_sunucu tanımlarının hepsini `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.)
- Birbirleriyle ilgili `NameVirtualHost` ve `VirtualHost` tanımlarını okunabilirliği arttırmak için gruplayın.
- Değeri başka bir `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.

Mevcut Diller: en | fr | ko | tr