github.com/krum110487/go-htaccess@v0.0.0-20240316004156-60641c8e7598/tests/data/apache_2_2_34/manual/misc/perf-tuning.html.tr.utf8 (about)

     1  <?xml version="1.0" encoding="UTF-8"?>
     2  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
     3  <html xmlns="http://www.w3.org/1999/xhtml" lang="tr" xml:lang="tr"><head>
     4  <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
     5  <!--
     6          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
     7                This file is generated from xml source: DO NOT EDIT
     8          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
     9        -->
    10  <title>Apache’de Başarımın Arttırılması - Apache HTTP Sunucusu Sürüm 2.2</title>
    11  <link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
    12  <link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
    13  <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" />
    14  <script src="../style/scripts/prettify.min.js" type="text/javascript">
    15  </script>
    16  
    17  <link href="../images/favicon.ico" rel="shortcut icon" /><link href="http://httpd.apache.org/docs/current/misc/perf-tuning.html" rel="canonical" /></head>
    18  <body id="manual-page"><div id="page-header">
    19  <p class="menu"><a href="../mod/">Modüller</a> | <a href="../mod/directives.html">Yönergeler</a> | <a href="http://wiki.apache.org/httpd/FAQ">SSS</a> | <a href="../glossary.html">Terimler</a> | <a href="../sitemap.html">Site Haritası</a></p>
    20  <p class="apache">Apache HTTP Sunucusu Sürüm 2.2</p>
    21  <img alt="" src="../images/feather.gif" /></div>
    22  <div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
    23  <div id="path">
    24  <a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Sunucusu</a> &gt; <a href="http://httpd.apache.org/docs/">Belgeleme</a> &gt; <a href="../">Sürüm 2.2</a> &gt; <a href="./">Çeşitli Belgeler</a></div><div id="page-content"><div class="retired"><h4>Please note</h4>
    25              <p> This document refers to a legacy release (<strong>2.2</strong>) of Apache httpd. The active release (<strong>2.4</strong>) is documented <a href="http://httpd.apache.org/docs/current">here</a>. If you have not already upgraded, please follow <a href="http://httpd.apache.org/docs/current/upgrading.html">this link</a> for more information.</p>
    26          <p>You may follow <a href="http://httpd.apache.org/docs/current/misc/perf-tuning.html">this link</a> to go to the current version of this document.</p></div><div id="preamble"><h1>Apache’de Başarımın Arttırılması</h1>
    27  <div class="toplang">
    28  <p><span>Mevcut Diller: </span><a href="../en/misc/perf-tuning.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
    29  <a href="../ko/misc/perf-tuning.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
    30  <a href="../tr/misc/perf-tuning.html" title="Türkçe">&nbsp;tr&nbsp;</a></p>
    31  </div>
    32  <div class="outofdate">Bu çeviri güncel olmayabilir. Son değişiklikler için İngilizce sürüm geçerlidir.</div>
    33  
    34  
    35      <p>Apache 2.x, esneklik, taşınabilirlik ve başarım arasında bir denge
    36        sağlamak üzere tasarlanmış genel amaçlı bir HTTP sunucusudur. Başka
    37        sunucularla kıyaslama denemelerinde öne geçmek üzere tasarlanmamış
    38        olsa da Apache 2.x gerçek yaşamda karşılaşılan pek çok durumda oldukça
    39        yüksek bir başarıma ulaşacak yetenektedir.</p>
    40  
    41      <p>Apache 1.3 ile karşılaştırıldığında 2.x sürümleri toplam veri hızını
    42        ve ölçeklenebilirliği arttırmak için pek çok en iyileme seçeneği
    43        içerir. Bu iyileştirmelerin pek çoğu zaten öntanımlı olarak etkin
    44        olmakla birlikte derleme ve kullanım sırasında başarımı önemli ölçüde
    45        etkileyebilen yapılandırma seçenekleri de mevcuttur. Bu belgede, bir
    46        Apache 2.x kurulumunda sunucu yöneticisinin sunucunun başarımını
    47        arttırmak amacıyla yapılandırma sırasında neler yapabileceğinden
    48        bahsedilmiştir. Bu yapılandırma seçeneklerinden bazıları, httpd’nin
    49        donanımın ve işletim sisteminin olanaklarından daha iyi
    50        yararlanabilmesini sağlarken bir kısmı da  daha hızlı bir sunum için
    51        yöneticinin işlevsellikten ödün verebilmesini olanaklı kılar.</p>
    52  
    53    </div>
    54  <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>
    55  <li><img alt="" src="../images/down.gif" /> <a href="#runtime">Çalışma Anı Yapılandırması ile İlgili Konular</a></li>
    56  <li><img alt="" src="../images/down.gif" /> <a href="#compiletime">Derleme Sırasında Yapılandırma ile İlgili Konular</a></li>
    57  <li><img alt="" src="../images/down.gif" /> <a href="#trace">Ek: Bir çağrı izlemesinin ayrıntılı çözümlemesi</a></li>
    58  </ul><ul class="seealso"><li><a href="#comments_section">Yorum</a></li></ul></div>
    59  <div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
    60  <div class="section">
    61  <h2><a name="hardware" id="hardware">Donanım ve İşletim Sistemi ile İlgili Konular</a></h2>
    62  
    63      
    64  
    65      <p>HTTP sunucusunun başarımını etkileyen en önemli donanım bellektir
    66        (RAM). Bir HTTP sunucusu asla takaslama yapmamalıdır. Çünkü takaslama,
    67        kullanıcının "yeterince hız" umduğu noktada sunumun gecikmesine sebep
    68        olur. Böyle bir durumda kullanıcılar yüklemeyi durdurup tekrar
    69        başlatma eğilimindedirler; sonuçta yük daha da artar. <code class="directive"><a href="../mod/mpm_common.html#maxclients">MaxClients</a></code> yönergesinin değerini
    70        değiştirerek takaslamaya sebep olabilecek kadar çok çocuk süreç
    71        oluşturulmasını engelleyebilirsiniz ve böyle bir durumda bunu mutlaka
    72        yapmalısınız. Bunun için yapacağınız işlem basittir: <code>top</code>
    73        benzeri bir araç üzerinden çalışan süreçlerinizin bir listesini alıp
    74        Apache süreçlerinizin ortalama büyüklüğünü saptayıp, mevcut bellekten
    75        bir kısmını diğer süreçler için ayırdıktan sonra kalan miktarı bu
    76        değere bölerseniz yönergeye atayacağınız değeri bulmuş olursunuz.</p>
    77  
    78      <p>Donanımın diğer unsurları için kararı siz verin: Daha hızlı işlemci,
    79        daha hızlı ağ kartı, daha hızlı disk; daha hızlının ne kadar hızlı
    80        olacağını deneyimlerinize bağlı olarak tamamen sizin ihtiyaçlarınız
    81        belirler.</p>
    82  
    83      <p>İşletim sistemi seçimi büyük oranda yerel ilgi konusudur. Fakat yine
    84        de, genelde yararlılığı kanıtlanmış bazı kurallar bu seçimde size
    85        yardımcı olabilir:</p>
    86  
    87      <ul>
    88        <li>
    89          <p>Seçtiğiniz işletim sisteminin (çekirdeğin) en son kararlı
    90            sürümünü çalıştırın. Bir çok işletim sistemi, son yıllarda TCP
    91            yığıtları ve evre kütüphaneleri ile ilgili belirgin iyileştirmeler
    92            yapmışlar ve yapmaktadırlar.</p>
    93        </li>
    94  
    95        <li>
    96          <p>İşletim sisteminiz <code>sendfile</code>(2) sistem çağrısını
    97            destekliyorsa bunun etkinleştirilebildiği sürümün kurulu olması
    98            önemlidir. (Örneğin, Linux için bu, Linux 2.4 ve sonraki sürümler
    99            anlamına gelirken, Solaris için Solaris 8’den önceki sürümlerin
   100            yamanması gerektirdiği anlamına gelmektedir.)
   101            <code>sendfile</code> işlevinin desteklendiği sistemlerde Apache 2
   102            duruk içeriği daha hızlı teslim etmek ve işlemci kullanımını
   103            düşürmek amacıyla bu işlevselliği kullanacaktır.</p>
   104        </li>
   105      </ul>
   106  
   107    </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
   108  <div class="section">
   109  <h2><a name="runtime" id="runtime">Çalışma Anı Yapılandırması ile İlgili Konular</a></h2>
   110  
   111      
   112  
   113      <table class="related"><tr><th>İlgili Modüller</th><th>İlgili Yö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>
   114  
   115      <h3><a name="dns" id="dns"><code>HostnameLookups</code> ve DNS ile ilgili diğer konular</a></h3>
   116  
   117        
   118  
   119        <p>Apache 1.3 öncesinde, <code class="directive"><a href="../mod/core.html#hostnamelookups">HostnameLookups</a></code> yönergesinin öntanımlı değeri
   120          <code>On</code> idi. İstek yerine getirilmeden önce bir DNS sorgusu
   121          yapılmasını gerektirmesi sebebiyle bu ayarlama her istekte bir
   122          miktar gecikmeye sebep olurdu. Apache 1.3’ten itibaren yönergenin
   123          öntanımlı değeri <code>Off</code> yapılmıştır. Eğer günlük
   124          dosyalarınızda konak isimlerinin bulunmasını isterseniz, Apache ile
   125          birlikte gelen <code class="program"><a href="../programs/logresolve.html">logresolve</a></code> programını
   126          kullanabileceğiniz gibi günlük raporlarını çözümleyen Apache ile
   127          gelmeyen programlardan herhangi birini de kullanabilirsiniz.</p>
   128  
   129        <p>Günlük dosyaları üzerindeki bu işlemi sunucu makinesi dışında
   130          günlük dosyasının bir kopyası üzerinde yapmanızı öneririz. Aksi
   131          takdirde sunucunuzun başarımı önemli ölçüde etkilenebilir.</p>
   132  
   133        <p><code class="directive"><a href="../mod/mod_authz_host.html#allow">Allow</a></code> veya
   134          <code class="directive"><a href="../mod/mod_authz_host.html#deny">Deny</a></code>
   135          yönergelerinde IP adresi yerine bir konak veya alan ismi
   136          belirtirseniz, iki DNS sorguluk bir bedel ödersiniz (biri normal,
   137          diğeri IP taklidine karşı ters DNS sorgusu). Başarımı en iyilemek
   138          için bu yönergelerde mümkün olduğunca isim yerine IP adreslerini
   139          kullanınız.</p>
   140  
   141        <p><code class="directive"><a href="../mod/core.html#hostnamelookups">HostnameLookups</a></code>
   142          yönergelerinin <code>&lt;Location /server-status&gt;</code> gibi
   143          bölüm yönergelerinin içinde de yer alabileceğini unutmayın. Bu gibi
   144          durumlarda DNS sorguları sadece istek kuralla eşleştiği takdirde
   145          yapılacaktır. Aşağıdaki örnekte <code>.html</code> ve
   146          <code>.cgi</code> dosyalarına yapılan istekler hariç DNS sorguları
   147          iptal edilmektedir:</p>
   148  
   149        <div class="example"><p><code>
   150          HostnameLookups off<br />
   151          &lt;Files ~ "\.(html|cgi)$"&gt;<br />
   152          <span class="indent">
   153            HostnameLookups on<br />
   154          </span>
   155          &lt;/Files&gt;
   156        </code></p></div>
   157  
   158        <p>Yine de bazı CGI’lerin DNS isimlerine ihtiyacı olursa bu CGI’lerin
   159          bu ihtiyaçlarına yönelik olarak <code>gethostbyname</code> çağrıları
   160          yapabileceğini gözardı etmeyiniz.</p>
   161  
   162      
   163  
   164      <h3><a name="symlinks" id="symlinks"><code>FollowSymLinks</code> ve
   165          <code>SymLinksIfOwnerMatch</code></a></h3>
   166  
   167        
   168  
   169        <p>URL uzayınızda geçerli olmak üzere bir <code>Options
   170          FollowSymLinks</code> yoksa veya <code>Options
   171          SymLinksIfOwnerMatch</code> yönergeleri varsa, Apache her sembolik
   172          bağın üzerinde bazı sınamalar yapmak için ek bir sistem çağrısından
   173          başka istenen her dosya için de ayrı bir çağrı yapacaktır.</p>
   174  
   175        <div class="example"><h3>Örnek:</h3><p><code>
   176          DocumentRoot /siteler/htdocs<br />
   177          &lt;Directory /&gt;<br />
   178          <span class="indent">
   179            Options SymLinksIfOwnerMatch<br />
   180          </span>
   181          &lt;/Directory&gt;
   182        </code></p></div>
   183  
   184        <p>Bu durumda <code>/index.html</code> için bir istek yapıldığında
   185          Apache, <code>/siteler</code>, <code>/siteler/htdocs</code> ve<br />
   186          <code>/siteler/htdocs/index.html</code> üzerinde
   187          <code>lstat</code>(2) çağrıları yapacaktır. <code>lstat</code>
   188          sonuçları önbelleğe kaydedilmediğinden bu işlem her istekte
   189          yinelenecektir. Amacınız gerçekten sembolik bağları güvenlik
   190          açısından sınamaksa bunu şöyle yapabilirsiniz:</p>
   191  
   192        <div class="example"><p><code>
   193          DocumentRoot /siteler/htdocs<br />
   194          &lt;Directory /&gt;<br />
   195          <span class="indent">
   196            Options FollowSymLinks<br />
   197          </span>
   198          &lt;/Directory&gt;<br />
   199          <br />
   200          &lt;Directory /sitem/htdocs&gt;<br />
   201          <span class="indent">
   202            Options -FollowSymLinks +SymLinksIfOwnerMatch<br />
   203          </span>
   204          &lt;/Directory&gt;
   205        </code></p></div>
   206  
   207        <p>Böylece <code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code> altındaki
   208          dosyalar için fazladan bir çağrı yapılmasını engellemiş olursunuz.
   209          Eğer bazı bölü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önergeler üzerinden belge kök
   210          dizininizin dışında kalan dosya yollarına sahipseniz benzer
   211          işlemleri onlar için de yapmalısınız. Sembolik bağ koruması yapmamak
   212          suretiyle başarımı arttırmak isterseniz, <code>FollowSymLinks</code>
   213          seçeneğini her yerde etkin kılın ve
   214          <code>SymLinksIfOwnerMatch</code> seçeneğini asla
   215          etkinleştirmeyin.</p>
   216  
   217      
   218  
   219      <h3><a name="htaccess" id="htaccess"><code>AllowOverride</code></a></h3>
   220  
   221        
   222  
   223        <p>Genellikle <code>.htaccess</code> dosyaları üzerinden yapıldığı
   224          gibi URL uzayınızda geçersizleştirmelere izin veriyorsanız, Apache
   225          her dosya bileşeni için bu <code>.htaccess</code> dosyalarını açmaya
   226          çalışacaktır.</p>
   227  
   228        <div class="example"><h3>Örnek:</h3><p><code>
   229          DocumentRoot /siteler/htdocs<br />
   230          &lt;Directory /&gt;<br />
   231          <span class="indent">
   232            AllowOverride all<br />
   233          </span>
   234          &lt;/Directory&gt;
   235        </code></p></div>
   236  
   237        <p>Bu durumda <code>/index.html</code> sayfasına yapılan bir istek için
   238          Apache, <code>/.htaccess</code>, <code>/siteler/.htaccess</code> ve
   239          <code>/siteler/htdocs/.htaccess</code> dosyalarını açmaya
   240          çalışacaktır. Çözüm <code>Options FollowSymLinks</code> durumunun
   241          benzeridir; başarımı arttırmak için dosya sisteminizin her yerinde
   242          <code>AllowOverride None</code> olsun.</p>
   243  
   244      
   245  
   246      <h3><a name="negotiation" id="negotiation">Dil Uzlaşımı</a></h3>
   247  
   248        
   249  
   250        <p>Başarımı son kırıntısına kadar arttırmak istiyorsanız, mümkünse
   251          içerik dili uzlaşımı da yapmayın. Dil uzlaşımından yararlanmak
   252          isterken büyük başarım kayıplarına uğrayabilirsiniz. Böyle bir
   253          durumda sunucunun başarımını arttırmanın tek bir yolu vardır. </p>
   254  
   255        <div class="example"><p><code>
   256          DirectoryIndex index
   257        </code></p></div>
   258  
   259        <p>Yukarıdaki gibi bir dosya ismi kalıbı kullanmak yerine, aşağıdaki
   260          gibi seçenekleri tam bir liste halinde belirtin:</p>
   261  
   262        <div class="example"><p><code>
   263          DirectoryIndex index.cgi index.pl index.shtml index.html
   264        </code></p></div>
   265  
   266        <p>Buradaki sıralama öncelik sırasını belirler; yani,
   267          öncelikli olmasını istediğiniz seçeneği listenin başına
   268          yazmalısınız.</p>
   269  
   270        <p>İstenen dosya için <code>MultiViews</code> kullanarak dizini
   271          taratmak yerine, gerekli bilgiyi tek bir dosyadan okutmak suretiyle
   272          başarımı arttırabilirsiniz. Bu amaçla türeşlem
   273          (<code>type-map</code>) dosyaları kullanmanız yeterli olacaktır.</p>
   274  
   275        <p>Sitenizde içerik dili uzlaşımına gerek varsa, bunu <code>Options
   276          MultiViews</code> yönergesi üzerinden değil, türeşlem dosyaları
   277          kullanarak yapmayı deneyin. İçerik dili uzlaşımı ve türeşlem
   278          dosyalarının oluşturulması hakkında daha ayrıntılı bilgi edinmek
   279          için <a href="../content-negotiation.html">İçerik Uzlaşımı</a>
   280          belgesine bakınız.</p>
   281  
   282      
   283  
   284      <h3>Bellek Eşlemleri</h3>
   285  
   286        
   287  
   288        <p>Apache’nin SSI sayfalarında olduğu gibi teslim edilecek dosyanın
   289          içeriğine bakma gereği duyduğu durumlarda, eğer işletim sistemi
   290          <code>mmap</code>(2) ve benzerlerini destekliyorsa çekirdek normal
   291          olarak dosyayı belleğe kopyalayacaktır.</p>
   292  
   293        <p>Bazı platformlarda bu belleğe eşleme işlemi başarımı arttırsa da
   294          başarımın veya httpd kararlılığının zora girdiği durumlar
   295          olabilmektedir:</p>
   296  
   297        <ul>
   298          <li>
   299            <p>Bazı işletim sistemlerinde işlemci sayısı artışına bağlı
   300              olarak, <code>mmap</code> işlevi <code>read</code>(2) kadar iyi
   301              ölçeklenmemiştir. Örneğin, çok işlemcili Solaris sunucularda
   302              <code>mmap</code> iptal edildiği takdirde içeriği sunucu
   303              tarafından işlenen dosyalar üzerinde bazen daha hızlı işlem
   304              yapılabilmektedir.</p>
   305          </li>
   306  
   307          <li>
   308            <p>Belleğe kopyalanacak dosya NFS üzerinden bağlanan bir dosya
   309              sistemindeyse ve dosya başka bir NFS istemcisi makine tarafından
   310              silinmiş veya dosyanın boyutu değiştirilmişse sunucunuz dosyaya
   311              tekrar erişmeye çalıştığında bir hata alabilecektir.</p>
   312          </li>
   313        </ul>
   314  
   315        <p>Böyle durumların olasılık dahilinde olduğu kurulumlarda içeriği
   316          sunucu tarafından işlenecek dosyaların belleğe kopyalanmaması için
   317          yapılandırmanıza <code>EnableMMAP off</code> satırını ekleyiniz.
   318          (Dikkat: Bu yönerge dizin seviyesinde geçersizleştirilebilen
   319          yönergelerdendir.)</p>
   320  
   321      
   322  
   323      <h3><code>sendfile</code></h3>
   324  
   325        
   326  
   327        <p>Apache’nin duruk dosyalarda olduğu gibi teslim edilecek dosyanın
   328          içeriğine bakmadığı durumlarda, eğer işletim sistemi
   329          <code>sendfile</code>(2) desteğine sahipse çekirdek normal olarak bu
   330          desteği kullanacaktır.</p>
   331  
   332        <p>Bazı platformlarda <code>sendfile</code> kullanımı, okuma ve yazma
   333          işlemlerinin ayrı ayrı yapılmamasını sağlasa da
   334          <code>sendfile</code> kullanımının httpd kararlılığını bozduğu bazı
   335          durumlar sözkonusudur:</p>
   336  
   337        <ul>
   338          <li>
   339            <p>Bazı platformlar derleme sisteminin saptayamadığı bozuk bir
   340              <code>sendfile</code> desteğine sahip olabilir. Özellikle
   341              derleme işleminin başka bir platformda yapılıp
   342              <code>sendfile</code> desteği bozuk bir makineye kurulum
   343              yapıldığı durumlarda bu desteğin bozuk olduğu
   344              saptanamayacaktır.</p>
   345          </li>
   346          <li>
   347            <p>Çekirdek, NFS üzerinden erişilen ağ dosyalarını kendi önbelleği
   348              üzerinden gerektiği gibi sunamayabilir.</p>
   349          </li>
   350        </ul>
   351  
   352        <p>Böyle durumların olasılık dahilinde olduğu kurulumlarda içeriğin
   353          <code>sendfile</code> desteğiyle teslim edilmemesi için
   354          yapılandırmanıza <code>EnableSendfile off</code> satırını ekleyiniz.
   355          (Dikkat: Bu yönerge dizin seviyesinde geçersizleştirilebilen
   356          yönergelerdendir.)</p>
   357  
   358      
   359  
   360      <h3><a name="process" id="process">Süreç Oluşturma</a></h3>
   361  
   362        
   363  
   364        <p>Apache 1.3 ö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
   365          denemelerinde olağanüstü kötü sonuçlar alınmasına sebep olmaktaydı.
   366          Özellikle uygulanan yükü karşılamaya yetecek sayıda çocuk süreç
   367          oluşturulması aşamasında Apache’nin elde ettiği ivme bunlardan
   368          biriydi. Başlangıçta <code class="directive"><a href="../mod/mpm_common.html#startservers">StartServers</a></code> yönergesiyle belli sayıda süreç
   369          oluşturulduktan sonra her saniyede bir tane olmak üzere <code class="directive"><a href="../mod/prefork.html#minspareservers">MinSpareServers</a></code> sayıda çocuk süreç
   370          oluşturulmaktaydı. Örneğin, aynı anda 100 isteğe yanıt vermek için
   371          <code class="directive"><a href="../mod/mpm_common.html#startservers">StartServers</a></code>
   372          yönergesinin öntanımlı değeri olarak başta <code>5</code> süreç
   373          oluşturulduğundan kalan süreçler için 95 saniye geçmesi gerekirdi.
   374          Sık sık yeniden başlatılmadıklarından dolayı gerçek hayatta
   375          sunucuların başına gelen de buydu. Başka sunucularla kıyaslama
   376          denemelerinde ise işlem sadece on dakika sürmekte ve içler acısı
   377          sonuçlar alınmaktaydı.</p>
   378  
   379        <p>Saniyede bir kuralı, sunucunun yeni çocukları oluşturması sırasında
   380          sistemin aşırı meşgul duruma düşmemesi için alınmış bir önlemdi.
   381          Makine çocuk süreç oluşturmakla meşgul edildiği sürece isteklere
   382          yanıt veremeyecektir. Böylesi bir durum Apache’nin başarımını
   383          kötüleştirmekten başka işe yaramayacaktır. Apache 1.3’te saniyede
   384          bir kuralı biraz esnetildi. Yeni gerçeklenimde artık bir süreç
   385          oluşturduktan bir saniye sonra iki süreç, bir saniye sonra dört
   386          süreç oluşturulmakta ve işlem, saniyede 32 çocuk süreç oluşturulur
   387          duruma gelene kadar böyle ivmelenmektedir. Çocuk süreç oluşturma
   388          işlemi <code class="directive"><a href="../mod/prefork.html#minspareservers">MinSpareServers</a></code>
   389          değerine ulaşılınca durmaktadır.</p>
   390  
   391        <p>Bu, <code class="directive"><a href="../mod/prefork.html#minspareservers">MinSpareServers</a></code>,
   392          <code class="directive"><a href="../mod/prefork.html#maxspareservers">MaxSpareServers</a></code> ve
   393          <code class="directive"><a href="../mod/mpm_common.html#startservers">StartServers</a></code> ayarlarıyla
   394          oynamayı neredeyse gereksiz kılacak kadar iyi sonuçlar verecek gibi
   395          görünmektedir. Saniyede 4 çocuktan fazlası oluşturulmaya
   396          başlandığında hata günlüğüne bazı iletiler düşmeye başlar. Bu
   397          iletilerin sayısı çok artarsa bu ayarlarla oynama vakti gelmiş
   398          demektir. Bunun için <code class="module"><a href="../mod/mod_status.html">mod_status</a></code> çıktısını bir
   399          kılavuz olarak kullanabilirsiniz.</p>
   400  
   401        <p>Süreç oluşturmayla ilgili olarak süreç ölümü <code class="directive"><a href="../mod/mpm_common.html#maxrequestsperchild">MaxRequestsPerChild</a></code> değeri ile
   402          sağlanır. Bu değer öntanımlı olarak <code>0</code> olup, çocuk süreç
   403          başına istek sayısının sınırsız olduğu anlamına gelir. Eğer
   404          yapılandırmanızda bu değeri <code>30</code> gibi çok düşük bir
   405          değere ayarlarsanız bunu hemen kaldırmak zorunda kalabilirsiniz.
   406          Sunucunuzu SunOS veya Solaris’in eski bir sürümü üzerinde
   407          çalıştırıyorsanız bellek kaçaklarına sebep olmamak için bu değeri
   408          <code>10000</code> ile sınırlayınız.</p>
   409  
   410        <p>Kalıcı bağlantı özelliğini kullanıyorsanız, çocuk süreçler zaten
   411          açık bağlantılardan istek beklemekte olacaklardır. <code class="directive"><a href="../mod/core.html#keepalivetimeout">KeepAliveTimeout</a></code> yönergesinin öntanımlı
   412          değeri <code>5</code> saniye olup bu etkiyi en aza indirmeye yönelik
   413          süredir. Burada ağ band genişliği ile sunucu kaynaklarının kullanımı
   414          arasında bir seçim yapmak söz konusudur. Hiçbir şey umurunuzda
   415          değilse <a href="http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-95-4.html">
   416          çoğu ayrıcalığın yitirilmesi pahasına</a> bu değeri rahatça
   417          <code>60</code> saniyenin üzerine çıkarabilirsiniz.</p>
   418  
   419      
   420    </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
   421  <div class="section">
   422  <h2><a name="compiletime" id="compiletime">Derleme Sırasında Yapılandırma ile İlgili Konular</a></h2>
   423      
   424  
   425      <h3>MPM Seçimi</h3>
   426        
   427  
   428        <p>Apache 2.x, <a href="../mpm.html">Çok Süreçlilik Modülleri</a>
   429          (MPM) adı verilen eklemlenebilir çok görevlilik modellerini
   430          destekler. Apache’yi derlerken bu MPM’lerden birini seçmeniz
   431          gerekir. MPM’lerden bazıları platformlara özeldir:
   432          <code class="module"><a href="../mod/beos.html">beos</a></code>, <code class="module"><a href="../mod/mpm_netware.html">mpm_netware</a></code>,
   433          <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
   434          benzeri sistemler için ise seçebileceğiniz modül sayısı birden
   435          fazladır. MPM seçiminin httpd’nin hızında ve ölçeklenebilirliğinde
   436          bazı etkileri olabilir:</p>
   437  
   438        <ul>
   439  
   440          <li><code class="module"><a href="../mod/worker.html">worker</a></code> modülü her biri çok evreli çok sayıda
   441            çocuk süreç kullanımını destekler. Her evre aynı anda tek bir
   442            bağlantıya hizmet sunar. Aynı hizmeti daha az bellek harcayarak
   443            vermesi nedeniyle yüksek trafiğe sahip sunucularda
   444            <code class="module"><a href="../mod/prefork.html">prefork</a></code> modülüne göre daha iyi bir seçimdir.</li>
   445  
   446          <li><code class="module"><a href="../mod/prefork.html">prefork</a></code> modülü her biri tek bir evreye sahip
   447            çok sayıda çocuk süreç kullanımını destekler. Her süreç aynı anda
   448            tek bir bağlantıya hizmet sunar. Çoğu sistemde daha hızlı olması
   449            nedeniyle <code class="module"><a href="../mod/worker.html">worker</a></code> modülüne göre daha iyi bir seçim
   450            olarak görünürse de bunu daha fazla bellek kullanarak sağlar.
   451            <code class="module"><a href="../mod/prefork.html">prefork</a></code> modülünün evresiz tasarımının
   452            <code class="module"><a href="../mod/worker.html">worker</a></code> modülüne göre bazı yararlı tarafları
   453            vardır: Çok evreli sistemlerde güvenilir olmayan üçüncü parti
   454            modülleri kullanabilir ve evrelerde hata ayıklamanın yetersiz
   455            kaldığı platformlarda hatalarını ayıklamak daha kolaydır.</li>
   456  
   457        </ul>
   458  
   459        <p>Bu modüller ve diğerleri hakkında daha ayrıntılı bilgi edinmek için
   460          <a href="../mpm.html">Çok Süreçlilik Modülleri</a> belgesine
   461          bakınız.</p>
   462  
   463      
   464  
   465      <h3><a name="modules" id="modules">Modüller</a></h3>
   466  
   467          
   468  
   469          <p>Bellek kullanımı başarım konusunda önemli olduğundan gerçekte
   470          kullanmadığınız modülleri elemeye çalışmalısınız. Modülleri birer <a href="../dso.html">DSO</a> olarak derlediyseniz <code class="directive"><a href="../mod/mod_so.html#loadmodule">LoadModule</a></code> yönergesinin bulunduğu satırı
   471          açıklama haline getirmeniz modülden kurtulmanız için yeterli
   472          olacaktır. Modülleri bu şekilde kaldırarak onların yokluğunda
   473          sitenizin hala işlevlerini yerine getirdiğini görme şansına da
   474          kavuşmuş olursunuz.</p>
   475  
   476          <p>Ancak, eğer modülleri Apache çalıştırılabilirinin içine
   477          gömmüşseniz istenmeyen modülleri kaldırmak için Apache'yi yeniden
   478          derlemeniz gerekir.</p>
   479  
   480          <p>Bu noktada bir soru akla gelebilir: Hangi modüller gerekli,
   481          hangileri değil? Bu sorunun yanıtı şüphesiz siteden siteye değişir.
   482          Ancak, olmazsa olmaz moüller olarak <code class="module"><a href="../mod/mod_mime.html">mod_mime</a></code>,
   483          <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>
   484          modüllerini sayabiliriz. Bunlardan <code>mod_log_config</code>
   485          olmadan da bir sitenin çalışabileceğinden hareketle bu modülün
   486          varlığı isteğe bağlı olsa da bu modülü kaldırmanızı önermiyoruz.</p>
   487  
   488      
   489  
   490      <h3>Atomik İşlemler</h3>
   491  
   492        
   493  
   494        <p>Worker MPM'nin en son geliştirme sürümleri ve
   495        <code class="module"><a href="../mod/mod_cache.html">mod_cache</a></code> gibi bazı modüller APR'nin atomik API'sini
   496        kullanırlar. Bu API, düşük ayarlı evre eşzamanlamasında atomik
   497        işlemler yapar.</p>
   498  
   499        <p>Öntanımlı olarak, APR bu işlemleri hedef işletim sistemi/işlemci
   500        platformunda kullanılabilecek en verimli mekanizmayı kullanarak
   501        gerçekleştirir. Günümüz işlemcilerinin çoğu, örneğin, bir atomik
   502        karşılaştırma ve takas (CAS) işlemini donanımda gerçekleştirmektedir.
   503        Bazı platformlarda APR'nin atomik işlemler için öntanımlı olarak daha
   504        yavaş olan mutekslere dayalı gerçeklenimi kullanmasının sebebi eski
   505        işlemcilerde bu tür makine kodlarının yokluğudur. Apache'yi bu tür
   506        platformalarda günümüz işlemcileriyde çalıştırmayı düşünüyorsanız
   507        Apache'yi derlemek için yapılandırırken en hızlı atomik işlemin
   508        seçilebilmesi için <code>--enable-nonportable-atomics</code>
   509        seçeneğini kullanın:</p>
   510  
   511        <div class="example"><p><code>
   512          ./buildconf<br />
   513          ./configure --with-mpm=worker --enable-nonportable-atomics=yes
   514        </code></p></div>
   515  
   516        <p><code>--enable-nonportable-atomics</code> seçeneği şu platformlar
   517        için uygundur:</p>
   518  
   519        <ul>
   520  
   521          <li>SPARC üzerinde Solaris<br />
   522              APR öntanımlı olarak, SPARC/Solaris üzerinde mutekslere dayalı
   523              atomik işlemleri kullanır. Ancak,
   524              <code>--enable-nonportable-atomics</code> yapılandırmasını
   525              kullanırsanız, donanım üzerinde hızlı karşılaştırma ve takas
   526              için uygun SPARC v8plus kodunu kullanacak şekilde kod üretilir.
   527              Apache'yi bu seçenekle yapılandırırsanız atomik işlemler daha
   528              verimli olacak fakat derlenen Apache çalıştırılabiliri sadece
   529              UltraSPARC kırmığı üzerinde çalışacaktır.
   530          </li>
   531  
   532          <li>x86 üzerinde Linux<br />
   533              APR öntanımlı olarak, Linux üzerinde mutekslere dayalı atomik
   534              işlemleri kullanır. Ancak,
   535              <code>--enable-nonportable-atomics</code> yapılandırmasını
   536              kullanırsanız, donanım üzerinde hızlı karşılaştırma ve takas
   537              için uygun 486 kodunu kullanacak şekilde kod üretilir. Apache'yi
   538              bu seçenekle yapılandırırsanız atomik işlemler daha verimli
   539              olacak fakat derlenen Apache çalıştırılabiliri (386 üzerinde
   540              değil) sadece 486 ve sonrası kırmıklarda çalışacaktır.
   541          </li>
   542  
   543        </ul>
   544  
   545      
   546  
   547      <h3><code>mod_status</code> ve <code>ExtendedStatus On</code>
   548        </h3>
   549  
   550        
   551  
   552        <p><code class="module"><a href="../mod/mod_status.html">mod_status</a></code> modülünü derlemiş ve Apache'yi
   553        yapılandırır ve çalıştırırken <code>ExtendedStatus On</code> satırını
   554        da kullanmışsanız Apache her istek üzerinde
   555        <code>gettimeofday(2)</code> (veya işletim sistemine bağlı olarak
   556        <code>time(2)</code>) çağrısından başka (1.3 öncesinde) fazladan
   557        defalarca  <code>time(2)</code> çağrıları yapacaktır. Bu çağrılarla
   558        durum raporununun zamanlama bilgilerini içermesi sağlanır. Başarımı
   559        arttırmak için <code>ExtendedStatus off</code> yapın (zaten öntanımlı
   560        böyledir).</p>
   561  
   562      
   563  
   564      <h3><code>accept</code> dizgilemesi ve çok soketli işlem</h3>
   565  
   566        
   567  
   568      <div class="warning"><h3>Uyarı:</h3>
   569        <p>Bu bölüm, Apache HTTP sunucusunun 2.x sürümlerinde yapılan
   570        değişikliklere göre tamamen güncellenmemiştir. Bazı bilgiler hala
   571        geçerliyse de lütfen dikkatli kullanınız.</p>
   572      </div>
   573  
   574        <p>Burada Unix soket arayüzü gerçeklenirken ihmal edilen bir durumdan
   575        bahsedeceğiz. HTTP sunucunuzun çok sayıda adresten çok sayıda portu
   576        dinlemek için çok sayıda <code class="directive"><a href="../mod/mpm_common.html#listen">Listen</a></code> yönergesi kullanmakta olduğunu varsayalım. Her
   577        soketi çalıştığını görmek için denerken Apache bağlantı için
   578        <code>select(2)</code> kullanacaktır. <code>select(2)</code> çağrısı
   579        bu soketin üzerinde <em>sıfır</em> veya <em>en azından bir</em>
   580        bağlantının beklemekte olduğu anlamına gelir. Apache'nin modeli çok
   581        sayıda çocuk süreç içerir ve boşta olanların tümünde aynı anda yeni
   582        bağlantılar denenebilir. Gerçekte çalışan kod bu olmasa da meramımızı
   583        anlatmak için kodun şöyle bir şey olduğunu varsayabiliriz:</p>
   584  
   585        <div class="example"><p><code>
   586          for (;;) {<br />
   587          <span class="indent">
   588            for (;;) {<br />
   589            <span class="indent">
   590              fd_set accept_fds;<br />
   591              <br />
   592              FD_ZERO (&amp;accept_fds);<br />
   593              for (i = first_socket; i &lt;= last_socket; ++i) {<br />
   594              <span class="indent">
   595                FD_SET (i, &amp;accept_fds);<br />
   596              </span>
   597              }<br />
   598              rc = select (last_socket+1, &amp;accept_fds, NULL, NULL, NULL);<br />
   599              if (rc &lt; 1) continue;<br />
   600              new_connection = -1;<br />
   601              for (i = first_socket; i &lt;= last_socket; ++i) {<br />
   602              <span class="indent">
   603                if (FD_ISSET (i, &amp;accept_fds)) {<br />
   604                <span class="indent">
   605                  new_connection = accept (i, NULL, NULL);<br />
   606                  if (new_connection != -1) break;<br />
   607                </span>
   608                }<br />
   609              </span>
   610              }<br />
   611              if (new_connection != -1) break;<br />
   612            </span>
   613            }<br />
   614            process the new_connection;<br />
   615          </span>
   616          }
   617        </code></p></div>
   618  
   619        <p>Bu özet gerçeklenim bir takım açlık sorunlarına sebep olur. Bu
   620        döngünün çalışması sırasında aynı anda çok sayıda çocuk süreç yeniden
   621        çağrılır ve istekler arasında kalan çoğu çocuk da <code>select</code>
   622        ile engellenir. Engellenen tüm bu çocuklar soketlerden herhangi biri
   623        üzerinde tek bir istek göründüğünde <code>select</code> tarafından
   624        uyandırılıp işleme sokulmak üzere döndürülürler (uyandırılan çocuk
   625        sayısı işletim sistemine ve zamanlama ayarlarına göre değişiklik
   626        gösterir). Bunların hepsi döngüye katılıp bağlantı kabul etmeye
   627        (<code>accept</code>) çalışırlar. Fakat içlerinden yalnız biri
   628        (sadece bir bağlantı isteğinin mevcut olduğu varsayımıyla) bunu
   629        başarabilir. Kalanının bağlantı kabul etmesi (<code>accept</code>)
   630        engellenir. Bu durum, bu çocukları istekleri başka başka soketlerden
   631        değil mecburen tek bir soketten kabul etmeye kilitler ve bu soket
   632        üzerinde yeni bir istek belirip uyandırılana kadar bu durumda
   633        kalırlar. Bu açlık sorunu ilk olarak <a href="http://bugs.apache.org/index/full/467">PR#467</a> sayılı raporla
   634        belgelenmiştir. Bu sorunun en az iki çözümü vardır.</p>
   635  
   636        <p>Çözümün biri engellenmeyen soket kullanımıdır. Bu durumda
   637        <code>accept</code> çocukları engellemeyecek ve yapılan bir
   638        bağlantının ardından diğer çocuklar durumları değişmeksizin bağlantı
   639        beklemeye devam edeceklerdir. Fakat bu durum işlemci zamanının boşa
   640        harcanmasına sebep olur.  Seçilmiş (<code>select</code>) boşta on
   641        çocuğun olduğunu ve bir bağlantı geldiğini varsayalım. Kalan dokuz
   642        çocuk işine devam edip bağlantı kabul etmeyi (<code>accept</code>)
   643        deneyecek, başarızsız olacak, dönecek başa, tekrar seçilecek
   644        (<code>select</code>) ve böyle hiçbir iş yapmadan dönüp duracaktır. Bu
   645        arada hizmet sunmakta olanlar da işlerini bitirdikten sonra bu
   646        döngüdeki yerlerini alacaklardır. Aynı kutunun içinde boşta bir sürü
   647        işlemciniz (çok işlemcili sistemler) yoksa bu çözüm pek verimli
   648        olmayacaktır.</p>
   649  
   650        <p>Diğer çözüm ise Apache tarafından kullanılan çözüm olup, girdiyi
   651        bir iç döngüde sıraya sokmaktır. Döngü aşağıda örneklenmiştir (farklar
   652        vurgulanmıştır):</p>
   653  
   654        <div class="example"><p><code>
   655          for (;;) {<br />
   656          <span class="indent">
   657            <strong>accept_mutex_on ();</strong><br />
   658            for (;;) {<br />
   659            <span class="indent">
   660              fd_set accept_fds;<br />
   661              <br />
   662              FD_ZERO (&amp;accept_fds);<br />
   663              for (i = first_socket; i &lt;= last_socket; ++i) {<br />
   664              <span class="indent">
   665                FD_SET (i, &amp;accept_fds);<br />
   666              </span>
   667              }<br />
   668              rc = select (last_socket+1, &amp;accept_fds, NULL, NULL, NULL);<br />
   669              if (rc &lt; 1) continue;<br />
   670              new_connection = -1;<br />
   671              for (i = first_socket; i &lt;= last_socket; ++i) {<br />
   672              <span class="indent">
   673                if (FD_ISSET (i, &amp;accept_fds)) {<br />
   674                <span class="indent">
   675                  new_connection = accept (i, NULL, NULL);<br />
   676                  if (new_connection != -1) break;<br />
   677                </span>
   678                }<br />
   679              </span>
   680              }<br />
   681              if (new_connection != -1) break;<br />
   682            </span>
   683            }<br />
   684            <strong>accept_mutex_off ();</strong><br />
   685            process the new_connection;<br />
   686          </span>
   687          }
   688        </code></p></div>
   689  
   690        <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
   691        semoforu oluştururlar. Mutekse aynı anda sadece bir çocuk sahip
   692        olabilir. Bu muteksleri gerçeklemek için çeşitli seçenekler vardır.
   693        Seçim, <code>src/conf.h</code> (1.3 öncesi) veya
   694        <code>src/include/ap_config.h</code> (1.3 ve sonrası) dosyasında
   695        tanımlanmıştır. Bazı mimariler bir kilitleme seçeneğine sahip
   696        değildir. Böyle mimarilerde çok sayıda <code class="directive"><a href="../mod/mpm_common.html#listen">Listen</a></code> yönergesi kullanmak güvenilir
   697        olmayacaktır.</p>
   698  
   699        <p><code class="directive"><a href="../mod/mpm_common.html#acceptmutex">AcceptMutex</a></code> yönergesi,
   700        seçilen muteks gerçeklenimini çalışma anında değiştirmek için
   701        kullanılabilir.</p>
   702  
   703        <dl>
   704          <dt><code>AcceptMutex flock</code></dt>
   705  
   706          <dd>
   707            <p>Bu yöntem, bir kilit dosyasını kilitlemek için
   708            <code>flock(2)</code> sistem çağrısını kullanır (Kilit dosyasının
   709            yeri <code class="directive"><a href="../mod/mpm_common.html#lockfile">LockFile</a></code>
   710            yönergesiyle belirtilir).</p>
   711          </dd>
   712  
   713          <dt><code>AcceptMutex fcntl</code></dt>
   714  
   715          <dd>
   716            <p>Bu yöntem, bir kilit dosyasını kilitlemek için
   717            <code>fcntl(2)</code> sistem çağrısını kullanır (Kilit dosyasının
   718            yeri <code class="directive"><a href="../mod/mpm_common.html#lockfile">LockFile</a></code>
   719            yönergesiyle belirtilir).</p>
   720          </dd>
   721  
   722          <dt><code>AcceptMutex sysvsem</code></dt>
   723  
   724          <dd>
   725            <p>(1.3 ve sonrası) Bu yöntem muteksi gerçeklemek için SysV tarzı
   726            semaforları kullanır. Maalesef, SysV tarzı semaforların bazı yan
   727            etkileri vardır. Bunlardan biri Apache'nin semaforu temizlemeden
   728            ölme ihtimalidir (<code>ipcs(8)</code> kılavuz sayfasına bakınız).
   729            Diğer biri, CGI'lerin sunucu ile aynı kullanıcı kimliğini
   730            kullanmaları nedeniyle semafor arayüzünün hizmet reddi
   731            saldırılarına açık olmasıdır (<code class="program"><a href="../programs/suexec.html">suexec</a></code> veya
   732            <code>cgiwrapper</code> gibi bir şeyler kullanmadıkça bütün
   733            CGI'ler için söz konusudur). Bu sebeple bu yöntem IRIX haricinde
   734            hiçbir mimaride kullanılmaz (önceki ikisi çoğu IRIX makine için
   735            elde edilmesi imkansız derecede pahalı olduğundan).</p>
   736          </dd>
   737  
   738          <dt><code>AcceptMutex pthread</code></dt>
   739  
   740          <dd>
   741            <p>(1.3 ve sonrası) Bu yöntem POSIX mutekslerini kullanır ve POSIX
   742            evreleri belirtiminin tamamen gerçeklendiği mimarilerde çalışması
   743            gerekirse de sadece Solaris (2.5 ve sonrası) üzerinde ve sadece
   744            belli yapılandırmalarla çalışmakta gibi görünmektedir. Bunu
   745            denemişseniz sunucunuzun çöktüğünü ve yanıt vermediğini
   746            görmüşsünüzdür. Sadece duruk içerikli sunucular iyi
   747            çalışmaktadır.</p>
   748          </dd>
   749  
   750          <dt><code>AcceptMutex posixsem</code></dt>
   751  
   752          <dd>
   753            <p>(2.0 ve sonrası)  Bu yöntem POSIX semaforlarını kullanır. Eğer
   754            işlem sırasında bir evre muteks kaynaklı parçalama arızalarıyla
   755            karşı karşıya kalırsa HTTP sunucusunun çökmesiyle semaforun sahibi
   756            kurtarılamaz.</p>
   757          </dd>
   758  
   759        </dl>
   760  
   761        <p>Eğer sisteminiz yukarıda bahsedilenler dışında başka bir dizgileme
   762        yöntemi kullanıyorsa bununla ilgili kodun APR'ye eklenmesi girilen
   763        zahmete değecektir.</p>
   764  
   765        <p>Başka bir çözüm daha vardır ancak döngü kısmen dizgilenmeyeceğinden
   766        (yani belli sayıda sürece izin verilemeyeceğinden) asla
   767        gerçeklenmemiştir. Bu sadece, aynı anda çok sayıda çocuk sürecin
   768        çalışabileceği ve dolayısıyla band genişliğinin tüm yönleriyle
   769        kullanılabileceği çok işlemcili sistemlerde ilginç olabilirdi. Bu
   770        gelecekte incelenmeye değer bir konu olmakla beraber çok sayıda HTTP
   771        sunucusunun aynı anda aynı amaca hizmet edecek şekilde çalışması
   772        standart olarak pek mümkün görülmediğinden bu olasılık çok
   773        düşüktür.</p>
   774  
   775        <p>En yüksek başarımı elde etmek için ideal olanı sunucuları
   776        çalıştırırken çok sayıda <code class="directive"><a href="../mod/mpm_common.html#listen">Listen</a></code> yönergesi kullanmamaktır. Fakat siz yine de
   777        okumaya devam edin.</p>
   778  
   779      
   780  
   781      <h3><code>accept</code> dizgilemesi - tek soket</h3>
   782  
   783        
   784  
   785        <p>Çok soketli sunucular için yukarıda açıklananlar iyi güzel de tek
   786        soketli sunucularda durum ne? Kuramsal olarak, bunların hiçbiriyle bir
   787        sorunları olmaması gerekir. Çünkü yeni bir bağlantı gelene kadar tüm
   788        çocuklar <code>accept(2)</code> ile engellenirler dolayısıyla hiçbir
   789        açlık sorununun ortaya çıkmaması gerekir. Uygulamada ise son
   790        kullanıcıdan gizli olarak, yukarıda engellenmeyen çocuklar çözümünde
   791        bahsedilenle hemen hemen aynı "boşa dönüp durma" davranışı mevcuttur.
   792        Çoğu TCP yığıtı bu yolu gerçeklemiştir. Çekirdek, yeni bir bağlantı
   793        ortaya çıktığında <code>accept</code> ile engellenen tüm süreçleri
   794        uyandırır. Bu süreçlerden bağlantıyı alan kullanıcı bölgesine geçerken
   795        çekirdek içinde döngüde olan diğerleri de yeni bağlantı keşfedilene
   796        kadar uykularına geri dönerler. Bu çekirdek içi döngü, kullanıcı
   797        bölgesindeki kodlara görünür değildir ama bu olmadıkları anlamına
   798        gelmez. Bu durum, çok soketli engellenmeyen çocuklar çözümündeki boşa
   799        döngünün sebep olduğu gereksiz işlemci yükü sorununu içinde
   800        barındırır.</p>
   801  
   802        <p>Bununla birlikte, tek soketli durumda bile bundan daha verimli bir
   803        davranış sergileyen bir çok mimari bulduk. Bu aslında hemen hemen her
   804        durumda öntanımlı olarak böyledir. Linux altında yapılan üstünkörü
   805        denemelerde (128MB bellekli çift Pentium pro 166 işlemcili makinede
   806        Linux 2.0.30) tek sokette dizgilemenin dizgilenmemiş duruma göre
   807        saniyede %3 daha az istekle sonuçlandığı gösterilmiştir. Fakat
   808        dizgilenmemiş tek soket durumunda her istekte 100ms'lik ek bir gecikme
   809        olduğu görülmüştür. Bu gecikmenin sebebi muhtemelen uzun mesafeli
   810        hatlar olup sadece yerel ağlarda söz konusudur. Tek soketli
   811        dizgilemeyi geçersiz kılmak için
   812        <code>SINGLE_LISTEN_UNSERIALIZED_ACCEPT</code> tanımlarsanız tek
   813        soketli sunucularda artık dizgileme yapılmayacaktır.</p>
   814  
   815      
   816  
   817      <h3>Kapatmayı zamana yaymak</h3>
   818  
   819        
   820  
   821        <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ölümünde
   822        bahsedildiği gibi, bir HTTP sunucusunun protokolü <strong>güvenilir
   823        şekilde</strong> gerçeklemesi için her iki yöndeki iletişimi
   824        birbirinden bağımsız olarak (iki yönlü bir TCP bağlantısının her
   825        yarısını diğerinden bağımsız olarak) kapatması gerekir. Bu olgu başka
   826        sunucular tarafından çoğunlukla dikkate alınmaz fakat Apache'nin 1.2
   827        sürümünden beri gerektiği gibi gerçeklenmektedir.</p>
   828  
   829        <p>Bu özellik Apache'ye eklendiğinde Unix'in çeşitli sürümlerinde
   830        uzgörüsüzlükten dolayı bir takım geçici telaş sorunlarına sebep oldu.
   831        TCP belirtimi <code>FIN_WAIT_2</code> durumunda bir zaman aşımından
   832        bahsetmez ama yasaklamaz da. Zaman aşımı olmayan sistemlerde, Apache
   833        1.2 çoğu soketin sonsuza kadar <code>FIN_WAIT_2</code> durumunda
   834        takılıp kalmasına sebep olur. Çoğu durumda, satıcıdan sağlanan en son
   835        TCP/IP yamalarını uygulanarak bu önlenebilir. Satıcının hiçbir yeni
   836        yama dağıtmadığı durumlarda (örneğin, SunOS4 -- bir kaynak lisansı ile
   837        insanlar bunu kendileri yamayabilirse de) bu özelliği devre dışı
   838        bırakmaya karar verdik.</p>
   839  
   840        <p>Bunun üstesinden gelmenin iki yolu vardır. Bunlardan biri
   841        <code>SO_LINGER</code> soket seçeneğidir. Bu işin kaderi buymuş gibi
   842        görünürse de çoğu TCP/IP yığıtında bu gerektiği gibi
   843        gerçeklenmemiştir. Bu yığıtlar üzerinde, bu yöntemin, doğru bir
   844        gerçeklenimle bile (örneğin, Linux 2.0.31) sonraki çözümden daha
   845        pahalı olduğu ortaya çıkmıştır.</p>
   846  
   847        <p>Çoğunlukla, Apache bunu (<code>http_main.c</code> içindeki)
   848        <code>lingering_close</code> adında bir işlevle gerçekler. Bu işlev
   849        kabaca şöyle görünür:</p>
   850  
   851        <div class="example"><p><code>
   852          void lingering_close (int s)<br />
   853          {<br />
   854          <span class="indent">
   855            char junk_buffer[2048];<br />
   856            <br />
   857            /* gönderen tarafı kapat */<br />
   858            shutdown (s, 1);<br />
   859            <br />
   860            signal (SIGALRM, lingering_death);<br />
   861            alarm (30);<br />
   862            <br />
   863            for (;;) {<br />
   864            <span class="indent">
   865              /* s'i okumak için, 2 saniyelik zaman aşımı ile seç */<br />
   866              select (s for reading, 2 second timeout);<br />
   867              /* Hata oluşmuşsa döngüden çık */<br />
   868              if (error) break;<br />
   869              /* s okumak için hazırsa */<br />
   870              if (s is ready for reading) {<br />
   871              <span class="indent">
   872                if (read (s, junk_buffer, sizeof (junk_buffer)) &lt;= 0) {<br />
   873                <span class="indent">
   874                  break;<br />
   875                </span>
   876                }<br />
   877                /* geri kalan herşey burada */<br />
   878              </span>
   879              }<br />
   880            </span>
   881            }<br />
   882            <br />
   883            close (s);<br />
   884          </span>
   885          }
   886        </code></p></div>
   887  
   888        <p>Bağlantı sonunda bu doğal olarak biraz daha masrafa yol açar, fakat
   889        güvenilir bir gerçeklenim için bu gereklidir. HTTP/1.1'in daha yaygın
   890        kullanılmaya başlanması ve tüm bağlantıların kalıcı hale gelmesiyle bu
   891        gerçeklenim daha fazla istek üzerinden kendi masrafını
   892        karşılayacaktır. Ateşle oynamak ve bu özelliği devre dışı bırakmak
   893        isterseniz <code>NO_LINGCLOSE</code>'u tanımlayabilirsiniz, fakat bu
   894        asla önerilmez. Özellikle, HTTP/1.1'den itibaren boruhatlı kalıcı
   895        bağlantıların <code>lingering_close</code> kullanmaya başlaması mutlak
   896        bir gerekliliktir (ve <a href="http://www.w3.org/Protocols/HTTP/Performance/Pipeline.html">
   897        boruhatlı bağlantıların daha hızlı</a> olması nedeniyle bu
   898        bağlantıları desteklemek isteyebilirsiniz).</p>
   899  
   900      
   901  
   902      <h3>Çetele Dosyası</h3>
   903  
   904        
   905  
   906        <p>Apache'nin ana ve alt süreçleri birbirleriyle çetele denen birşey
   907        üzerinden haberleşirler. Bunun en mükemmel şekilde paylaşımlı bellekte
   908        gerçeklenmesi gerekir. Eriştiğimiz veya portlarını ayrıntılı olarak
   909        belirttiğimiz işletim sistemleri için bu, genellikle paylaşımlı bellek
   910        kullanılarak gerçeklenir. Geri kalanlar, öntanımlı olarak bunu bir
   911        disk dosyası kullanarak gerçekler. Bir disk dosyaı yavaş olmanın yanı
   912        sıra güvenilir de değildir (ve daha az özelliğe sahiptir). Mimarinizin
   913        <code>src/main/conf.h</code> dosyasını inceleyin ve
   914        <code>USE_MMAP_SCOREBOARD</code> veya
   915        <code>USE_SHMGET_SCOREBOARD</code>'a bakın. Bu ikisinden birinin (ve
   916        yanı sıra sırasıyla <code>HAVE_MMAP</code> veya
   917        <code>HAVE_SHMGET</code>'in) tanımlanmış olması, sağlanan paylaşımlı
   918        bellek kodunu etkinleştirir. Eğer sisteminiz diğer türdeki paylaşımlı
   919        belleğe sahipse, <code>src/main/http_main.c</code> dosyasını açıp,
   920        Apache'de bu belleği kullanması gereken kanca işlevleri ekleyin (Bize
   921        de bir yama yollayın, lütfen).</p>
   922  
   923        <div class="note">Tarihsel bilgi: Apache'nin Linux uyarlaması, Apache'nin 1.2
   924        sürümüne kadar paylaşımlı belleği kullanmaya başlamamıştı. Bu kusur,
   925        Apache'nin Linux üzerindeki erken dönem sürümlerinin davranışlarının
   926        zayıf ve güvenilmez olmasına yol açmıştı.</div>
   927  
   928      
   929  
   930      <h3>DYNAMIC_MODULE_LIMIT</h3>
   931  
   932        
   933  
   934        <p>Devingen olarak yüklenen modülleri kullanmamak niyetindeyseniz
   935        (burayı okuyan ve sunucunuzun başarımını son kırıntısına kadar
   936        arttırmakla ilgilenen biriyseniz bunu düşünmezsiniz), sunucunuzu
   937        derlerken seçenekler arasına <code>-DDYNAMIC_MODULE_LIMIT=0</code>
   938        seçeneğini de ekleyin. Bu suretle, sadece, devingen olarak yüklenen
   939        modüller için ayrılacak belleği kazanmış olacaksınız.</p>
   940  
   941      
   942  
   943    </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
   944  <div class="section">
   945  <h2><a name="trace" id="trace">Ek: Bir çağrı izlemesinin ayrıntılı çözümlemesi</a></h2>
   946  
   947      
   948  
   949      <p>Burada, Solaris 8 üzerinde worker MPM'li Apache 2.0.38'in bir sistem
   950      çağrısı izlenmektedir. Bu izleme şu komutla elde edilmiştir:</p>
   951  
   952      <div class="example"><p><code>
   953        truss -l -p <var>httpd_çocuk_pidi</var>.
   954      </code></p></div>
   955  
   956      <p><code>-l</code> seçeneği, truss'a hafif bir sürecin yaptığı her
   957      sistem çağrısını (hafif süreç -- HS -- Solaris'in bir çekirdek seviyesi
   958      evreleme biçimi) günlüğe yazmasını söyler.</p>
   959  
   960      <p>Diğer sistemlerin sistem çağrılarını izleyen farklı araçları vardır
   961      (<code>strace</code>, <code>ktrace</code>, <code>par</code> gibi).
   962      Bunlar da benzer çıktılar üretirler.</p>
   963  
   964      <p>Bu izleme sırasında, bir istemci httpd'den 10 KB'lık duruk bir dosya
   965      talebinde bulunmuştur. Duruk olmayan veya içerik uzlaşımlı isteklerin
   966      izleme kayıtları vahşice (bazı durumlarda epey çirkince) farklı
   967      görünür.</p>
   968  
   969      <div class="example"><p><code>
   970        /67:    accept(3, 0x00200BEC, 0x00200C0C, 1) (uykuda...)<br />
   971        /67:    accept(3, 0x00200BEC, 0x00200C0C, 1)            = 9
   972      </code></p></div>
   973  
   974      <p>Bu izlemede, dinleyen evre HS #67 içinde çalışmaktadır.</p>
   975  
   976      <div class="note"><code>accept(2)</code> dizgelemesinin olmayışına dikkat edin.
   977      Özellikle bu platformda worker MPM, çok sayıda portu dinlemedikçe,
   978      öntanımlı olarak dizgeleştirilmemiş bir accept çağrısı kullanır.</div>
   979  
   980      <div class="example"><p><code>
   981        /65:    lwp_park(0x00000000, 0)                         = 0<br />
   982        /67:    lwp_unpark(65, 1)                               = 0
   983      </code></p></div>
   984  
   985      <p>Bağlantının kabul edilmesiyle, dinleyici evre isteği yerine getirmek
   986      üzere bir worker evresini uyandırır. Bu izlemede, isteği yerine getiren
   987      worker evresi  HS #65'e aittir.</p>
   988  
   989      <div class="example"><p><code>
   990        /65:    getsockname(9, 0x00200BA4, 0x00200BC4, 1)       = 0
   991      </code></p></div>
   992  
   993      <p>Sanal konakların gerçeklenimi sırasında, Apache'nin, bağlantıları
   994      kabul etmek için kullanılan yerel soket adreslerini bilmesi gerekir.
   995      Çoğu durumda bu çağrıyı bertaraf etmek mümkündür (hiç sanal konağın
   996      olmadığı veya <code class="directive"><a href="../mod/mpm_common.html#listen">Listen</a></code>
   997      yönergelerinin mutlak adreslerle kullanıldığı durumlarda). Fakat bu en
   998      iyilemeleri yapmak için henüz bir çaba harcanmamıştır.</p>
   999  
  1000      <div class="example"><p><code>
  1001        /65:    brk(0x002170E8)                                 = 0<br />
  1002        /65:    brk(0x002190E8)                                 = 0
  1003      </code></p></div>
  1004  
  1005      <p><code>brk(2)</code> çağrıları devingen bellekten bellek ayırır. httpd
  1006      çoğu isteği yerine getirirken özel bellek ayırıcılar
  1007      (<code>apr_pool</code> ve <code>apr_bucket_alloc</code>) kullandığından
  1008      bunlar bir sistem çağrısı izlemesinde nadiren görünür. Bu izlemede,
  1009      httpd henüz yeni başlatıldığından, özel bellek ayırıcıları oluşturmak
  1010      için ham bellek bloklarını ayırmak amacıyla <code>malloc(3)</code>
  1011      çağrıları yapması gerekir.</p>
  1012  
  1013      <div class="example"><p><code>
  1014  /65:    fcntl(9, F_GETFL, 0x00000000)                   = 2<br />
  1015  /65:    fstat64(9, 0xFAF7B818)                          = 0<br />
  1016  /65:    getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B910, 2190656) = 0<br />
  1017  /65:    fstat64(9, 0xFAF7B818)                          = 0<br />
  1018  /65:    getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B914, 2190656) = 0<br />
  1019  /65:    setsockopt(9, 65535, 8192, 0xFAF7B918, 4, 2190656) = 0<br />
  1020  /65:    fcntl(9, F_SETFL, 0x00000082)                   = 0
  1021      </code></p></div>
  1022  
  1023      <p>Ardından, worker evresi istemciye (dosya tanıtıcısı 9) engellenmeyen
  1024      kipte bir bağlantı açar. <code>setsockopt(2)</code>
  1025      ve <code>getsockopt(2)</code> çağrıları, Solaris libc'sinin soketler
  1026      üzerindeki <code>fcntl(2)</code> çağrısı yanında birer yan etkiden
  1027      ibarettirler.</p>
  1028  
  1029      <div class="example"><p><code>
  1030        /65:    read(9, " G E T   / 1 0 k . h t m".., 8000)     = 97
  1031      </code></p></div>
  1032  
  1033      <p>Worker evresi istemciden isteği okur.</p>
  1034  
  1035      <div class="example"><p><code>
  1036  /65:    stat("/var/httpd/apache/httpd-8999/htdocs/10k.html", 0xFAF7B978) = 0<br />
  1037  /65:    open("/var/httpd/apache/httpd-8999/htdocs/10k.html", O_RDONLY) = 10
  1038      </code></p></div>
  1039  
  1040      <p>Bu httpd  <code>Options FollowSymLinks</code> ve <code>AllowOverride
  1041      None</code> ile yapılandırılmıştır. Bu bakımdan, ne istenen dosya ile
  1042      sonuçlanan yol üzerindeki her dizinde <code>lstat(2)</code> çağrısına ne
  1043      de <code>.htaccess</code> dosyalarına bakılmasına gerek vardır.
  1044      <code>stat(2)</code> çağrısı basitçe dosya için şunları doğrulamak
  1045      amacıyla yapılır: 1) dosya mevcuttur ve 2) bir dizin değil normal bir
  1046      dosyadır.</p>
  1047  
  1048      <div class="example"><p><code>
  1049        /65:    sendfilev(0, 9, 0x00200F90, 2, 0xFAF7B53C)      = 10269
  1050      </code></p></div>
  1051  
  1052      <p>Bu örnekte, httpd, istenen dosyayı ve HTTP yanıt başlığını tek bir
  1053      <code>sendfilev(2)</code> sistem çağrısı ile  göndermektedir. Dosya
  1054      gönderim işleminin anlamı sistemden sisteme değişiklik gösterir. Bazı
  1055      sistemlerde, <code>sendfile(2)</code> çağrısından önce başlıkları
  1056      göndermek için  <code>write(2)</code> veya <code>writev(2)</code>
  1057      çağrısı yapmak gerekir.</p>
  1058  
  1059      <div class="example"><p><code>
  1060        /65:    write(4, " 1 2 7 . 0 . 0 . 1   -  ".., 78)      = 78
  1061      </code></p></div>
  1062  
  1063      <p>Bu <code>write(2)</code> çağrısı isteği erişim günlüğüne kaydeder. Bu
  1064      izlemede eksik olan tek şey, <code>time(2)</code> çağrısıdır. Apache
  1065      1.3'ün aksine, Apache 2.x zamana bakmak için
  1066      <code>gettimeofday(3)</code> çağırısını kullanır. Linux ve Solaris gibi
  1067      bazı işletim sistemleri, <code>gettimeofday</code> işlevinin, sıradan
  1068      bir sistem çağrısından daha fazla götürüsü olmayan en iyilenmiş bir
  1069      gerçeklenimine sahiptir.</p>
  1070  
  1071      <div class="example"><p><code>
  1072        /65:    shutdown(9, 1, 1)                               = 0<br />
  1073        /65:    poll(0xFAF7B980, 1, 2000)                       = 1<br />
  1074        /65:    read(9, 0xFAF7BC20, 512)                        = 0<br />
  1075        /65:    close(9)                                        = 0
  1076      </code></p></div>
  1077  
  1078      <p>Burada worker evresi bağlantıyı zamana yaymaktadır.</p>
  1079  
  1080      <div class="example"><p><code>
  1081        /65:    close(10)                                       = 0<br />
  1082        /65:    lwp_park(0x00000000, 0)         (uykuda...)
  1083      </code></p></div>
  1084  
  1085      <p>Son olarak, worker evresi teslim edilen dosyayı kapattıktan sonra
  1086      dinleyici evre tarafından başka bir bağlantı atanıncaya kadar beklemeye
  1087      alınır.</p>
  1088  
  1089      <div class="example"><p><code>
  1090        /67:    accept(3, 0x001FEB74, 0x001FEB94, 1) (uykuda...)
  1091      </code></p></div>
  1092  
  1093      <p>Bu arada, dinleyici evre bağlantıyı bir worker evresine atar atamaz
  1094      başka bir bağlantıyı beklemeye başlar (Mevcut tüm evreler meşgulse
  1095      dinleyici evreyi baskılayan worker MPM'nin akış denetim şemasına konu
  1096      olur). Bu izlemede görünmüyor olsa da sonraki <code>accept(2)</code>
  1097      çağrısı, yeni bağlantı kabul eden worker evresine paralel olarak
  1098      yapılabilir (aşırı yük durumlarında normal olarak, bu yapılır).</p>
  1099  
  1100    </div></div>
  1101  <div class="bottomlang">
  1102  <p><span>Mevcut Diller: </span><a href="../en/misc/perf-tuning.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
  1103  <a href="../ko/misc/perf-tuning.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
  1104  <a href="../tr/misc/perf-tuning.html" title="Türkçe">&nbsp;tr&nbsp;</a></p>
  1105  </div><div class="top"><a href="#page-header"><img src="../images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Yorum</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div>
  1106  <script type="text/javascript"><!--//--><![CDATA[//><!--
  1107  var comments_shortname = 'httpd';
  1108  var comments_identifier = 'http://httpd.apache.org/docs/2.2/misc/perf-tuning.html';
  1109  (function(w, d) {
  1110      if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
  1111          d.write('<div id="comments_thread"><\/div>');
  1112          var s = d.createElement('script');
  1113          s.type = 'text/javascript';
  1114          s.async = true;
  1115          s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
  1116          (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
  1117      }
  1118      else { 
  1119          d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
  1120      }
  1121  })(window, document);
  1122  //--><!]]></script></div><div id="footer">
  1123  <p class="apache">Copyright 2017 The Apache Software Foundation.<br /><a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a> altında lisanslıdır.</p>
  1124  <p class="menu"><a href="../mod/">Modüller</a> | <a href="../mod/directives.html">Yönergeler</a> | <a href="http://wiki.apache.org/httpd/FAQ">SSS</a> | <a href="../glossary.html">Terimler</a> | <a href="../sitemap.html">Site Haritası</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
  1125  if (typeof(prettyPrint) !== 'undefined') {
  1126      prettyPrint();
  1127  }
  1128  //--><!]]></script>
  1129  </body></html>