<!DOCTYPE html SYSTEM "about:legacy-compat">
<html lang="tr"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="width=device-width, initial-scale=1" name="viewport">
<!--
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
              This file is generated from xml source: DO NOT EDIT
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      -->
<title>Apache'de Başarımın Arttırılması - Apache HTTP Sunucusu S&uuml;r&uuml;m 2.4</title>
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet">
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size">
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css"><link rel="stylesheet" type="text/css" href="../style/css/prettify.css">
<script src="../style/scripts/prettify.min.js">
</script>

<link href="../images/favicon.png" rel="shortcut icon"></head>
<body id="manual-page"><div id="page-header">
<p class="menu"><a href="../mod/">Mod&uuml;ller</a> | <a href="../mod/quickreference.html">Y&ouml;nergeler</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">SSS</a> | <a href="../glossary.html">Terimler</a> | <a href="../sitemap.html">Site Haritası</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Hata bildir</a></p>
<p class="apache">Apache HTTP Sunucusu S&uuml;r&uuml;m 2.4</p>
<img alt="" src="../images/feather.png"></div>
<div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif"></a></div>
<div id="path">
<a href="https://www.apache.org/">Apache</a> &gt; <a href="https://httpd.apache.org/">HTTP Sunucusu</a> &gt; <a href="https://httpd.apache.org/docs/">Belgeleme</a> &gt; <a href="../">S&uuml;r&uuml;m 2.4</a> &gt; <a href="./">&Ccedil;eşitli Belgeler</a></div><div id="page-content"><div id="preamble"><h1>Apache'de Başarımın Arttırılması</h1>
<button aria-label="Toggle language list" class="lang-toggle"><svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" stroke="currentColor" fill="none" viewBox="0 0 24 24" height="16" width="16"><circle r="10" cy="12" cx="12"/><line y2="12" x2="22" y1="12" x1="2"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg></button>
<div class="toplang">
<p><span>Mevcut Diller: </span><a href="../en/misc/perf-tuning.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/misc/perf-tuning.html" hreflang="fr" rel="alternate" title="Fran&ccedil;ais">&nbsp;fr&nbsp;</a> |
<a href="../ko/misc/perf-tuning.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
<a href="../tr/misc/perf-tuning.html" title="T&uuml;rk&ccedil;e">&nbsp;tr&nbsp;</a></p>
</div>
<div class="outofdate">Bu &ccedil;eviri g&uuml;ncel olmayabilir. Son değişiklikler i&ccedil;in İngilizce s&uuml;r&uuml;m ge&ccedil;erlidir.</div>


    <p>Apache 2.x, esneklik, taşınabilirlik ve başarım arasında bir denge
      sağlamak &uuml;zere tasarlanmış genel ama&ccedil;lı bir HTTP sunucusudur. Başka
      sunucularla kıyaslama denemelerinde &ouml;ne ge&ccedil;mek &uuml;zere tasarlanmamış
      olsa da Apache 2.x ger&ccedil;ek yaşamda karşılaşılan pek &ccedil;ok durumda olduk&ccedil;a
      y&uuml;ksek bir başarıma ulaşacak yetenektedir.</p>

    <p>Apache 1.3 ile karşılaştırıldığında 2.x s&uuml;r&uuml;mleri toplam veri hızını
      ve &ouml;l&ccedil;eklenebilirliği arttırmak i&ccedil;in pek &ccedil;ok en iyileme se&ccedil;eneği
      i&ccedil;erir. Bu iyileştirmelerin pek &ccedil;oğu zaten &ouml;ntanımlı olarak etkin
      olmakla birlikte derleme ve kullanım sırasında başarımı &ouml;nemli &ouml;l&ccedil;&uuml;de
      etkileyebilen yapılandırma se&ccedil;enekleri de mevcuttur. Bu belgede, bir
      Apache 2.x kurulumunda sunucu y&ouml;neticisinin sunucunun başarımını
      arttırmak amacıyla yapılandırma sırasında neler yapabileceğinden
      bahsedilmiştir. Bu yapılandırma se&ccedil;eneklerinden bazıları, httpd'nin
      donanımın ve işletim sisteminin olanaklarından daha iyi
      yararlanabilmesini sağlarken bir kısmı da  daha hızlı bir sunum i&ccedil;in
      y&ouml;neticinin işlevsellikten &ouml;d&uuml;n verebilmesini olanaklı kılar.</p>

  </div>
<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif"> <a href="#hardware">Donanım ve İşletim Sistemi ile İlgili Konular</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#runtime">&Ccedil;alışma Anı Yapılandırması ile İlgili Konular</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#compiletime">Derleme Sırasında Yapılandırma ile İlgili Konular</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#trace">Ek: Bir &ccedil;ağrı izlemesinin ayrıntılı &ccedil;&ouml;z&uuml;mlemesi</a></li>
</ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="hardware">Donanım ve İşletim Sistemi ile İlgili Konular <a title="Permanent link" href="#hardware" class="permalink">&para;</a></h2>

    

    <p>HTTP sunucusunun başarımını etkileyen en &ouml;nemli donanım bellektir
      (RAM). Bir HTTP sunucusu asla takaslama yapmamalıdır. &Ccedil;&uuml;nk&uuml; takaslama,
      kullanıcının "yeterince hız" umduğu noktada sunumun gecikmesine sebep
      olur. B&ouml;yle bir durumda kullanıcılar y&uuml;klemeyi durdurup tekrar
      başlatma eğilimindedirler; sonu&ccedil;ta y&uuml;k daha da artar. <code class="directive"><a href="../mod/mpm_common.html#maxrequestworkers">MaxRequestWorkers</a></code> y&ouml;nergesinin değerini
      değiştirerek takaslamaya sebep olabilecek kadar &ccedil;ok &ccedil;ocuk s&uuml;re&ccedil;
      oluşturulmasını engelleyebilirsiniz ve b&ouml;yle bir durumda bunu mutlaka
      yapmalısınız. Bunun i&ccedil;in yapacağınız işlem basittir: <code>top</code>
      benzeri bir ara&ccedil; &uuml;zerinden &ccedil;alışan s&uuml;re&ccedil;lerinizin bir listesini alıp
      Apache s&uuml;re&ccedil;lerinizin ortalama b&uuml;y&uuml;kl&uuml;ğ&uuml;n&uuml; saptayıp, mevcut bellekten
      bir kısmını diğer s&uuml;re&ccedil;ler i&ccedil;in ayırdıktan sonra kalan miktarı bu
      değere b&ouml;lerseniz y&ouml;nergeye atayacağınız değeri bulmuş olursunuz.</p>

    <p>Donanımın diğer unsurları i&ccedil;in kararı siz verin: Daha hızlı işlemci,
      daha hızlı ağ kartı, daha hızlı disk; daha hızlının ne kadar hızlı
      olacağını deneyimlerinize bağlı olarak tamamen sizin ihtiya&ccedil;larınız
      belirler.</p>

    <p>İşletim sistemi se&ccedil;imi b&uuml;y&uuml;k oranda yerel ilgi konusudur. Fakat yine
      de, genelde yararlılığı kanıtlanmış bazı kurallar bu se&ccedil;imde size
      yardımcı olabilir:</p>

    <ul>
      <li>
        <p>Se&ccedil;tiğiniz işletim sisteminin (&ccedil;ekirdeğin) en son kararlı
          s&uuml;r&uuml;m&uuml;n&uuml; &ccedil;alıştırın. Bir &ccedil;ok işletim sistemi, son yıllarda TCP
          yığıtları ve evre k&uuml;t&uuml;phaneleri ile ilgili belirgin iyileştirmeler
          yapmışlar ve yapmaktadırlar.</p>
      </li>

      <li>
        <p>İşletim sisteminiz <code>sendfile</code>(2) sistem &ccedil;ağrısını
          destekliyorsa bunun etkinleştirilebildiği s&uuml;r&uuml;m&uuml;n kurulu olması
          &ouml;nemlidir. (&Ouml;rneğin, Linux i&ccedil;in bu, Linux 2.4 ve sonraki s&uuml;r&uuml;mler
          anlamına gelirken, Solaris i&ccedil;in Solaris 8'den &ouml;nceki s&uuml;r&uuml;mlerin
          yamanması gerektirdiği anlamına gelmektedir.)
          <code>sendfile</code> işlevinin desteklendiği sistemlerde Apache 2
          duruk i&ccedil;eriği daha hızlı teslim etmek ve işlemci kullanımını
          d&uuml;ş&uuml;rmek amacıyla bu işlevselliği kullanacaktır.</p>
      </li>
    </ul>

  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="runtime">&Ccedil;alışma Anı Yapılandırması ile İlgili Konular <a title="Permanent link" href="#runtime" class="permalink">&para;</a></h2>

    

    <table class="related"><tr><th>İlgili Mod&uuml;ller</th><th>İlgili Y&ouml;nergeler</th></tr><tr><td><ul><li><code class="module"><a href="../mod/mod_dir.html">mod_dir</a></code></li><li><code class="module"><a href="../mod/mpm_common.html">mpm_common</a></code></li><li><code class="module"><a href="../mod/mod_status.html">mod_status</a></code></li></ul></td><td><ul><li><code class="directive"><a href="../mod/core.html#allowoverride">AllowOverride</a></code></li><li><code class="directive"><a href="../mod/mod_dir.html#directoryindex">DirectoryIndex</a></code></li><li><code class="directive"><a href="../mod/core.html#hostnamelookups">HostnameLookups</a></code></li><li><code class="directive"><a href="../mod/core.html#enablemmap">EnableMMAP</a></code></li><li><code class="directive"><a href="../mod/core.html#enablesendfile">EnableSendfile</a></code></li><li><code class="directive"><a href="../mod/core.html#keepalivetimeout">KeepAliveTimeout</a></code></li><li><code class="directive"><a href="../mod/prefork.html#maxspareservers">MaxSpareServers</a></code></li><li><code class="directive"><a href="../mod/prefork.html#minspareservers">MinSpareServers</a></code></li><li><code class="directive"><a href="../mod/core.html#options">Options</a></code></li><li><code class="directive"><a href="../mod/mpm_common.html#startservers">StartServers</a></code></li></ul></td></tr></table>

    <h3 id="dns"><code>HostnameLookups</code> ve DNS ile ilgili diğer konular</h3>

      

      <p>Apache 1.3 &ouml;ncesinde, <code class="directive"><a href="../mod/core.html#hostnamelookups">HostnameLookups</a></code> y&ouml;nergesinin &ouml;ntanımlı değeri
        <code>On</code> idi. İstek yerine getirilmeden &ouml;nce bir DNS sorgusu
        yapılmasını gerektirmesi sebebiyle bu ayarlama her istekte bir
        miktar gecikmeye sebep olurdu. Apache 1.3'ten itibaren y&ouml;nergenin
        &ouml;ntanımlı değeri <code>Off</code> yapılmıştır. Eğer g&uuml;nl&uuml;k
        dosyalarınızda konak isimlerinin bulunmasını isterseniz, Apache ile
        birlikte gelen <code class="program"><a href="../programs/logresolve.html">logresolve</a></code> programını
        kullanabileceğiniz gibi g&uuml;nl&uuml;k raporlarını &ccedil;&ouml;z&uuml;mleyen Apache ile
        gelmeyen programlardan herhangi birini de kullanabilirsiniz.</p>

      <p>G&uuml;nl&uuml;k dosyaları &uuml;zerindeki bu işlemi sunucu makinesi dışında
        g&uuml;nl&uuml;k dosyasının bir kopyası &uuml;zerinde yapmanızı &ouml;neririz. Aksi
        takdirde sunucunuzun başarımı &ouml;nemli &ouml;l&ccedil;&uuml;de etkilenebilir.</p>

      <p><code class="directive"><a href="../mod/mod_access_compat.html#allow">Allow</a></code> veya
        <code class="directive"><a href="../mod/mod_access_compat.html#deny">Deny</a></code>
        y&ouml;nergelerinde IP adresi yerine bir konak veya alan ismi
        belirtirseniz, iki DNS sorguluk bir bedel &ouml;dersiniz (biri normal,
        diğeri IP taklidine karşı ters DNS sorgusu). Başarımı en iyilemek
        i&ccedil;in bu y&ouml;nergelerde m&uuml;mk&uuml;n olduğunca isim yerine IP adreslerini
        kullanınız.</p>

      <p><code class="directive"><a href="../mod/core.html#hostnamelookups">HostnameLookups</a></code>
        y&ouml;nergelerinin <code>&lt;Location "/server-status"&gt;</code> gibi
        b&ouml;l&uuml;m y&ouml;nergelerinin i&ccedil;inde de yer alabileceğini unutmayın. Bu gibi
        durumlarda DNS sorguları sadece istek kuralla eşleştiği takdirde
        yapılacaktır. Aşağıdaki &ouml;rnekte <code>.html</code> ve
        <code>.cgi</code> dosyalarına yapılan istekler hari&ccedil; DNS sorguları
        iptal edilmektedir:</p>

      <pre class="prettyprint lang-config">HostnameLookups off
&lt;Files ~ "\.(html|cgi)$"&gt;
  HostnameLookups on
&lt;/Files&gt;</pre>


      <p>Yine de bazı CGI'lerin DNS isimlerine ihtiyacı olursa bu CGI'lerin
        bu ihtiya&ccedil;larına y&ouml;nelik olarak <code>gethostbyname</code> &ccedil;ağrıları
        yapabileceğini g&ouml;zardı etmeyiniz.</p>

    

    <h3 id="symlinks"><code>FollowSymLinks</code> ve
        <code>SymLinksIfOwnerMatch</code></h3>

      

      <p>URL uzayınızda ge&ccedil;erli olmak &uuml;zere bir <code>Options
        FollowSymLinks</code> yoksa veya <code>Options
        SymLinksIfOwnerMatch</code> y&ouml;nergeleri varsa, Apache her sembolik
        bağın &uuml;zerinde bazı sınamalar yapmak i&ccedil;in ek bir sistem &ccedil;ağrısından
        başka istenen her dosya i&ccedil;in de ayrı bir &ccedil;ağrı yapacaktır.</p>

      <pre class="prettyprint lang-config">DocumentRoot "/siteler/htdocs"
&lt;Directory /&gt;
  Options SymLinksIfOwnerMatch
&lt;/Directory&gt;</pre>


      <p>Bu durumda <code>/index.html</code> i&ccedil;in bir istek yapıldığında
        Apache, <code>/siteler</code>, <code>/siteler/htdocs</code> ve<br>
        <code>/siteler/htdocs/index.html</code> &uuml;zerinde
        <code>lstat</code>(2) &ccedil;ağrıları yapacaktır. <code>lstat</code>
        sonu&ccedil;ları &ouml;nbelleğe kaydedilmediğinden bu işlem her istekte
        yinelenecektir. Amacınız ger&ccedil;ekten sembolik bağları g&uuml;venlik
        a&ccedil;ısından sınamaksa bunu ş&ouml;yle yapabilirsiniz:</p>

      <pre class="prettyprint lang-config">DocumentRoot "/siteler/htdocs"
&lt;Directory "/"&gt;
  Options FollowSymLinks
&lt;/Directory&gt;

&lt;Directory "/siteler/htdocs"&gt;
  Options -FollowSymLinks +SymLinksIfOwnerMatch
&lt;/Directory&gt;</pre>


      <p>B&ouml;ylece <code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code> altındaki
        dosyalar i&ccedil;in fazladan bir &ccedil;ağrı yapılmasını engellemiş olursunuz.
        Eğer bazı b&ouml;l&uuml;mlerde <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code>, <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> gibi y&ouml;nergeler &uuml;zerinden belge k&ouml;k
        dizininizin dışında kalan dosya yollarına sahipseniz benzer
        işlemleri onlar i&ccedil;in de yapmalısınız. Sembolik bağ koruması yapmamak
        suretiyle başarımı arttırmak isterseniz, <code>FollowSymLinks</code>
        se&ccedil;eneğini her yerde etkin kılın ve
        <code>SymLinksIfOwnerMatch</code> se&ccedil;eneğini asla
        etkinleştirmeyin.</p>

    

    <h3 id="htaccess"><code>AllowOverride</code></h3>

      

      <p>Genellikle <code>.htaccess</code> dosyaları &uuml;zerinden yapıldığı
        gibi URL uzayınızda ge&ccedil;ersizleştirmelere izin veriyorsanız, Apache
        her dosya bileşeni i&ccedil;in bu <code>.htaccess</code> dosyalarını a&ccedil;maya
        &ccedil;alışacaktır.</p>

      <pre class="prettyprint lang-config">DocumentRoot "/siteler/htdocs"
&lt;Directory "/"&gt;
  AllowOverride all
&lt;/Directory&gt;</pre>


      <p>Bu durumda <code>/index.html</code> sayfasına yapılan bir istek i&ccedil;in
        Apache, <code>/.htaccess</code>, <code>/siteler/.htaccess</code> ve
        <code>/siteler/htdocs/.htaccess</code> dosyalarını a&ccedil;maya
        &ccedil;alışacaktır. &Ccedil;&ouml;z&uuml;m <code>Options FollowSymLinks</code> durumunun
        benzeridir; başarımı arttırmak i&ccedil;in dosya sisteminizin her yerinde
        <code>AllowOverride None</code> olsun.</p>

    

    <h3 id="negotiation">Dil Uzlaşımı</h3>

      

      <p>Başarımı son kırıntısına kadar arttırmak istiyorsanız, m&uuml;mk&uuml;nse
        i&ccedil;erik dili uzlaşımı da yapmayın. Dil uzlaşımından yararlanmak
        isterken b&uuml;y&uuml;k başarım kayıplarına uğrayabilirsiniz. B&ouml;yle bir
        durumda sunucunun başarımını arttırmanın tek bir yolu vardır. </p>

      <pre class="prettyprint lang-config">DirectoryIndex index</pre>


      <p>Yukarıdaki gibi bir dosya ismi kalıbı kullanmak yerine, aşağıdaki
        gibi se&ccedil;enekleri tam bir liste halinde belirtin:</p>

      <pre class="prettyprint lang-config">DirectoryIndex index.cgi index.pl index.shtml index.html</pre>


      <p>Buradaki sıralama &ouml;ncelik sırasını belirler; yani,
        &ouml;ncelikli olmasını istediğiniz se&ccedil;eneği listenin başına
        yazmalısınız.</p>

      <p>İstenen dosya i&ccedil;in <code>MultiViews</code> kullanarak dizini
        taratmak yerine, gerekli bilgiyi tek bir dosyadan okutmak suretiyle
        başarımı arttırabilirsiniz. Bu ama&ccedil;la t&uuml;reşlem
        (<code>type-map</code>) dosyaları kullanmanız yeterli olacaktır.</p>

      <p>Sitenizde i&ccedil;erik dili uzlaşımına gerek varsa, bunu <code>Options
        MultiViews</code> y&ouml;nergesi &uuml;zerinden değil, t&uuml;reşlem dosyaları
        kullanarak yapmayı deneyin. İ&ccedil;erik dili uzlaşımı ve t&uuml;reşlem
        dosyalarının oluşturulması hakkında daha ayrıntılı bilgi edinmek
        i&ccedil;in <a href="../content-negotiation.html">İ&ccedil;erik Uzlaşımı</a>
        belgesine bakınız.</p>

    

    <h3>Bellek Eşlemleri</h3>

      

      <p>Apache'nin SSI sayfalarında olduğu gibi teslim edilecek dosyanın
        i&ccedil;eriğine bakma gereği duyduğu durumlarda, eğer işletim sistemi
        <code>mmap</code>(2) ve benzerlerini destekliyorsa &ccedil;ekirdek normal
        olarak dosyayı belleğe kopyalayacaktır.</p>

      <p>Bazı platformlarda bu belleğe eşleme işlemi başarımı arttırsa da
        başarımın veya httpd kararlılığının zora girdiği durumlar
        olabilmektedir:</p>

      <ul>
        <li>
          <p>Bazı işletim sistemlerinde işlemci sayısı artışına bağlı
            olarak, <code>mmap</code> işlevi <code>read</code>(2) kadar iyi
            &ouml;l&ccedil;eklenmemiştir. &Ouml;rneğin, &ccedil;ok işlemcili Solaris sunucularda
            <code>mmap</code> iptal edildiği takdirde i&ccedil;eriği sunucu
            tarafından işlenen dosyalar &uuml;zerinde bazen daha hızlı işlem
            yapılabilmektedir.</p>
        </li>

        <li>
          <p>Belleğe kopyalanacak dosya NFS &uuml;zerinden bağlanan bir dosya
            sistemindeyse ve dosya başka bir NFS istemcisi makine tarafından
            silinmiş veya dosyanın boyutu değiştirilmişse sunucunuz dosyaya
            tekrar erişmeye &ccedil;alıştığında bir hata alabilecektir.</p>
        </li>
      </ul>

      <p>B&ouml;yle durumların olasılık dahilinde olduğu kurulumlarda i&ccedil;eriği
        sunucu tarafından işlenecek dosyaların belleğe kopyalanmaması i&ccedil;in
        yapılandırmanıza <code>EnableMMAP off</code> satırını ekleyiniz.
        (Dikkat: Bu y&ouml;nerge dizin seviyesinde ge&ccedil;ersizleştirilebilen
        y&ouml;nergelerdendir.)</p>

    

    <h3><code>sendfile</code></h3>

      

      <p>Apache'nin duruk dosyalarda olduğu gibi teslim edilecek dosyanın
        i&ccedil;eriğine bakmadığı durumlarda, eğer işletim sistemi
        <code>sendfile</code>(2) desteğine sahipse &ccedil;ekirdek normal olarak bu
        desteği kullanacaktır.</p>

      <p>Bazı platformlarda <code>sendfile</code> kullanımı, okuma ve yazma
        işlemlerinin ayrı ayrı yapılmamasını sağlasa da
        <code>sendfile</code> kullanımının httpd kararlılığını bozduğu bazı
        durumlar s&ouml;zkonusudur:</p>

      <ul>
        <li>
          <p>Bazı platformlar derleme sisteminin saptayamadığı bozuk bir
            <code>sendfile</code> desteğine sahip olabilir. &Ouml;zellikle
            derleme işleminin başka bir platformda yapılıp
            <code>sendfile</code> desteği bozuk bir makineye kurulum
            yapıldığı durumlarda bu desteğin bozuk olduğu
            saptanamayacaktır.</p>
        </li>
        <li>
          <p>&Ccedil;ekirdek, NFS &uuml;zerinden erişilen ağ dosyalarını kendi &ouml;nbelleği
            &uuml;zerinden gerektiği gibi sunamayabilir.</p>
        </li>
      </ul>

      <p>B&ouml;yle durumların olasılık dahilinde olduğu kurulumlarda i&ccedil;eriğin
        <code>sendfile</code> desteğiyle teslim edilmemesi i&ccedil;in
        yapılandırmanıza <code>EnableSendfile off</code> satırını ekleyiniz.
        (Dikkat: Bu y&ouml;nerge dizin seviyesinde ge&ccedil;ersizleştirilebilen
        y&ouml;nergelerdendir.)</p>

    

    <h3 id="process">S&uuml;re&ccedil; Oluşturma</h3>

      

      <p>Apache 1.3 &ouml;ncesinde <code class="directive"><a href="../mod/prefork.html#minspareservers">MinSpareServers</a></code>, <code class="directive"><a href="../mod/prefork.html#maxspareservers">MaxSpareServers</a></code> ve <code class="directive"><a href="../mod/mpm_common.html#startservers">StartServers</a></code> ayarları, başka sunucularla kıyaslama
        denemelerinde olağan&uuml;st&uuml; k&ouml;t&uuml; sonu&ccedil;lar alınmasına sebep olmaktaydı.
        &Ouml;zellikle uygulanan y&uuml;k&uuml; karşılamaya yetecek sayıda &ccedil;ocuk s&uuml;re&ccedil;
        oluşturulması aşamasında Apache'nin elde ettiği ivme bunlardan
        biriydi. Başlangı&ccedil;ta <code class="directive"><a href="../mod/mpm_common.html#startservers">StartServers</a></code> y&ouml;nergesiyle belli sayıda s&uuml;re&ccedil;
        oluşturulduktan sonra her saniyede bir tane olmak &uuml;zere <code class="directive"><a href="../mod/prefork.html#minspareservers">MinSpareServers</a></code> sayıda &ccedil;ocuk s&uuml;re&ccedil;
        oluşturulmaktaydı. &Ouml;rneğin, aynı anda 100 isteğe yanıt vermek i&ccedil;in
        <code class="directive"><a href="../mod/mpm_common.html#startservers">StartServers</a></code>
        y&ouml;nergesinin &ouml;ntanımlı değeri olarak başta <code>5</code> s&uuml;re&ccedil;
        oluşturulduğundan kalan s&uuml;re&ccedil;ler i&ccedil;in 95 saniye ge&ccedil;mesi gerekirdi.
        Sık sık yeniden başlatılmadıklarından dolayı ger&ccedil;ek hayatta
        sunucuların başına gelen de buydu. Başka sunucularla kıyaslama
        denemelerinde ise işlem sadece on dakika s&uuml;rmekte ve i&ccedil;ler acısı
        sonu&ccedil;lar alınmaktaydı.</p>

      <p>Saniyede bir kuralı, sunucunun yeni &ccedil;ocukları oluşturması sırasında
        sistemin aşırı meşgul duruma d&uuml;şmemesi i&ccedil;in alınmış bir &ouml;nlemdi.
        Makine &ccedil;ocuk s&uuml;re&ccedil; oluşturmakla meşgul edildiği s&uuml;rece isteklere
        yanıt veremeyecektir. B&ouml;ylesi bir durum Apache'nin başarımını
        k&ouml;t&uuml;leştirmekten başka işe yaramayacaktır. Apache 1.3'te saniyede
        bir kuralı biraz esnetildi. Yeni ger&ccedil;eklenimde artık bir s&uuml;re&ccedil;
        oluşturduktan bir saniye sonra iki s&uuml;re&ccedil;, bir saniye sonra d&ouml;rt
        s&uuml;re&ccedil; oluşturulmakta ve işlem, saniyede 32 &ccedil;ocuk s&uuml;re&ccedil; oluşturulur
        duruma gelene kadar b&ouml;yle ivmelenmektedir. &Ccedil;ocuk s&uuml;re&ccedil; oluşturma
        işlemi <code class="directive"><a href="../mod/prefork.html#minspareservers">MinSpareServers</a></code>
        değerine ulaşılınca durmaktadır.</p>

      <p>Bu, <code class="directive"><a href="../mod/prefork.html#minspareservers">MinSpareServers</a></code>,
        <code class="directive"><a href="../mod/prefork.html#maxspareservers">MaxSpareServers</a></code> ve
        <code class="directive"><a href="../mod/mpm_common.html#startservers">StartServers</a></code> ayarlarıyla
        oynamayı neredeyse gereksiz kılacak kadar iyi sonu&ccedil;lar verecek gibi
        g&ouml;r&uuml;nmektedir. Saniyede 4 &ccedil;ocuktan fazlası oluşturulmaya
        başlandığında hata g&uuml;nl&uuml;ğ&uuml;ne bazı iletiler d&uuml;şmeye başlar. Bu
        iletilerin sayısı &ccedil;ok artarsa bu ayarlarla oynama vakti gelmiş
        demektir. Bunun i&ccedil;in <code class="module"><a href="../mod/mod_status.html">mod_status</a></code> &ccedil;ıktısını bir
        kılavuz olarak kullanabilirsiniz.</p>

      <p>S&uuml;re&ccedil; oluşturmayla ilgili olarak s&uuml;re&ccedil; &ouml;l&uuml;m&uuml; <code class="directive"><a href="../mod/mpm_common.html#maxconnectionsperchild">MaxConnectionsPerChild</a></code> değeri ile
        sağlanır. Bu değer &ouml;ntanımlı olarak <code>0</code> olup, &ccedil;ocuk s&uuml;re&ccedil;
        başına istek sayısının sınırsız olduğu anlamına gelir. Eğer
        yapılandırmanızda bu değeri <code>30</code> gibi &ccedil;ok d&uuml;ş&uuml;k bir
        değere ayarlarsanız bunu hemen kaldırmak zorunda kalabilirsiniz.
        Sunucunuzu SunOS veya Solaris'in eski bir s&uuml;r&uuml;m&uuml; &uuml;zerinde
        &ccedil;alıştırıyorsanız bellek ka&ccedil;aklarına sebep olmamak i&ccedil;in bu değeri
        <code>10000</code> ile sınırlayınız.</p>

      <p>Kalıcı bağlantı &ouml;zelliğini kullanıyorsanız, &ccedil;ocuk s&uuml;re&ccedil;ler zaten
        a&ccedil;ık bağlantılardan istek beklemekte olacaklardır. <code class="directive"><a href="../mod/core.html#keepalivetimeout">KeepAliveTimeout</a></code> y&ouml;nergesinin &ouml;ntanımlı
        değeri <code>5</code> saniye olup bu etkiyi en aza indirmeye y&ouml;nelik
        s&uuml;redir. Burada ağ band genişliği ile sunucu kaynaklarının kullanımı
        arasında bir se&ccedil;im yapmak s&ouml;z konusudur. Hi&ccedil;bir şey umurunuzda
        değilse <a href="http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-95-4.html">
        &ccedil;oğu ayrıcalığın yitirilmesi pahasına</a> bu değeri rahat&ccedil;a
        <code>60</code> saniyenin &uuml;zerine &ccedil;ıkarabilirsiniz.</p>

    
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="compiletime">Derleme Sırasında Yapılandırma ile İlgili Konular <a title="Permanent link" href="#compiletime" class="permalink">&para;</a></h2>
    

    <h3>MPM Se&ccedil;imi</h3>
      

      <p>Apache 2.x, <a href="../mpm.html">&Ccedil;ok S&uuml;re&ccedil;lilik Mod&uuml;lleri</a>
        (MPM) adı verilen eklemlenebilir &ccedil;ok g&ouml;revlilik modellerini
        destekler. Apache'yi derlerken bu MPM'lerden birini se&ccedil;meniz
        gerekir. MPM'lerden bazıları platformlara &ouml;zeldir:
        <code class="module"><a href="../mod/mpm_netware.html">mpm_netware</a></code>, <code class="module"><a href="../mod/mpmt_os2.html">mpmt_os2</a></code> ve
        <code class="module"><a href="../mod/mpm_winnt.html">mpm_winnt</a></code>. Unix
        benzeri sistemler i&ccedil;in ise se&ccedil;ebileceğiniz mod&uuml;l sayısı birden
        fazladır. MPM se&ccedil;iminin httpd'nin hızında ve &ouml;l&ccedil;eklenebilirliğinde
        bazı etkileri olabilir:</p>

      <ul>

        <li><code class="module"><a href="../mod/worker.html">worker</a></code> mod&uuml;l&uuml; her biri &ccedil;ok evreli &ccedil;ok sayıda
          &ccedil;ocuk s&uuml;re&ccedil; kullanımını destekler. Her evre aynı anda tek bir
          bağlantıya hizmet sunar. Aynı hizmeti daha az bellek harcayarak
          vermesi nedeniyle y&uuml;ksek trafiğe sahip sunucularda
          <code class="module"><a href="../mod/prefork.html">prefork</a></code> mod&uuml;l&uuml;ne g&ouml;re daha iyi bir se&ccedil;imdir.</li>

        <li><code class="module"><a href="../mod/event.html">event</a></code> mod&uuml;l&uuml; <code class="module"><a href="../mod/worker.html">worker</a></code> mod&uuml;l&uuml; gibi
          &ccedil;ok evreli bir mod&uuml;ld&uuml;r, fakat aunı anda dahafazla isteğe yanıt
          verecek şekilde tasarlanmıştır. Bunu, evreleri destekleyen bazı
          işlemleri yapmamak suretiyle yeni isteklerle &ccedil;alışacak ana evreleri
          serbestleştirerek sağlar.</li>

        <li><code class="module"><a href="../mod/prefork.html">prefork</a></code> mod&uuml;l&uuml; her biri tek bir evreye sahip
          &ccedil;ok sayıda &ccedil;ocuk s&uuml;re&ccedil; kullanımını destekler. Her s&uuml;re&ccedil; aynı anda
          tek bir bağlantıya hizmet sunar. &Ccedil;oğu sistemde daha hızlı olması
          nedeniyle <code class="module"><a href="../mod/worker.html">worker</a></code> mod&uuml;l&uuml;ne g&ouml;re daha iyi bir se&ccedil;im
          olarak g&ouml;r&uuml;n&uuml;rse de bunu daha fazla bellek kullanarak sağlar.
          <code class="module"><a href="../mod/prefork.html">prefork</a></code> mod&uuml;l&uuml;n&uuml;n evresiz tasarımının
          <code class="module"><a href="../mod/worker.html">worker</a></code> mod&uuml;l&uuml;ne g&ouml;re bazı yararlı tarafları
          vardır: &Ccedil;ok evreli sistemlerde g&uuml;venilir olmayan &uuml;&ccedil;&uuml;nc&uuml; parti
          mod&uuml;lleri kullanabilir ve evrelerde hata ayıklamanın yetersiz
          kaldığı platformlarda hatalarını ayıklamak daha kolaydır.</li>

      </ul>

      <p>Bu mod&uuml;ller ve diğerleri hakkında daha ayrıntılı bilgi edinmek i&ccedil;in
        <a href="../mpm.html">&Ccedil;ok S&uuml;re&ccedil;lilik Mod&uuml;lleri</a> belgesine
        bakınız.</p>

    

    <h3 id="modules">Mod&uuml;ller</h3>

        

        <p>Bellek kullanımı başarım konusunda &ouml;nemli olduğundan ger&ccedil;ekte
        kullanmadığınız mod&uuml;lleri elemeye &ccedil;alışmalısınız. Mod&uuml;lleri birer <a href="../dso.html">DSO</a> olarak derlediyseniz <code class="directive"><a href="../mod/mod_so.html#loadmodule">LoadModule</a></code> y&ouml;nergesinin bulunduğu satırı
        a&ccedil;ıklama haline getirmeniz mod&uuml;lden kurtulmanız i&ccedil;in yeterli
        olacaktır. Mod&uuml;lleri bu şekilde kaldırarak onların yokluğunda
        sitenizin hala işlevlerini yerine getirdiğini g&ouml;rme şansına da
        kavuşmuş olursunuz.</p>

        <p>Ancak, eğer mod&uuml;lleri Apache &ccedil;alıştırılabilirinin i&ccedil;ine
        g&ouml;mm&uuml;şseniz istenmeyen mod&uuml;lleri kaldırmak i&ccedil;in Apache'yi yeniden
        derlemeniz gerekir.</p>

        <p>Bu noktada bir soru akla gelebilir: Hangi mod&uuml;ller gerekli,
        hangileri değil? Bu sorunun yanıtı ş&uuml;phesiz siteden siteye değişir.
        Ancak, olmazsa olmaz mo&uuml;ller olarak <code class="module"><a href="../mod/mod_mime.html">mod_mime</a></code>,
        <code class="module"><a href="../mod/mod_dir.html">mod_dir</a></code> ve <code class="module"><a href="../mod/mod_log_config.html">mod_log_config</a></code>
        mod&uuml;llerini sayabiliriz. Bunlardan <code>mod_log_config</code>
        olmadan da bir sitenin &ccedil;alışabileceğinden hareketle bu mod&uuml;l&uuml;n
        varlığı isteğe bağlı olsa da bu mod&uuml;l&uuml; kaldırmanızı &ouml;nermiyoruz.</p>

    

    <h3>Atomik İşlemler</h3>

      

      <p>Worker MPM'nin en son geliştirme s&uuml;r&uuml;mleri ve
      <code class="module"><a href="../mod/mod_cache.html">mod_cache</a></code> gibi bazı mod&uuml;ller APR'nin atomik API'sini
      kullanırlar. Bu API, d&uuml;ş&uuml;k ayarlı evre eşzamanlamasında atomik
      işlemler yapar.</p>

      <p>&Ouml;ntanımlı olarak, APR bu işlemleri hedef işletim sistemi/işlemci
      platformunda kullanılabilecek en verimli mekanizmayı kullanarak
      ger&ccedil;ekleştirir. G&uuml;n&uuml;m&uuml;z işlemcilerinin &ccedil;oğu, &ouml;rneğin, bir atomik
      karşılaştırma ve takas (CAS) işlemini donanımda ger&ccedil;ekleştirmektedir.
      Bazı platformlarda APR'nin atomik işlemler i&ccedil;in &ouml;ntanımlı olarak daha
      yavaş olan mutekslere dayalı ger&ccedil;eklenimi kullanmasının sebebi eski
      işlemcilerde bu t&uuml;r makine kodlarının yokluğudur. Apache'yi bu t&uuml;r
      platformalarda g&uuml;n&uuml;m&uuml;z işlemcileriyde &ccedil;alıştırmayı d&uuml;ş&uuml;n&uuml;yorsanız
      Apache'yi derlemek i&ccedil;in yapılandırırken en hızlı atomik işlemin
      se&ccedil;ilebilmesi i&ccedil;in <code>--enable-nonportable-atomics</code>
      se&ccedil;eneğini kullanın:</p>

      <div class="example"><p><code>
        ./buildconf<br>
        ./configure --with-mpm=worker --enable-nonportable-atomics=yes
      </code></p></div>

      <p><code>--enable-nonportable-atomics</code> se&ccedil;eneği şu platformlar
      i&ccedil;in uygundur:</p>

      <ul>

        <li>SPARC &uuml;zerinde Solaris<br>
            APR &ouml;ntanımlı olarak, SPARC/Solaris &uuml;zerinde mutekslere dayalı
            atomik işlemleri kullanır. Ancak,
            <code>--enable-nonportable-atomics</code> yapılandırmasını
            kullanırsanız, donanım &uuml;zerinde hızlı karşılaştırma ve takas
            i&ccedil;in uygun SPARC v8plus kodunu kullanacak şekilde kod &uuml;retilir.
            Apache'yi bu se&ccedil;enekle yapılandırırsanız atomik işlemler daha
            verimli olacak fakat derlenen Apache &ccedil;alıştırılabiliri sadece
            UltraSPARC kırmığı &uuml;zerinde &ccedil;alışacaktır.
        </li>

        <li>x86 &uuml;zerinde Linux<br>
            APR &ouml;ntanımlı olarak, Linux &uuml;zerinde mutekslere dayalı atomik
            işlemleri kullanır. Ancak,
            <code>--enable-nonportable-atomics</code> yapılandırmasını
            kullanırsanız, donanım &uuml;zerinde hızlı karşılaştırma ve takas
            i&ccedil;in uygun 486 kodunu kullanacak şekilde kod &uuml;retilir. Apache'yi
            bu se&ccedil;enekle yapılandırırsanız atomik işlemler daha verimli
            olacak fakat derlenen Apache &ccedil;alıştırılabiliri (386 &uuml;zerinde
            değil) sadece 486 ve sonrası kırmıklarda &ccedil;alışacaktır.
        </li>

      </ul>

    

    <h3><code>mod_status</code> ve <code>ExtendedStatus On</code>
      </h3>

      

      <p><code class="module"><a href="../mod/mod_status.html">mod_status</a></code> mod&uuml;l&uuml;n&uuml; derlemiş ve Apache'yi
      yapılandırır ve &ccedil;alıştırırken <code>ExtendedStatus On</code> satırını
      da kullanmışsanız Apache her istek &uuml;zerinde
      <code>gettimeofday(2)</code> (veya işletim sistemine bağlı olarak
      <code>time(2)</code>) &ccedil;ağrısından başka (1.3 &ouml;ncesinde) fazladan
      defalarca  <code>time(2)</code> &ccedil;ağrıları yapacaktır. Bu &ccedil;ağrılarla
      durum raporununun zamanlama bilgilerini i&ccedil;ermesi sağlanır. Başarımı
      arttırmak i&ccedil;in <code>ExtendedStatus off</code> yapın (zaten &ouml;ntanımlı
      b&ouml;yledir).</p>

    

    <h3><code>accept</code> dizgilemesi ve &ccedil;ok soketli işlem</h3>

      

    <div class="warning"><h3>Uyarı:</h3>
      <p>Bu b&ouml;l&uuml;m, Apache HTTP sunucusunun 2.x s&uuml;r&uuml;mlerinde yapılan
      değişikliklere g&ouml;re tamamen g&uuml;ncellenmemiştir. Bazı bilgiler hala
      ge&ccedil;erliyse de l&uuml;tfen dikkatli kullanınız.</p>
    </div>

      <p>Burada Unix soket aray&uuml;z&uuml; ger&ccedil;eklenirken ihmal edilen bir durumdan
      bahsedeceğiz. HTTP sunucunuzun &ccedil;ok sayıda adresten &ccedil;ok sayıda portu
      dinlemek i&ccedil;in &ccedil;ok sayıda <code class="directive"><a href="../mod/mpm_common.html#listen">Listen</a></code> y&ouml;nergesi kullanmakta olduğunu varsayalım. Her
      soketi &ccedil;alıştığını g&ouml;rmek i&ccedil;in denerken Apache bağlantı i&ccedil;in
      <code>select(2)</code> kullanacaktır. <code>select(2)</code> &ccedil;ağrısı
      bu soketin &uuml;zerinde <em>sıfır</em> veya <em>en azından bir</em>
      bağlantının beklemekte olduğu anlamına gelir. Apache'nin modeli &ccedil;ok
      sayıda &ccedil;ocuk s&uuml;re&ccedil; i&ccedil;erir ve boşta olanların t&uuml;m&uuml;nde aynı anda yeni
      bağlantılar denenebilir. Ger&ccedil;ekte &ccedil;alışan kod bu olmasa da meramımızı
      anlatmak i&ccedil;in kodun ş&ouml;yle bir şey olduğunu varsayabiliriz:</p>

      <pre class="prettyprint lang-c">        for (;;) {
          for (;;) {
            fd_set accept_fds;

            FD_ZERO (&amp;accept_fds);
            for (i = first_socket; i &lt;= last_socket; ++i) {
              FD_SET (i, &amp;accept_fds);
            }
            rc = select (last_socket+1, &amp;accept_fds, NULL, NULL, NULL);
            if (rc &lt; 1) continue;
            new_connection = -1;
            for (i = first_socket; i &lt;= last_socket; ++i) {
              if (FD_ISSET (i, &amp;accept_fds)) {
                new_connection = accept (i, NULL, NULL);
                if (new_connection != -1) break;
              }
            }
            if (new_connection != -1) break;
          }
          process_the(new_connection);
        }</pre>


      <p>Bu &ouml;zet ger&ccedil;eklenim bir takım a&ccedil;lık sorunlarına sebep olur. Bu
      d&ouml;ng&uuml;n&uuml;n &ccedil;alışması sırasında aynı anda &ccedil;ok sayıda &ccedil;ocuk s&uuml;re&ccedil; yeniden
      &ccedil;ağrılır ve istekler arasında kalan &ccedil;oğu &ccedil;ocuk da <code>select</code>
      ile engellenir. Engellenen t&uuml;m bu &ccedil;ocuklar soketlerden herhangi biri
      &uuml;zerinde tek bir istek g&ouml;r&uuml;nd&uuml;ğ&uuml;nde <code>select</code> tarafından
      uyandırılıp işleme sokulmak &uuml;zere d&ouml;nd&uuml;r&uuml;l&uuml;rler. (Uyandırılan &ccedil;ocuk
      sayısı işletim sistemine ve zamanlama ayarlarına g&ouml;re değişiklik
      g&ouml;sterir,) Bunların hepsi d&ouml;ng&uuml;ye katılıp bağlantı kabul etmeye
      (<code>accept</code>) &ccedil;alışırlar. Fakat i&ccedil;lerinden yalnız biri
      (sadece bir bağlantı isteğinin mevcut olduğu varsayımıyla) bunu
      başarabilir. Kalanının bağlantı kabul etmesi (<code>accept</code>)
      <em>engellenir</em>. Bu durum, bu &ccedil;ocukları istekleri başka başka soketlerden
      değil mecburen tek bir soketten kabul etmeye kilitler ve bu soket
      &uuml;zerinde yeni bir istek belirip uyandırılana kadar bu durumda
      kalırlar. Bu a&ccedil;lık sorunu ilk olarak <a href="http://bugs.apache.org/index/full/467">PR#467</a> sayılı raporla
      belgelenmiştir. Bu sorunun en az iki &ccedil;&ouml;z&uuml;m&uuml; vardır.</p>

      <p>&Ccedil;&ouml;z&uuml;m&uuml;n biri engellenmeyen soket kullanımıdır. Bu durumda
      <code>accept</code> &ccedil;ocukları engellemeyecek ve yapılan bir
      bağlantının ardından diğer &ccedil;ocuklar durumları değişmeksizin bağlantı
      beklemeye devam edeceklerdir. Fakat bu durum işlemci zamanının boşa
      harcanmasına sebep olur.  Se&ccedil;ilmiş (<code>select</code>) boşta on
      &ccedil;ocuğun olduğunu ve bir bağlantı geldiğini varsayalım. Kalan dokuz
      &ccedil;ocuk işine devam edip bağlantı kabul etmeyi (<code>accept</code>)
      deneyecek, başarızsız olacak, d&ouml;necek başa, tekrar se&ccedil;ilecek
      (<code>select</code>) ve b&ouml;yle hi&ccedil;bir iş yapmadan d&ouml;n&uuml;p duracaktır. Bu
      arada hizmet sunmakta olanlar da işlerini bitirdikten sonra bu
      d&ouml;ng&uuml;deki yerlerini alacaklardır. Aynı kutunun i&ccedil;inde boşta bir s&uuml;r&uuml;
      işlemciniz (&ccedil;ok işlemcili sistemler) yoksa bu &ccedil;&ouml;z&uuml;m pek verimli
      olmayacaktır.</p>

      <p>Diğer &ccedil;&ouml;z&uuml;m ise Apache tarafından kullanılan &ccedil;&ouml;z&uuml;m olup, girdiyi
      bir i&ccedil; d&ouml;ng&uuml;de sıraya sokmaktır. D&ouml;ng&uuml; aşağıda &ouml;rneklenmiştir (farklar
      vurgulanmıştır):</p>

      <pre class="prettyprint lang-c">        for (;;) {
          <strong>accept_mutex_on ();</strong>
          for (;;) {
            fd_set accept_fds;

            FD_ZERO (&amp;accept_fds);
            for (i = first_socket; i &lt;= last_socket; ++i) {
              FD_SET (i, &amp;accept_fds);
            }
            rc = select (last_socket+1, &amp;accept_fds, NULL, NULL, NULL);
            if (rc &lt; 1) continue;
            new_connection = -1;
            for (i = first_socket; i &lt;= last_socket; ++i) {
              if (FD_ISSET (i, &amp;accept_fds)) {
                new_connection = accept (i, NULL, NULL);
                if (new_connection != -1) break;
              }
            }
            if (new_connection != -1) break;
          }
          <strong>accept_mutex_off ();</strong>
          process the new_connection;
        }</pre>


      <p><code>accept_mutex_on</code> ve <code>accept_mutex_off</code> <a id="serialize" name="serialize">işlevleri</a> bir karşılıklı red
      semoforu oluştururlar. Mutekse aynı anda sadece bir &ccedil;ocuk sahip
      olabilir. Bu muteksleri ger&ccedil;eklemek i&ccedil;in &ccedil;eşitli se&ccedil;enekler vardır.
      Se&ccedil;im, <code>src/conf.h</code> (1.3 &ouml;ncesi) veya
      <code>src/include/ap_config.h</code> (1.3 ve sonrası) dosyasında
      tanımlanmıştır. Bazı mimariler bir kilitleme se&ccedil;eneğine sahip
      değildir. B&ouml;yle mimarilerde &ccedil;ok sayıda <code class="directive"><a href="../mod/mpm_common.html#listen">Listen</a></code> y&ouml;nergesi kullanmak g&uuml;venilir
      olmayacaktır.</p>

      <p><code class="directive"><a href="../mod/core.html#mutex">Mutex</a></code> y&ouml;nergesi,
      <code>mpm-accept</code> muteks ger&ccedil;eklenimini &ccedil;alışma anında değiştirmek
      i&ccedil;in kullanılabilir. Farklı muteks ger&ccedil;eklenimleri ile ilgili hususlar
      bu y&ouml;nergede belgelenmiştir.</p>

      <p>Başka bir &ccedil;&ouml;z&uuml;m daha vardır ancak d&ouml;ng&uuml; kısmen dizgilenmeyeceğinden
      (yani belli sayıda s&uuml;rece izin verilemeyeceğinden) asla
      ger&ccedil;eklenmemiştir. Bu sadece, aynı anda &ccedil;ok sayıda &ccedil;ocuk s&uuml;recin
      &ccedil;alışabileceği ve dolayısıyla band genişliğinin t&uuml;m y&ouml;nleriyle
      kullanılabileceği &ccedil;ok işlemcili sistemlerde ilgin&ccedil; olabilirdi. Bu
      gelecekte incelenmeye değer bir konu olmakla beraber &ccedil;ok sayıda HTTP
      sunucusunun aynı anda aynı amaca hizmet edecek şekilde &ccedil;alışması
      standart olarak pek m&uuml;mk&uuml;n g&ouml;r&uuml;lmediğinden bu olasılık &ccedil;ok
      d&uuml;ş&uuml;kt&uuml;r.</p>

      <p>En y&uuml;ksek başarımı elde etmek i&ccedil;in ideal olanı sunucuları
      &ccedil;alıştırırken &ccedil;ok sayıda <code class="directive"><a href="../mod/mpm_common.html#listen">Listen</a></code> y&ouml;nergesi kullanmamaktır. Fakat siz yine de
      okumaya devam edin.</p>

    

    <h3><code>accept</code> dizgilemesi - tek soket</h3>

      

      <p>&Ccedil;ok soketli sunucular i&ccedil;in yukarıda a&ccedil;ıklananlar iyi g&uuml;zel de tek
      soketli sunucularda durum ne? Kuramsal olarak, bunların hi&ccedil;biriyle bir
      sorunları olmaması gerekir. &Ccedil;&uuml;nk&uuml; yeni bir bağlantı gelene kadar t&uuml;m
      &ccedil;ocuklar <code>accept(2)</code> ile engellenirler dolayısıyla hi&ccedil;bir
      a&ccedil;lık sorununun ortaya &ccedil;ıkmaması gerekir. Uygulamada ise son
      kullanıcıdan gizli olarak, yukarıda engellenmeyen &ccedil;ocuklar &ccedil;&ouml;z&uuml;m&uuml;nde
      bahsedilenle hemen hemen aynı "boşa d&ouml;n&uuml;p durma" davranışı mevcuttur.
      &Ccedil;oğu TCP yığıtı bu yolu ger&ccedil;eklemiştir. &Ccedil;ekirdek, yeni bir bağlantı
      ortaya &ccedil;ıktığında <code>accept</code> ile engellenen t&uuml;m s&uuml;re&ccedil;leri
      uyandırır. Bu s&uuml;re&ccedil;lerden bağlantıyı alan kullanıcı b&ouml;lgesine ge&ccedil;erken
      &ccedil;ekirdek i&ccedil;inde d&ouml;ng&uuml;de olan diğerleri de yeni bağlantı keşfedilene
      kadar uykularına geri d&ouml;nerler. Bu &ccedil;ekirdek i&ccedil;i d&ouml;ng&uuml;, kullanıcı
      b&ouml;lgesindeki kodlara g&ouml;r&uuml;n&uuml;r değildir ama bu olmadıkları anlamına
      gelmez. Bu durum, &ccedil;ok soketli engellenmeyen &ccedil;ocuklar &ccedil;&ouml;z&uuml;m&uuml;ndeki boşa
      d&ouml;ng&uuml;n&uuml;n sebep olduğu gereksiz işlemci y&uuml;k&uuml; sorununu i&ccedil;inde
      barındırır.</p>

      <p>Bununla birlikte, tek soketli durumda bile bundan daha verimli bir
      davranış sergileyen bir &ccedil;ok mimari bulduk. Bu aslında hemen hemen her
      durumda &ouml;ntanımlı olarak b&ouml;yledir. Linux altında yapılan &uuml;st&uuml;nk&ouml;r&uuml;
      denemelerde (128MB bellekli &ccedil;ift Pentium pro 166 işlemcili makinede
      Linux 2.0.30) tek sokette dizgilemenin dizgilenmemiş duruma g&ouml;re
      saniyede %3 daha az istekle sonu&ccedil;landığı g&ouml;sterilmiştir. Fakat
      dizgilenmemiş tek soket durumunda her istekte 100ms'lik ek bir gecikme
      olduğu g&ouml;r&uuml;lm&uuml;şt&uuml;r. Bu gecikmenin sebebi muhtemelen uzun mesafeli
      hatlar olup sadece yerel ağlarda s&ouml;z konusudur. Tek soketli
      dizgilemeyi ge&ccedil;ersiz kılmak i&ccedil;in
      <code>SINGLE_LISTEN_UNSERIALIZED_ACCEPT</code> tanımlarsanız tek
      soketli sunucularda artık dizgileme yapılmayacaktır.</p>

    

    <h3>Kapatmayı zamana yaymak</h3>

      

      <p><a href="http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-connection-00.txt">draft-ietf-http-connection-00.txt</a> taslağının 8. b&ouml;l&uuml;m&uuml;nde
      bahsedildiği gibi, bir HTTP sunucusunun protokol&uuml; <strong>g&uuml;venilir
      şekilde</strong> ger&ccedil;eklemesi i&ccedil;in her iki y&ouml;ndeki iletişimi
      birbirinden bağımsız olarak (iki y&ouml;nl&uuml; bir TCP bağlantısının her
      yarısını diğerinden bağımsız olarak) kapatması gerekir.</p>

      <p>Bu &ouml;zellik Apache'ye eklendiğinde Unix'in &ccedil;eşitli s&uuml;r&uuml;mlerinde
      uzg&ouml;r&uuml;s&uuml;zl&uuml;kten dolayı bir takım ge&ccedil;ici telaş sorunlarına sebep oldu.
      TCP belirtimi <code>FIN_WAIT_2</code> durumunda bir zaman aşımından
      bahsetmez ama yasaklamaz da. Zaman aşımı olmayan sistemlerde, Apache
      1.2 &ccedil;oğu soketin sonsuza kadar <code>FIN_WAIT_2</code> durumunda
      takılıp kalmasına sebep olur. &Ccedil;oğu durumda, satıcıdan sağlanan en son
      TCP/IP yamalarını uygulanarak bu &ouml;nlenebilir. Satıcının hi&ccedil;bir yeni
      yama dağıtmadığı durumlarda (&ouml;rneğin, SunOS4 -- bir kaynak lisansı ile
      insanlar bunu kendileri yamayabilirse de) bu &ouml;zelliği devre dışı
      bırakmaya karar verdik.</p>

      <p>Bunun &uuml;stesinden gelmenin iki yolu vardır. Bunlardan biri
      <code>SO_LINGER</code> soket se&ccedil;eneğidir. Bu işin kaderi buymuş gibi
      g&ouml;r&uuml;n&uuml;rse de &ccedil;oğu TCP/IP yığıtında bu gerektiği gibi
      ger&ccedil;eklenmemiştir. Bu yığıtlar &uuml;zerinde, bu y&ouml;ntemin, doğru bir
      ger&ccedil;eklenimle bile (&ouml;rneğin, Linux 2.0.31) sonraki &ccedil;&ouml;z&uuml;mden daha
      pahalı olduğu ortaya &ccedil;ıkmıştır.</p>

      <p>&Ccedil;oğunlukla, Apache bunu (<code>http_main.c</code> i&ccedil;indeki)
      <code>lingering_close</code> adında bir işlevle ger&ccedil;ekler. Bu işlev
      kabaca ş&ouml;yle g&ouml;r&uuml;n&uuml;r:</p>

      <pre class="prettyprint lang-c">        void lingering_close (int s)
        {
          char junk_buffer[2048];

          /* shutdown the sending side */
          shutdown (s, 1);

          signal (SIGALRM, lingering_death);
          alarm (30);

          for (;;) {
            select (s for reading, 2 second timeout);
            if (error) break;
            if (s is ready for reading) {
              if (read (s, junk_buffer, sizeof (junk_buffer)) &lt;= 0) {
                break;
              }
              /* just toss away whatever is here */
            }
          }

          close (s);
        }</pre>


      <p>Bağlantı sonunda bu doğal olarak biraz daha masrafa yol a&ccedil;ar, fakat
      g&uuml;venilir bir ger&ccedil;eklenim i&ccedil;in bu gereklidir. HTTP/1.1'in daha yaygın
      kullanılmaya başlanması ve t&uuml;m bağlantıların kalıcı hale gelmesiyle bu
      ger&ccedil;eklenim daha fazla istek &uuml;zerinden kendi masrafını
      karşılayacaktır. Ateşle oynamak ve bu &ouml;zelliği devre dışı bırakmak
      isterseniz <code>NO_LINGCLOSE</code>'u tanımlayabilirsiniz, fakat bu
      asla &ouml;nerilmez. &Ouml;zellikle, HTTP/1.1'den itibaren boruhatlı kalıcı
      bağlantıların <code>lingering_close</code> kullanmaya başlaması mutlak
      bir gerekliliktir (ve <a href="http://www.w3.org/Protocols/HTTP/Performance/Pipeline.html">
      boruhatlı bağlantıların daha hızlı</a> olması nedeniyle bu
      bağlantıları desteklemek isteyebilirsiniz).</p>

    

    <h3>&Ccedil;etele Dosyası</h3>

      

      <p>Apache'nin ana ve alt s&uuml;re&ccedil;leri birbirleriyle &ccedil;etele denen birşey
      &uuml;zerinden haberleşirler. Bunun en m&uuml;kemmel şekilde paylaşımlı bellekte
      ger&ccedil;eklenmesi gerekir. Eriştiğimiz veya portlarını ayrıntılı olarak
      belirttiğimiz işletim sistemleri i&ccedil;in bu, genellikle paylaşımlı bellek
      kullanılarak ger&ccedil;eklenir. Geri kalanlar, &ouml;ntanımlı olarak bunu bir
      disk dosyası kullanarak ger&ccedil;ekler. Bir disk dosyaı yavaş olmanın yanı
      sıra g&uuml;venilir de değildir (ve daha az &ouml;zelliğe sahiptir). Mimarinizin
      <code>src/main/conf.h</code> dosyasını inceleyin ve
      <code>USE_MMAP_SCOREBOARD</code> veya
      <code>USE_SHMGET_SCOREBOARD</code>'a bakın. Bu ikisinden birinin (ve
      yanı sıra sırasıyla <code>HAVE_MMAP</code> veya
      <code>HAVE_SHMGET</code>'in) tanımlanmış olması, sağlanan paylaşımlı
      bellek kodunu etkinleştirir. Eğer sisteminiz diğer t&uuml;rdeki paylaşımlı
      belleğe sahipse, <code>src/main/http_main.c</code> dosyasını a&ccedil;ıp,
      Apache'de bu belleği kullanması gereken kanca işlevleri ekleyin (Bize
      de bir yama yollayın, l&uuml;tfen).</p>

      <div class="note">Tarihsel bilgi: Apache'nin Linux uyarlaması, Apache'nin 1.2
      s&uuml;r&uuml;m&uuml;ne kadar paylaşımlı belleği kullanmaya başlamamıştı. Bu kusur,
      Apache'nin Linux &uuml;zerindeki erken d&ouml;nem s&uuml;r&uuml;mlerinin davranışlarının
      zayıf ve g&uuml;venilmez olmasına yol a&ccedil;mıştı.</div>

    

    <h3>DYNAMIC_MODULE_LIMIT</h3>

      

      <p>Devingen olarak y&uuml;klenen mod&uuml;lleri kullanmamak niyetindeyseniz
      (burayı okuyan ve sunucunuzun başarımını son kırıntısına kadar
      arttırmakla ilgilenen biriyseniz bunu d&uuml;ş&uuml;nmezsiniz), sunucunuzu
      derlerken se&ccedil;enekler arasına <code>-DDYNAMIC_MODULE_LIMIT=0</code>
      se&ccedil;eneğini de ekleyin. Bu suretle, sadece, devingen olarak y&uuml;klenen
      mod&uuml;ller i&ccedil;in ayrılacak belleği kazanmış olacaksınız.</p>

    

  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="trace">Ek: Bir &ccedil;ağrı izlemesinin ayrıntılı &ccedil;&ouml;z&uuml;mlemesi <a title="Permanent link" href="#trace" class="permalink">&para;</a></h2>

    

    <p>Burada, Solaris 8 &uuml;zerinde worker MPM'li Apache 2.0.38'in bir sistem
    &ccedil;ağrısı izlenmektedir. Bu izleme şu komutla elde edilmiştir:</p>

    <div class="example"><p><code>
      truss -l -p <var>httpd_&ccedil;ocuk_pidi</var>.
    </code></p></div>

    <p><code>-l</code> se&ccedil;eneği, truss'a hafif bir s&uuml;recin yaptığı her
    sistem &ccedil;ağrısını (hafif s&uuml;re&ccedil; -- HS -- Solaris'in bir &ccedil;ekirdek seviyesi
    evreleme bi&ccedil;imi) g&uuml;nl&uuml;ğe yazmasını s&ouml;yler.</p>

    <p>Diğer sistemlerin sistem &ccedil;ağrılarını izleyen farklı ara&ccedil;ları vardır
    (<code>strace</code>, <code>ktrace</code>, <code>par</code> gibi).
    Bunlar da benzer &ccedil;ıktılar &uuml;retirler.</p>

    <p>Bu izleme sırasında, bir istemci httpd'den 10 KB'lık duruk bir dosya
    talebinde bulunmuştur. Duruk olmayan veya i&ccedil;erik uzlaşımlı isteklerin
    izleme kayıtları vahşice (bazı durumlarda epey &ccedil;irkince) farklı
    g&ouml;r&uuml;n&uuml;r.</p>

    <div class="example"><p><code>
      /67:    accept(3, 0x00200BEC, 0x00200C0C, 1) (uykuda...)<br>
      /67:    accept(3, 0x00200BEC, 0x00200C0C, 1)            = 9
    </code></p></div>

    <p>Bu izlemede, dinleyen evre HS #67 i&ccedil;inde &ccedil;alışmaktadır.</p>

    <div class="note"><code>accept(2)</code> dizgelemesinin olmayışına dikkat edin.
    &Ouml;zellikle bu platformda worker MPM, &ccedil;ok sayıda portu dinlemedik&ccedil;e,
    &ouml;ntanımlı olarak dizgeleştirilmemiş bir accept &ccedil;ağrısı kullanır.</div>

    <div class="example"><p><code>
      /65:    lwp_park(0x00000000, 0)                         = 0<br>
      /67:    lwp_unpark(65, 1)                               = 0
    </code></p></div>

    <p>Bağlantının kabul edilmesiyle, dinleyici evre isteği yerine getirmek
    &uuml;zere bir worker evresini uyandırır. Bu izlemede, isteği yerine getiren
    worker evresi  HS #65'e aittir.</p>

    <div class="example"><p><code>
      /65:    getsockname(9, 0x00200BA4, 0x00200BC4, 1)       = 0
    </code></p></div>

    <p>Sanal konakların ger&ccedil;eklenimi sırasında, Apache'nin, bağlantıları
    kabul etmek i&ccedil;in kullanılan yerel soket adreslerini bilmesi gerekir.
    &Ccedil;oğu durumda bu &ccedil;ağrıyı bertaraf etmek m&uuml;mk&uuml;nd&uuml;r (hi&ccedil; sanal konağın
    olmadığı veya <code class="directive"><a href="../mod/mpm_common.html#listen">Listen</a></code>
    y&ouml;nergelerinin mutlak adreslerle kullanıldığı durumlarda). Fakat bu en
    iyilemeleri yapmak i&ccedil;in hen&uuml;z bir &ccedil;aba harcanmamıştır.</p>

    <div class="example"><p><code>
      /65:    brk(0x002170E8)                                 = 0<br>
      /65:    brk(0x002190E8)                                 = 0
    </code></p></div>

    <p><code>brk(2)</code> &ccedil;ağrıları devingen bellekten bellek ayırır. httpd
    &ccedil;oğu isteği yerine getirirken &ouml;zel bellek ayırıcılar
    (<code>apr_pool</code> ve <code>apr_bucket_alloc</code>) kullandığından
    bunlar bir sistem &ccedil;ağrısı izlemesinde nadiren g&ouml;r&uuml;n&uuml;r. Bu izlemede,
    httpd hen&uuml;z yeni başlatıldığından, &ouml;zel bellek ayırıcıları oluşturmak
    i&ccedil;in ham bellek bloklarını ayırmak amacıyla <code>malloc(3)</code>
    &ccedil;ağrıları yapması gerekir.</p>

    <div class="example"><p><code>
/65:    fcntl(9, F_GETFL, 0x00000000)                   = 2<br>
/65:    fstat64(9, 0xFAF7B818)                          = 0<br>
/65:    getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B910, 2190656) = 0<br>
/65:    fstat64(9, 0xFAF7B818)                          = 0<br>
/65:    getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B914, 2190656) = 0<br>
/65:    setsockopt(9, 65535, 8192, 0xFAF7B918, 4, 2190656) = 0<br>
/65:    fcntl(9, F_SETFL, 0x00000082)                   = 0
    </code></p></div>

    <p>Ardından, worker evresi istemciye (dosya tanıtıcısı 9) engellenmeyen
    kipte bir bağlantı a&ccedil;ar. <code>setsockopt(2)</code>
    ve <code>getsockopt(2)</code> &ccedil;ağrıları, Solaris libc'sinin soketler
    &uuml;zerindeki <code>fcntl(2)</code> &ccedil;ağrısı yanında birer yan etkiden
    ibarettirler.</p>

    <div class="example"><p><code>
      /65:    read(9, " G E T   / 1 0 k . h t m".., 8000)     = 97
    </code></p></div>

    <p>Worker evresi istemciden isteği okur.</p>

    <div class="example"><p><code>
/65:    stat("/var/httpd/apache/httpd-8999/htdocs/10k.html", 0xFAF7B978) = 0<br>
/65:    open("/var/httpd/apache/httpd-8999/htdocs/10k.html", O_RDONLY) = 10
    </code></p></div>

    <p>Bu httpd  <code>Options FollowSymLinks</code> ve <code>AllowOverride
    None</code> ile yapılandırılmıştır. Bu bakımdan, ne istenen dosya ile
    sonu&ccedil;lanan yol &uuml;zerindeki her dizinde <code>lstat(2)</code> &ccedil;ağrısına ne
    de <code>.htaccess</code> dosyalarına bakılmasına gerek vardır.
    <code>stat(2)</code> &ccedil;ağrısı basit&ccedil;e dosya i&ccedil;in şunları doğrulamak
    amacıyla yapılır: 1) dosya mevcuttur ve 2) bir dizin değil normal bir
    dosyadır.</p>

    <div class="example"><p><code>
      /65:    sendfilev(0, 9, 0x00200F90, 2, 0xFAF7B53C)      = 10269
    </code></p></div>

    <p>Bu &ouml;rnekte, httpd, istenen dosyayı ve HTTP yanıt başlığını tek bir
    <code>sendfilev(2)</code> sistem &ccedil;ağrısı ile  g&ouml;ndermektedir. Dosya
    g&ouml;nderim işleminin anlamı sistemden sisteme değişiklik g&ouml;sterir. Bazı
    sistemlerde, <code>sendfile(2)</code> &ccedil;ağrısından &ouml;nce başlıkları
    g&ouml;ndermek i&ccedil;in  <code>write(2)</code> veya <code>writev(2)</code>
    &ccedil;ağrısı yapmak gerekir.</p>

    <div class="example"><p><code>
      /65:    write(4, " 1 2 7 . 0 . 0 . 1   -  ".., 78)      = 78
    </code></p></div>

    <p>Bu <code>write(2)</code> &ccedil;ağrısı isteği erişim g&uuml;nl&uuml;ğ&uuml;ne kaydeder. Bu
    izlemede eksik olan tek şey, <code>time(2)</code> &ccedil;ağrısıdır. Apache
    1.3'&uuml;n aksine, Apache 2.x zamana bakmak i&ccedil;in
    <code>gettimeofday(3)</code> &ccedil;ağırısını kullanır. Linux ve Solaris gibi
    bazı işletim sistemleri, <code>gettimeofday</code> işlevinin, sıradan
    bir sistem &ccedil;ağrısından daha fazla g&ouml;t&uuml;r&uuml;s&uuml; olmayan en iyilenmiş bir
    ger&ccedil;eklenimine sahiptir.</p>

    <div class="example"><p><code>
      /65:    shutdown(9, 1, 1)                               = 0<br>
      /65:    poll(0xFAF7B980, 1, 2000)                       = 1<br>
      /65:    read(9, 0xFAF7BC20, 512)                        = 0<br>
      /65:    close(9)                                        = 0
    </code></p></div>

    <p>Burada worker evresi bağlantıyı zamana yaymaktadır.</p>

    <div class="example"><p><code>
      /65:    close(10)                                       = 0<br>
      /65:    lwp_park(0x00000000, 0)         (uykuda...)
    </code></p></div>

    <p>Son olarak, worker evresi teslim edilen dosyayı kapattıktan sonra
    dinleyici evre tarafından başka bir bağlantı atanıncaya kadar beklemeye
    alınır.</p>

    <div class="example"><p><code>
      /67:    accept(3, 0x001FEB74, 0x001FEB94, 1) (uykuda...)
    </code></p></div>

    <p>Bu arada, dinleyici evre bağlantıyı bir worker evresine atar atamaz
    başka bir bağlantıyı beklemeye başlar (Mevcut t&uuml;m evreler meşgulse
    dinleyici evreyi baskılayan worker MPM'nin akış denetim şemasına konu
    olur). Bu izlemede g&ouml;r&uuml;nm&uuml;yor olsa da sonraki <code>accept(2)</code>
    &ccedil;ağrısı, yeni bağlantı kabul eden worker evresine paralel olarak
    yapılabilir (aşırı y&uuml;k durumlarında normal olarak, bu yapılır).</p>

  </div></div>
<div class="bottomlang">
<p><span>Mevcut Diller: </span><a href="../en/misc/perf-tuning.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/misc/perf-tuning.html" hreflang="fr" rel="alternate" title="Fran&ccedil;ais">&nbsp;fr&nbsp;</a> |
<a href="../ko/misc/perf-tuning.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
<a href="../tr/misc/perf-tuning.html" title="T&uuml;rk&ccedil;e">&nbsp;tr&nbsp;</a></p>
</div><div id="footer">
<p class="apache">Copyright 2026 The Apache Software Foundation.<br><a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a> altında lisanslıdır.</p>
<p class="menu"><a href="../mod/">Mod&uuml;ller</a> | <a href="../mod/quickreference.html">Y&ouml;nergeler</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">SSS</a> | <a href="../glossary.html">Terimler</a> | <a href="../sitemap.html">Site Haritası</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Hata bildir</a></p></div><script><!--//--><![CDATA[//><!--
if (typeof(prettyPrint) !== 'undefined') {
    prettyPrint();
}
var langToggle = document.querySelector('.lang-toggle');
var topLang = document.querySelector('.toplang');
if (langToggle && topLang) {
    langToggle.addEventListener('click', function() { topLang.classList.toggle('open'); });
}
var qv = document.getElementById('quickview');
if (qv) {
    document.body.appendChild(qv);
    var qvBtn = document.createElement('button');
    qvBtn.className = 'qv-toggle';
    qvBtn.setAttribute('aria-label', 'Toggle page navigation');
    qvBtn.innerHTML = '&#9776;';
    document.body.appendChild(qvBtn);
    qvBtn.addEventListener('click', function() {
        var isOpen = qv.classList.toggle('open');
        if (isOpen) {
            qv.style.top = window.scrollY + 10 + 'px';
        }
    });
    window.addEventListener('scroll', function() { qv.classList.remove('open'); });
}
//--><!]]></script>
</body></html>