Web Sunucusunda Sanal Host (Virtual Host) Nedir?

Virtual host (sanal host), tek bir web sunucusunun birden fazla site için ayrı kurallar uygulamasını sağlayan mantıksal yapılandırmadır. Her sanal host; yanıt vereceği alan adlarını, içerik kökünü, yönlendirmeleri, erişim kurallarını, günlükleri ve gerekiyorsa arka uç uygulamasını ayrı tanımlayabilir.
Bir istek geldiğinde sunucu önce bağlantının ulaştığı IP adresini ve portu değerlendirir. Aynı IP adresi ve port için birden fazla aday varsa web isteklerini ve yanıtlarını tanımlayan HTTP içindeki hedef adı, site seçimini sağlar. HTTP iletişimini TLS ile şifreleyen HTTPS bağlantısında sertifika seçimi daha önce, TLS el sıkışması sırasında yapılır.
Bu yapı, paylaşımlı hosting denilen ortak barındırma hizmetinde tek IP adresinden çok sayıda site sunulabilmesinin temel mekanizmalarından biridir. Ancak sanal host; ayrı işletim sistemi, VPS (Virtual Private Server) veya sanal makine anlamına gelmez.
Web Sunucusu Sanal Hostu Nasıl Seçer?
Yeni bağlantıda tipik işlem sırası aşağıdaki gibidir. Açık bağlantı yeniden kullanılıyorsa bağlantı kurma ve TLS el sıkışması her HTTP isteğinde tekrarlanmaz.
- İstemci, alan adına ait IP adresini önbelleğinden alır veya DNS üzerinden sorgular.
- İstemci, bu IP adresindeki hedef porta bağlantı kurar.
- HTTPS kullanılıyorsa istemci TLS el sıkışmasında SNI (Server Name Indication) ile hedef alan adını bildirebilir; sunucu buna göre sertifika ve ilk TLS bağlamını seçer.
- HTTP isteği hedef alan adı ile gerektiğinde port bilgisini taşır.
- Web sunucusu, bağlantının ulaştığı IP adresini ve portu, ayrıca istek alan adını değerlendirerek eşleşen sanal hostu belirler.
- Seçilen yapılandırma dosya sunar, uygulamaya aktarır, yönlendirme yapar veya tanımlanmış hata yanıtını üretir.
DNS yalnız istemciyi bir adrese ulaştırır; web sunucusundaki sanal hostu doğrudan seçmez. Aynı IP adresine çözümlenen iki alan adı, isteklerinde farklı adlar taşıdığı için farklı içerikler görebilir. Yalnız IP adresiyle yapılan test ise hedef alan adı yerine o IP adresi ve port çiftinin varsayılan sanal hostuna düşebilir.
Ad, IP Adresi ve Port Tabanlı Sanal Host Türleri
| Tür | Seçimde kullanılan bilgi | Yaygın kullanım | Temel koşul |
|---|---|---|---|
| Ad tabanlı | İstekteki alan adı | Tek IP adresinde birden fazla site | İstemci hedef adı doğru iletmeli ve ad yapılandırmada bulunmalıdır |
| IP tabanlı | Bağlantının ulaştığı hedef IP adresi | Site veya hizmete ayrı IP adresi ayırma | Sunucuda ilgili adres tanımlı ve dinleniyor olmalıdır |
| Port tabanlı | Bağlantının ulaştığı port | Aynı IP adresinde farklı portlarda hizmet | Port dinlenmeli ve ağ kurallarında izinli olmalıdır |
| Birleşik seçim | IP adresi, port ve alan adı | Gerçek üretim kurulumlarının çoğu | Önce IP adresi ve port adayları, sonra ad eşleşmesi değerlendirilir |
Varsayılan HTTP portu 80, HTTPS portu 443'tür; ancak başka portlar da kullanılabilir. İstemci varsayılan olmayan bir porta doğrudan bağlanıyorsa port numarası URL’nin alan adından veya IP adresinden sonraki bölümünde görünür. İsteği başka bir sunucuya ileten reverse proxy (ters proxy) dışarıda 443'ü dinleyip web sunucusuna içeride başka bir porttan bağlanabilir; bu durumda ziyaretçi iç portu görmez.
HTTP Host Başlığı ve :authority Ne İşe Yarar?
HTTP/1.1 isteğindeki Host başlığı, hedef ana bilgisayar adını ve gerekiyorsa portu taşır. HTTP/1.1 istemcisi bu başlığı göndermelidir. Başlık yoksa, birden fazla Host satırı varsa veya değer geçersizse sunucu 400 Hatalı İstek yanıtı vermelidir. Bu kural, isteğin hedef ana bilgisayarının belirsiz kalmasını önler.
HTTP/2 ve HTTP/3, aynı bilgiyi çoğu istekte :authority sözde başlığıyla taşır; bu alan kullanılıyorsa ayrıca Host bulunması gerekmez. Bir ters proxy protokol sürümünü değiştirirken bu alanı arka uçtaki Host başlığına dönüştürebilir. Dönüşümde alan adı veya port yanlış yazılırsa istek doğru IP adresine ulaşsa bile yanlış sanal host seçilebilir.
Sunucu, bağlantının geldiği gerçek hedef portu yapılandırmadaki dinleme noktalarıyla karşılaştırır. Host değerinin içinde port bulunması, sunucunun başka bir gerçek porta gelmiş bağlantıyı o porta taşınmış saymasını sağlamaz. Alan adındaki büyük-küçük harf farkının, sondaki noktanın ve uluslararasılaştırılmış alan adının (IDN) nasıl işlendiği sunucunun kurallarıyla doğrulanmalıdır. Hedef bir IPv6 adresiyse bu alanlarda adres köşeli parantez içine alınır.
DNS Kaydı ile Sanal Host Yapılandırması Nasıl Birlikte Çalışır?
Bir alan adını sanal hostta tanımlamak DNS kaydını otomatik oluşturmaz. Tersi de geçerlidir: DNS kaydının sunucu IP adresini göstermesi, web sunucusunda o ada ait yapılandırma bulunduğunu garanti etmez. Yayın için iki katman da doğru olmalıdır.
- A kaydının IPv4, AAAA kaydının IPv6 adresine çözüldüğünü doğrulayın.
- Ana alan adı,
wwwsürümü ve gerekli alt alan adlarını sanal hostta açıkça tanımlayın. - IPv4 ile IPv6 trafiğinin aynı site yapılandırmasına ulaştığını ayrı ayrı sınayın.
- DNS geçişi sırasında eski ve yeni sunucuların bir süre trafik alabileceğini hesaba katın.
- IDN’yi web sunucusunun beklediği biçimde tanımlayın; ASCII harf, rakam ve tireleriyle yazılan ad bekleniyorsa Punycode ile kodlanmış biçimini kullanın.
DNS sonucu doğru olduğu halde yanlış site açılıyorsa hedef IP adresi ve port çifti, istek alan adı, varsayılan sanal host ve öndeki proxy'nin Host başlığını nasıl ilettiği birlikte incelenmelidir. Yalnız DNS önbelleğini temizlemek sunucu yapılandırmasındaki eksik adı düzeltmez.
HTTPS Bağlantısında SNI ve Sertifika Nasıl Seçilir?
TLS el sıkışması, şifreli HTTP isteği okunmadan önce başlar. Bu nedenle sunucu sertifikayı HTTP Host başlığına bakarak seçemez. SNI, istemcinin TLS aşamasında bağlanmak istediği alan adını iletir; sunucu aynı IP adresindeki uygun sertifika ve TLS yapılandırmasını seçebilir.
SNI göndermeyen istemci genellikle o IP adresi ve port için seçilmiş varsayılan sertifikayı görür; sunucu yapılandırmasına göre bağlantı da reddedilebilir. Sertifika, ziyaret edilen alan adını SAN (Subject Alternative Name) alanında kapsamalıdır. Joker sertifika belirli bir ad düzeyini kapsayabilir; her alt alanı veya kök alan adını kendiliğinden kapsadığı varsayılmamalıdır.
HTTP isteğinin hedefi, sunucunun o bağlantıda hizmet verebildiği adlardan biri olmalıdır. Örneğin HTTP/2, sertifika ve sunucu yetkisi koşulları sağlandığında aynı bağlantının farklı alan adları için yeniden kullanılmasına izin verir; her istekteki adın ilk SNI adıyla birebir aynı olması zorunlu değildir. Sunucu bu bağlantıda ilgili ada hizmet veremiyorsa 421 Yanlış Yönlendirilmiş İstek yanıtı verebilir. Sertifikanın geçerli olması, HTTP sanal hostunun da doğru seçildiğini tek başına kanıtlamaz.
Eşleşme Bulunamazsa Hangi Site Açılır?
Davranış yazılıma ve yapılandırmaya bağlıdır. Apache HTTP Server'da belirli bir IP adresi ve port eşleşmesi için listelenen ilk ad tabanlı sanal host çoğu kurulumda varsayılan görevi görür. Nginx'te varsayılan sunucu, ilgili dinleme adresi ve port için default_server ile açıkça seçilebilir; seçilmezse aynı adres-port çiftindeki ilk sunucu bloğu varsayılan olur.
Üretim sitesini istemeden varsayılan yapmak yerine bilinmeyen adları reddeden veya nötr bir hata sayfası sunan ayrı bir varsayılan yapılandırma kullanmak daha güvenlidir. Aksi halde sunucunun IP adresine ya da size ait olmayan bir alan adına gelen istek, gerçek sitelerden birini gösterebilir ve yanlış yönlendirme bağlantıları üretebilir.
Apache'de etkin sanal host eşleşmeleri yapılandırma dökümüyle, Nginx'te ise etkin yapılandırma ve dinleme bloklarıyla denetlenebilir. Değişiklikten önce sözdizimi testi yapılmalı; yeniden yüklemeden sonra yalnız dosya değil gerçek ziyaretçi yanıtı doğrulanmalıdır.
Apache ve Nginx'te Alan Adı Eşleşmesi
Apache HTTP Server'da <VirtualHost> bloğu isteklerin eşleştirileceği IP adresi ve port kapsamını, ServerName ana adı, ServerAlias alternatif adları ve DocumentRoot dosya kökünü belirleyebilir. Bu blok tek başına yeni bir adresi veya portu dinlemeye açmaz; dinleme noktalarını Listen yönergesi belirler. Bağlantı önce uygun IP adresi ve port grubuna yerleştirilir; ardından istek adı o gruptaki ana ve alternatif adlarla karşılaştırılır. Yapılandırma sırası varsayılan seçimi etkileyebildiği için ilk bloğun gerçek üretim sitesi olarak kazara bırakılmaması gerekir.
Nginx'te listen yönergesi adres ve portu, server_name ise alan adı eşleşmelerini tanımlar. Kesin adlar, joker adlar ve düzenli ifadeler kullanılabilir. Önce tam ad eşleşmesi, ardından başında yıldız bulunan en uzun joker ad, sonra sonunda yıldız bulunan en uzun joker ad, son olarak yapılandırmadaki ilk eşleşen düzenli ifade seçilir. default_server, alan adının değil ilgili listen adresi-port çiftinin özelliğidir. Bu ayrım, farklı portların farklı varsayılan sunuculara sahip olabilmesini sağlar.
Her iki üründe de yapılandırma dosyasını okumak tek başına yeterli değildir. Dahil edilen ek dosyalar, yönetim panelinin ürettiği bloklar ve yükleme sırası etkin sonucu değiştirebilir. Apache'nin etkin sanal host dökümü veya Nginx'in birleştirilmiş etkin yapılandırması incelenmeli; sonuç SNI ve Host değerleri açıkça verilmiş gerçek isteklerle doğrulanmalıdır.
Paylaşımlı Hosting Hizmetinde Kaynaklar Nasıl Ayrılır?
Paylaşımlı hosting hizmetinde birçok alan adı aynı genel IP adresini gösterebilir. Web sunucusu her isteği ilgili sanal hosta yöneltse de işlemci, bellek, disk, bağlantı kapasitesi ve süreçler hizmet modeline göre ortak kullanılabilir. Sanal host, donanım kaynağını kendiliğinden ayırmaz.
Hesap başına kota, dosya sahibi, süreç kullanıcısı, konteyner, uygulama havuzu veya erişim politikası gibi mekanizmalar kaynak ve güvenlik ayrımını ayrıca sağlar. Bir sitenin dosya izinleri ya da uygulama kullanıcısı yanlışsa sanal host eşleşmesinin doğru olması diğer sitelere erişim riskini ortadan kaldırmaz.
Sanal host sayısı için evrensel bir üst sınır yoktur. Gerçek sınır trafik, TLS el sıkışmaları, açık dosya ve bağlantı sınırları, uygulama yükü, günlük hacmi, sertifika yönetimi ve işletim süreciyle belirlenir. Çok sayıda yapılandırma çalışabilir; yönetilemeyen yapılandırma ise hata olasılığını büyütür.
Sanal Host, VPS ve Sanal Makine Arasındaki Farklar
Sanal host, web sunucusu yazılımının istekleri site yapılandırmalarına ayırmasıdır. Aynı işletim sistemi ve aynı temel süreç havuzu içinde çalışabilir. VPS ve sanal makine ise altyapı sanallaştırmasıyla oluşturulan ayrı çalışma ortamlarıdır; kendi ağ arayüzleri, süreç alanı ve sınırlandırılmış kaynakları olabilir.
Bir VPS içinde çok sayıda sanal host çalıştırılabilir. Fiziksel sunucuda, sanal makinede veya konteynerde de aynı sanal host mekanizması kullanılabilir. “Sanal sunucu” sözü iki katmanı karıştırabildiği için web sunucusu bağlamında sanal host, altyapı bağlamında ise VPS veya sanal makine demek daha açıktır.
Sanal Host ile Ters Proxy Nasıl Birlikte Çalışır?
Sanal host gelen isteğin hangi ön uç kurallarıyla işleneceğini seçer; ters proxy ise isteği uygun arka uç hizmetine iletir. Aynı sanal host, yol veya alan adına göre birden fazla arka uca yönlendirme yapabilir. Apache ve Nginx iki rolü de üstlenebilir; roller eş anlamlı değildir.
Proxy arka uca gönderdiği Host değerini koruyabilir veya bilinçli olarak değiştirebilir. Uygulamanın mutlak bağlantı, çerez alan adı veya yönlendirme üretmek için hangi adı kullanacağı açıkça belirlenmelidir. X-Forwarded-Host veya Forwarded gibi iletilen başlıklar yalnız güvenilir proxy'den geldiğinde kabul edilmelidir; istemcinin aynı adlarla gönderdiği kontrolsüz değerler yönlendirme ve bağlantı üretiminde kullanılmamalıdır.
Sanal Host Yapılandırması Nasıl Doğrulanır?
- Her alan adının DNS sonucunu, hedef IP adresini ve portu doğrulayın.
- HTTP/1.1 isteğinde
Host, HTTP/2 ve HTTP/3 isteğinde:authoritydeğerini denetleyin; alan adıyla yapılan HTTPS testinde SNI adını da kontrol edin. - Ana ad,
www, gerekli alt alanlar ve yönlendirme hedeflerini ayrı sınayın. - Bilinmeyen bir alan adını taşıyan isteği ve doğrudan IP adresiyle yapılan isteği ayrı ayrı sınayın; varsayılan sanal hostun beklenen yanıtı verdiğini kontrol edin.
- Sertifikanın kullanılan alan adlarını kapsadığını doğrulayın; SNI gönderilmeyen bağlantının varsayılan sertifikayla mı yoksa reddedilerek mi karşılandığını kontrol edin.
- Erişim ve hata günlüklerinde seçilen sanal hostu, istek alan adını, hedef portu ve durum kodunu kaydedin.
- Proxy arkasında dış alan adı ile arka uç
Hostdeğerinin beklenen biçimde korunduğunu doğrulayın. - Yapılandırma değişikliğinden sonra hem yerel sözdizimi denetimi hem gerçek ziyaretçi testi yapın.







