Sanal Konaklar

# İsme Dayalı Sanal Konaklar

Bu belgede isme dayalı sanal konakların ne zaman, nasıl kullanılacakları açıklanmıştır.

IP Adresine Dayalı Sanal Konaklar
Konak Eşlemenin Derinliğine İncelenmesi
Devingen olarak Yapılandırılan Kütlesel Sanal Barındırma
Çok kullanılan sanal konak yapılandırma örnekleri
ServerPath yapılandırma örneği

# İsme dayalı ve IP’ye dayalı Sanal Konaklar

IP’ye dayalı sanal konaklarda sunulacak sanal konağı doğru tespit edebilmek için bağlantının yapıldığı IP adresine bakılır. Bu bakımdan her konak için ayrı bir IP adresine gereksinim vardır. İsme dayalı sanal konaklarda ise sunucu, istemcinin HTTP başlığının bir parçası olarak gönderdiği konak adını kullanır. Bu teknikte aynı IP adresini çok sayıda farklı konak kullanabilir.

İsme dayalı sanal barındırma nispeten daha kolaydır, çünkü her konak ismini doğru IP adresiyle eşlemek için DNS sunucunuzu yapılandırdıktan sonra Apache HTTP sunucusunu farklı konak isimlerini tanıyacak şekilde yapılandırmanız yeterli olur. İsme dayalı sanal barındırma ayrıca zaten kıt olan IP adreslerine talebi de azaltır. Bu nedenle, açıkça IP’ye dayalı sanal konakları talep eden donanım kullanmadıkça isme dayalı sanal konaklar kullanmalısınız. SNI desteksiz bir mod_ssl sürümü (Apache'nin 2.2.12 sürümüne kadar standart) kullanmıyorsanız, istemci desteğine bağlı IP’ye dayalı sanal konaklar için geçerli tarihsel sebepler, genel amaçlı bir HTTP sunucusu için artık uygulanabilir değildir.

# İsme Dayalı Sanal Konakların Kullanımı

core
DocumentRoot
NameVirtualHost
ServerAlias
ServerName
ServerPath
VirtualHost

İsme dayalı sanal konakları kullanmak için, bu konaklar için istekleri kabul edecek sunucuya IP adresini (ve muhtemelen portu da) belirtmelisiniz. Bu işlem NameVirtualHost yönergesiyle yapılır. Normal şartlar altında sunucu üzerinde bütün IP adreslerinin kullanılması gerekir; bunun için NameVirtualHost yönergesine argüman olarak `*` belirtebilirsiniz. Çok sayıda port kullanmayı planlıyorsanız (SSL çalıştırmak gibi), argümana `*:80` şeklinde port ekleyebilirsiniz. Yalnız, NameVirtualHost yönergesinde bir IP adresi belirtmiş olmakla sunucunun kendiliğinden o IP adresini dinlemeyeceğine dikkat ediniz. Bu konuda ayrıntılı bilgi edinmek için Apache’nin kullanacağı adreslerin ve portların ayarlanması belgesine bakınız. Ayrıca, sunucuda, burada belirttiğiniz IP adresine sahip bir ağ arabirimi olmalıdır.

Sonraki adım sunacağınız her konak için ayrı bir VirtualHost bölümü oluşturmaktır. VirtualHost yönergesinin argümanı ile eşleşen bir NameVirtualHost yönergesi tanımlanmış olmalıdır (değer normalde "*:80" olacaktır). Her VirtualHost bölümü içinde sunulan konağı belirtmek üzere en azından bir adet ServerName yönergesine ve konak içeriğinin dosya sisteminde bulunduğu yeri gösteren bir DocumentRoot yönergesine ihtiyacınız olacaktır.

## Ana konağı unutmayın

Mevcut sitenize sanal konaklar eklerseniz, mevcut siteniz için de bir VirtualHost bölümü oluşturmalısınız. Bu sanal konak bölümü içinde kullanacağınız ServerName ve DocumentRoot yönergelerinin argümanları, bu yönergelerin sunucu geneli için belirttiğiniz değerlerini içermelidir. Bu sanal konağı yapılandırma dosyanızdaki ilk sanal konak yapın ki, öntanımlı konak olsun.

Örnek olarak, `www.biralan.tld` adresinden sitenizi sunmakta olduğunuzu ve bunun yanına aynı IP adresini kullanan `www.digeralan.tld` sanal konağını eklemek istediğinizi varsayalım. Bunun için `httpd.conf` dosyanıza basitçe şu satırları ekleyebilirsiniz:

NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.biralan.tld
ServerAlias biralan.tld *.biralan.tld
DocumentRoot /siteler/biralan
</VirtualHost>
<VirtualHost *:80>
ServerName www.digeralan.tld
DocumentRoot /siteler/digeralan
</VirtualHost>

İsterseniz, NameVirtualHost ve VirtualHost yönergelerinde argüman olarak `*` yerine doğrudan bir IP adresi belirtebilirsiniz. Hatta, daha sonra, isme dayalı sanal konakları bir IP adresinden ve IP’ye dayalı olanları veya isme dayalı diğer bir sanal konak grubunu diğer IP adreslerinden sunmak isteyebilirsiniz.

Çoğu sunucunun birden fazla isim ile erişilebilir olması istenir. Bu, VirtualHost bölümü içine bir ServerAlias yönergesi yerleştirmek suretiyle mümkün olur. Örneğin yukarıdaki örnekte, kullanıcıların aynı siteye farklı isimlerle erişmelerini mümkün kılmak için bölüm içine şu satırı ekleyebilirsiniz:

ServerAlias biralan.tld *.biralan.tld

Böylece `biralan.tld` alanındaki tüm konaklar için gelen isteklere `www.biralan.tld` sanal konağından hizmet sunulmuş olur. Konak isimleriyle eşleşmek üzere dosya ismi kalıp karakterleri `*` ve `?` kullanılabilir. Şüphesiz bu isimleri sırf ServerName veya `ServerAlias` yönergesinde belirtmiş olmakla bu isimleri erişilebilir kılamazsınız. Öncelikle, bu isimleri sunucunuzdaki IP adresleriyle eşlemek üzere yapılandıracağınız bir DNS sunucunuz olmalıdır.

`VirtualHost` içindeki isimlerin tamamı (jokersiz) bir `ServerAlias` gibi ele alınır (fakat başka bir `ServerAlias` ile geçersiz kılınmazlar).

Son olarak, sanal konak yapılandırmanıza, VirtualHost bölümlerinin içine başka yönergeler yerleştirerek ince ayar çekebilirsiniz. Çoğu yönerge bu bölümlere yerleştirilebilir ve sadece o sanal konakla ilgili yapılandırmayı değiştirmek için kullanılabilir. Belli bir yönergenin sanal konak bölümlerinde kullanılıp kullanılmayacağını yönergenin açıklamasında Bağlam satırına bakarak öğrenebilirsiniz. Ana sunucu bağlamındaki (VirtualHost bölümleri dışındaki) yapılandırma yönergelerinden sadece sanal konak bölümlerinde geçersiz kılınmamış olanlar kullanılacaktır.

Sunucuya bir istek geldiğinde, sunucu önce IP adresiyle eşleşmesi olası NameVirtualHost bölümleri var mı diye bakar. Varsa, IP adresini eşleştirmek için NameVirtualHost bölümlerine tek tek bakar ve istenen konak ismi ile eşleşen bir ServerName veya `ServerAlias` yönergesi bulmaya çalışır. Bir tane bulduğunda, sunucu için onun yapılandırmasını kullanır. İsimle eşleşen bir sanal konak bulamazsa IP adresiyle eşleşen ilk sanal konağın yapılandırmasını kullanır.

Bir önkabul olarak yapılandırma dosyasında rastlanan ilk sanal konak öntanımlı sanal konaktır. IP adresi bir sanal konakla eşleştiği takdirde ana sunucunun DocumentRoot değeri asla kullanılmayacaktır. Sanal konaklardan hiçbiriyle eşleşmeyen istekler için özel bir yapılandırmanız olsun isterseniz, bu yapılandırmayı yapılandırma dosyanızdaki ilk VirtualHost bölümüne yerleştirmeniz yetecektir.

# Artık Tarihe Karışmış Tarayıcılarla Uyumluluk

Evvelce de bahsedildiği gibi, isme dayalı sanal konakların gerektiği gibi çalışması için gerekli veriyi göndermeyen bazı istemciler vardır. Bu istemcilere daima o IP adresinin yapılandırma dosyasındaki ilk sanal konağının (isme dayalı başat sanal konak) sayfaları gönderilir.

## Ne kadar eski?

Lütfen dikkat edin, eski deyince gerçekten de antika demek istiyoruz. Günümüzde bu tür tarayıcılara rastlamanız neredeyse imkansızdır. Günümüz tarayıcılarının hepsi isme dayalı sanal konakların gerektirdiği `Host` başlığını gönderirler.

Olayı fazla germeden ServerPath yönergesini kullanarak sorunun çevresinden dolanmak mümkündür:

Örnek yapılandırma:

NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
ServerName www.biralan.tld
ServerPath /biralan
DocumentRoot /siteler/biralan
</VirtualHost>

Bu ne anlama geliyor? Anlamı, "`/biralan`" ile başlayan her URI isteği `www.biralan.tld` sanal konağı tarafından sunulacak, demektir. Yani, tüm istemcilerin `http://www.biralan.tld/biralan/` olarak eriştiği yere `Host:` başlığı gönderen istemciler `http://www.biralan.tld/` olarak erişirler.

Bunu gerçekleştirebilmek için başat sanal konağın baş sayfasına `http://www.biralan.tld/biralan/` için bir bağ koyduktan sonra sanal konağın sayfalarında ya tamamen göreli bağlar ("`dosya.html`", "`../simgeler/resim.png`" gibi) veya `/biralan/` ile öncelenmiş bağlar ("`http://www.biralan.tld/biralan/muht/dosya.html`" veya "`/biralan/muht/dosya.html`" gibi) kullanın.

Bu işlem biraz disiplin gerektirse de bu yazılanlara sıkı sıkıya bağlı kalarak hem eski hem de yeni tarayıcıların sayfalarınızı doğru görüntülemesini sağlamış olursunuz.