<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.tr.xsl"?>
<!-- English Revision: 420990:987254 (outdated) -->
<!-- =====================================================
 Translated by: Nilgün Belma Bugüner <nilgun belgeler.org>
   Reviewed by: Orhan Berent <berent belgeler.org>
========================================================== -->

<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<manualpage metafile="details.xml.meta">
<parentdocument href="./">Sanal Konaklar</parentdocument>
   <title>Sanal Konak Eşlemenin Derinliğine İncelenmesi</title>

<summary>

    <p>Sanal konak kodu <strong>Apache 1.3</strong> 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.
      <directive module="core">NameVirtualHost</directive> 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.</p>

    <p>Sanal konakların nasıl çalıştığını öğrenmeden sadece çalıştırmak
      isterseniz doğrudan <a href="examples.html">örneklerin bulunduğu
      sayfaya</a> bakabilirsiniz.</p>

</summary>

<section id="configparsing"><title>Yapılandırma Dosyasının Çözümlenmesi</title>

    <p>Bu belgede <code>&lt;VirtualHost&gt;</code> bölümleri dışında kalan
      tanımlardan bahsederken <em>ana_sunucu</em>, <directive type="section"
      module="core">VirtualHost</directive> bölümlerindeki tanımlamalardan
      bahsederken <em>sankonlar</em> diyeceğiz.</p>

    <p><directive module="mpm_common">Listen</directive>,
      <directive module="core">ServerName</directive>,
      <directive module="core">ServerPath</directive> ve
      <directive module="core">ServerAlias</directive> 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.</p>

    <p><code>Listen</code> yönergesinin ana_sunucu için öntanımlı değeri
      80’dir. <code>ServerPath</code> ve <code>ServerAlias</code>
      yönergelerinin ana_sunucu için öntanımlı değerleri yoktur. Öntanımlı
      <code>ServerName</code> değeri ise sunucunun IP adresinden elde
      edilir.</p>

    <p>Ana_sunucu <code>Listen</code> yönergesinin iki işlevi vardır. Biri
      Apache’nin dinleyeceği öntanımlı ağ portunu belirlemek, diğeri ise
      yönlendirmeler sırasında mutlak URI’lerde kullanılan port numarasını
      belirlemektir.</p>

    <p>Ana_sunucunun aksine sankonların portları Apache‘nin dinleyeceği
      portlar üzerinde etkili değildir.</p>

    <p><code>VirtualHost</code> yönergesinde görünen her adresin seçimlik bir
      portu olabilir. Eğer bir port belirtilmemişse öntanımlı olarak
      ana_sunucunun son <code>Listen</code> yönergesinin değeri kullanılır.
      Port olarak <code>*</code> 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 <em>adres kümesi</em> denir.</p>

    <p><directive module="core">NameVirtualHost</directive> yönergesi ilk
      sankonun IP adresi için kullanılmadığı takdirde bu IP adresine sahip ilk
      sankon IP’ye dayalı sankon olarak ele alınır. IP adresi olarak
      <code>*</code> belirtmek de mümkündür.</p>

    <p>Eğer isme dayalı sankonlar kullanılacaksa <code>NameVirtualHost</code>
      yönergesinin bu isme dayalı sankonların IP adresi kümesini içermesi
      <em>gerekir</em>. Başka bir deyişle, yapılandırma dosyanızın
      <code>NameVirtualHost</code> yönergesine sankonların sunucu isimlerinin
      karşı düştüğü IP adresini yazmalısınız.</p>

    <p>Çok sayıda <code>NameVirtualHost</code> yönergesi belirtebilirse de her
      IP:port çifti için birden fazla <code>NameVirtualHost</code> yönergesi
      belirtilmemelidir.</p>

    <p>Aşağıdaki iki örneğin eşdeğer olması için <code>NameVirtualHost</code>
      ve <code>VirtualHost</code> yönergelerinin sıralamasının bir önemi
      yoktur. (Sadece <em>tek</em> adreslik küme içindeki
      <code>VirtualHost</code> yönergelerinin sırası önemlidir; aşağıya
      bakınız:)</p>

<table><tr>
<td><example>
  NameVirtualHost 111.22.33.44<br />
  &lt;VirtualHost 111.22.33.44&gt;<br />
  # sunucu A<br />
  ...<br />
  &lt;/VirtualHost&gt;<br />
  &lt;VirtualHost 111.22.33.44&gt;<br />
  # sunucu B<br />
  ...<br />
  &lt;/VirtualHost&gt;<br />
  <br />
  NameVirtualHost 111.22.33.55<br />
  &lt;VirtualHost 111.22.33.55&gt;<br />
  # sunucu C<br />
  ...<br />
  &lt;/VirtualHost&gt;<br />
  &lt;VirtualHost 111.22.33.55&gt;<br />
  # sunucu D<br />
  ...<br />
  &lt;/VirtualHost&gt;
</example></td>
<td><example>
  &lt;VirtualHost 111.22.33.44&gt;<br />
  # sunucu A<br />
  &lt;/VirtualHost&gt;<br />
  &lt;VirtualHost 111.22.33.55&gt;<br />
  # sunucu C<br />
  ...<br />
  &lt;/VirtualHost&gt;<br />
  &lt;VirtualHost 111.22.33.44&gt;<br />
  # sunucu B<br />
  ...<br />
  &lt;/VirtualHost&gt;<br />
  &lt;VirtualHost 111.22.33.55&gt;<br />
  # sunucu D<br />
  ...<br />
  &lt;/VirtualHost&gt;<br />
  <br />
  NameVirtualHost 111.22.33.44<br />
  NameVirtualHost 111.22.33.55<br />
  <br />
</example></td>
</tr></table>


    <p>(Okuma kolaylığı bakımından soldaki sürümü tercih etmenizi öneririz.)
    </p>

    <p><code>VirtualHost</code> yönergesi çözümlendikten sonra sankon
      sunucusuna yönergedeki ilk isme atanmış portun öntanımlı olduğu bir
      <code>Listen</code> verilir.</p>

    <p>Eğer tüm <code>VirtualHost</code> isimlerinin listesi aynı adres
      kümesine çözümleniyorsa bu isimler birer <code>ServerAlias</code> gibi
      ele alınırlar (bir <code>ServerAlias</code> yönergesi ile geçersiz
      kılınmadıkça). Bir sankon tanımından sonra gelen <code>Listen</code>
      satırlarının o sankonun adres kümesine atanmış portlara bir etkisinin
      olmayacağına dikkat ediniz.</p>

    <p>İsim listeleri IP adreslerine göre gruplanır ve bir çiftler tablosuna
      kaydedilir. Eğer IP adresi bir <code>NameVirtualHost</code> 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
      <code>NameVirtualHost</code> 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.</p>

    <p>Ç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.</p>

    <p>Her sankon için bazı değerler öntanımlı olarak atanır. Bunların
      başlıcaları:</p>

    <ol>
      <li>Sankon bir <directive module="core">ServerAdmin</directive>
        yönergesi içermiyorsa,
        <directive module="core">ResourceConfig</directive>,
        <directive module="core">AccessConfig</directive>,
        <directive module="core">Timeout</directive>,
        <directive module="core">KeepAliveTimeout</directive>,
        <directive module="core">KeepAlive</directive>,
        <directive module="core">MaxKeepAliveRequests</directive>,
        <directive module="core">ReceiveBufferSize</directive> ve
        <directive module="core">SendBufferSize</directive> 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.)</li>

      <li>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.</li>

      <li>Her modülün ana_sunucudaki sunuculara özgü yapılandırmaları sankon
        sunucusununkilerle katıştırılır.</li>
    </ol>

    <p>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.</p>

    <p>Eğer, bu noktada ana_sunucu hiçbir <code>ServerName</code> satırı
      içermiyorsa <program>httpd</program> programının çalıştığı makinenin
      konak ismi öntanımlıdır. Ana_sunucunun <code>ServerName</code> için
      yaptığı DNS sorgusundan dönen IP adreslerine <em>ana_sunucu adres
      kümesi</em> diyoruz.</p>

    <p>Tanımsız <code>ServerName</code> alanları için bir isme dayalı sankon,
      sankonu tanımlayan <code>VirtualHost</code> yönergesinde belirtilen ilk
      adresi öntanımlı değer kabul eder.</p>

    <p>Sihirli <code>_default_</code> sankonları için ana_sunucunun
      <code>ServerName</code> değeri kullanılır.</p>

</section>

<section id="hostmatching"><title>Sanal Konağın Belirlenmesi</title>

    <p>Sunucu bir istek durumunda hangi sankonun kullanılacağını şöyle
      belirler:</p>

    <section id="hashtable"><title>Değer çiftleri tablosu aranır</title>

    <p>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.</p>

    <p>Arama başarısız olursa (IP adresi yoksa) hizmet, istekte belirtilen
      port için bir <code>_default_</code> sankon varsa, o sankondan, yoksa
      ana_sunucudan sunulur.</p>

    <p>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 <code>NameVirtualHost *</code> durumundaki bir
      girdiyle sonuçlanabilir.</p>

    <p>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.</p>

    </section>

    <section id="ipbased"><title>IP’ye dayalı sankon</title>

    <p>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.</p>

    </section>

    <section id="namebased"><title>İsme dayalı sankon</title>

    <p>Tabloda bulduğumuz girdi için bir isim listesi varsa bir isme dayalı
      sankon sözkonusudur. Bu isim listesi, sankonları, ilgili
      <code>VirtualHost</code> bölümlerinin yapılandırma dosyasında yer alış
      sırasına göre içerir.</p>

    <p>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 <code>Host:</code> başlık alanı olmayan istekleri bu
      sankon karşılar.</p>

    <p>Eğer istemci bir <code>Host:</code> başlık alanı ile istek yapmışsa
      liste bu sankon için aranır ve hizmet <code>ServerName</code> veya
      <code>ServerAlias</code> ile ilk eşleşmenin sağlandığı sankondan
      sunulur. <code>Host:</code> alanında bir port belirtilebilirse de Apache
      daima istemcinin isteği gönderdiği portu gerçek port kabul eder.</p>

    <p>Eğer istemci <code>Host:</code> 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 <code>ServerPath</code> değerini
      eşleştirmeye çalışırız. Listedekilerden ilk eşleşen yola sahip sankondan
      hizmeti sunarız.</p>

    <p>İstekle eşleşen bir sankon bulunamazsa IP listesinde istemcinin
      bağlandığı portla eşleşen ilk sankondan hizmeti sunarız.</p>

    </section>

    <section id="persistent"><title>Kalıcı bağlantılar</title>

    <p>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.</p>

    </section>

    <section id="absoluteURI"><title>Mutlak URI</title>

    <p>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.</p>
</section>

<section id="observations"><title>İzlenimler</title>

    <ul>
      <li>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 <code>NameVirtualHost</code> yönergesi ile
        tanımlanmış adres kümesindeki bir IP adresi üzerinden
        erişilebilir.</li>

      <li>Bir IP’ye dayalı sankon için asla <code>ServerAlias</code> ve
        <code>ServerPath</code> değerine bakılmaz.</li>

      <li>Yapılandırma dosyası içinde isme/IP’ye dayalı ve
        <code>_default_</code> sankonlar ile <code>NameVirtualHost</code>
        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.</li>

      <li>Güvenlik saikiyle, eşleştirme işlemi sırasında <code>Host:</code>
        başlık alanında belirtilen port asla kullanılmaz. Apache daima
        istemcinin bağlantı kurduğu gerçek portu kullanır.</li>

      <li>Değeri başka bir <code>ServerPath</code> yönergesinin değeri için
        önek olan bir <code>ServerPath</code> 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 <code>Host:</code> başlık
        alanının mümkün olmadığı varsayılır.)</li>

      <li>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.</li>

      <li>Bir <code>_default_</code> 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 (<code>_default_:*</code>
        şeklinde) kullanılabilir. Aynı şey <code>NameVirtualHost *</code>
        sankonlarına da uygulanır.</li>

      <li>Ana_sunucunun bir isteğe hizmet sunabilmesi için istemcinin
        bağlandığı IP adresi ve port hiçbir yerde belirtilmemiş ve
        <code>_default_</code> 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 <code>_default_</code> sankon olmadıkça adres ve port belirtmeyen
        bir isteğe ana_sunucu yanıt verecektir.</li>

      <li><code>Host:</code> 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, <code>NameVirtualHost</code> ile) tanımlanmış bir isme
        dayalı sankon varsa bu isteğe ne ana_sunucu ne de bir
        <code>_default_</code> sankon hizmet sunabilir.</li>

      <li><code>VirtualHost</code> 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 <a
        href="../dns-caveats.html">DNS ile ilgili konular ve Apache</a>
        belgesine bakınız.</li>

      <li><code>ServerName</code> her sankon için ayrı ayrı belirlenmiş
        olmalıdır. Aksi takdirde her sankon için bir DNS sorgusu gerekir.</li>
      </ul>
      </section>

</section>

<section id="tips"><title>İpuçları</title>

    <p><a href="../dns-caveats.html#tips">DNS konuları</a> sayfasındaki
      ipuçlarına ilaveten burada da bazı ipuçları bulacaksınız:</p>

    <ul>
      <li>Ana_sunucu tanımlarının hepsini <code>VirtualHost</code>
        tanımlarının öncesinde bitirin. Bu ayrıca yapılandırmanızın
        okunabilirliğini de arttırır; <code>VirtualHost</code> 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.)</li>

      <li>Birbirleriyle ilgili <code>NameVirtualHost</code> ve
        <code>VirtualHost</code> tanımlarını okunabilirliği arttırmak için
        gruplayın.</li>

      <li>Değeri başka bir <code>ServerPath</code> 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.</li>
    </ul>

</section>
</manualpage>

