| <?xml version='1.0' encoding='UTF-8' ?> |
| <!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd"> |
| <?xml-stylesheet type="text/xsl" href="../style/manual.tr.xsl"?> |
| <!-- English Revision: 421174 --> |
| <!-- ===================================================== |
| Translated by: Nilgün Belma Bugüner <nilgun belgeler.org> |
| Reviewed by: Orhan Berent <berent belgeler.org> |
| ========================================================== --> |
| |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <manualpage metafile="mass.xml.meta"> |
| <parentdocument href="./">Sanal Konaklar</parentdocument> |
| <title>Devingen olarak Yapılandırılan Kitlesel Sanal Barındırma</title> |
| |
| <summary> |
| |
| <p>Bu belgede sanal konakların sonu belirsiz bir şekilde artışı karşısında |
| Apache httpd sunucusunun nasıl daha verimli kullanılacağı açıklanmıştır. |
| </p> |
| |
| </summary> |
| |
| <section id="motivation"><title>Amaç</title> |
| |
| <p>Burada açıklanan teknikler, <code>httpd.conf</code> dosyanızın |
| örnekteki gibi, aslında hemen hemen birbirinin aynı çok sayıda |
| <code><VirtualHost></code> bölümü içereceği zaman yapılacaklar ile |
| ilgilidir.</p> |
| |
| <example> |
| NameVirtualHost 111.22.33.44<br /> |
| <VirtualHost 111.22.33.44><br /> |
| <indent> |
| ServerName musteri-1.dom<br /> |
| DocumentRoot /siteler/musteri-1.dom/belgeler<br /> |
| ScriptAlias /cgi-bin/ /siteler/musteri-1.dom/cgi-bin<br /> |
| </indent> |
| </VirtualHost><br /> |
| <VirtualHost 111.22.33.44><br /> |
| <indent> |
| ServerName musteri-2.dom<br /> |
| DocumentRoot /siteler/musteri-2.dom/belgeler<br /> |
| ScriptAlias /cgi-bin/ /siteler/musteri-2.dom/cgi-bin<br /> |
| </indent> |
| </VirtualHost><br /> |
| # blah blah blah<br /> |
| <VirtualHost 111.22.33.44><br /> |
| <indent> |
| ServerName musteri-N.dom<br /> |
| DocumentRoot /siteler/musteri-N.dom/belgeler<br /> |
| ScriptAlias /cgi-bin/ /siteler/musteri-N.dom/cgi-bin<br /> |
| </indent> |
| </VirtualHost> |
| </example> |
| |
| <p>Ana fikir, tüm durağan <code><VirtualHost></code> |
| yapılandırmalarını devingen olarak çalışan tek bir |
| <code><VirtualHost></code> bölümüyle değiştirmektir. Bunun elbette |
| bazı getirileri olacaktır:</p> |
| |
| <ol> |
| <li>Yapılandırma dosyanız küçüleceği için Apache daha çabuk |
| başlatılabilecek ve daha az bellek harcayacaktır.</li> |
| |
| <li>Yeni sanal konakların eklenmesi, DNS’de yeni girdiler oluşturmak ve |
| dosya sisteminde bununla ilgili dizinleri açmak dışında biraz daha |
| basit olacaktır; en azından Apache’yi yeniden yapılandırmak ve yeniden |
| başlatmak zorunda kalmayacaksınız.</li> |
| </ol> |
| |
| <p>Ana götürüsü ise her sanal konak için ayrı birer günlük dosyasına sahip |
| olamayacak olmanızdır. Öte yandan, dosya tanıtıcılarının sınırlı olması |
| nedeniyle bunu yapmayı zaten istemezsiniz. Günlük kayıtları için bir |
| fifo veya bir boru hattı oluşturmak ve diğer uçta çalışan bir süreç |
| vasıtasıyla günlükleri müşterilere paylaştırmak daha iyidir (ayrıca, bu, |
| istatistikleri toplamanızı da kolaylaştırır).</p> |
| |
| </section> |
| |
| <section id="overview"><title>Genel Bakış</title> |
| |
| <p>Bir sanal konak iki bilgiye bakarak belirlenir: IP adresi ve HTTP |
| isteğindeki <code>Host:</code> başlığının içeriği. Devingen sanal |
| barındırma tekniği, isteği yerine getirmek için kullanılacak dosya |
| yoluna bu bilgiyi kendiliğinden girmek esasına dayanır. Bu, Apache 2.0 |
| ile <module>mod_vhost_alias</module> kullanarak oldukça kolay |
| yapılabileceği gibi <module>mod_rewrite</module> da kullanılabilir. Bu |
| modüllerin her ikisi de öntanımlı olarak devre dışıdır. Bu tekniği |
| kullanmak isterseniz Apache’yi yeniden yapılandırıp derleyerek bu iki |
| modülü etkin duruma getirmeniz gerekir.</p> |
| |
| <p>Devingen sanal konağı normal bir sanal konak gibi göstermek için bazı |
| şeyleri ’göstermelik’ olarak yapmak gerekir. Bunlardan en önemlisi, |
| Apache tarafından göreli URL’lerden normal URL’leri ve benzerlerini |
| üretmek için kullanılan sunucu ismidir. Sunucu ismi |
| <code>ServerName</code> yönergesi ile yapılandırılır ve CGI’ler |
| tarafından <code>SERVER_NAME</code> ortam değişkeni üzerinden |
| kullanılır. Çalışma anındaki asıl değer <directive module="core" |
| >UseCanonicalName</directive> yönergesi tarafından denetlenir. |
| <code>UseCanonicalName Off</code> olduğunda sunucu ismi isteğin |
| <code>Host:</code> başlık alanından elde edilir. <code>UseCanonicalName |
| DNS</code> belirtilmişse, sunucu ismi, sanal konağın IP adresinden |
| tersine DNS sorgusu yapılarak elde edilir. Birincisi isme dayalı sanal |
| konaklar tarafından ikincisi ise IP’ye dayalı sanal konaklar tarafından |
| kullanılır. Eğer Apache, istekte <code>Host:</code> başlığının olmayışı |
| veya DNS sorgusunun başarısız olması sebebiyle sunucu ismini elde |
| edemezse son çare olarak <code>ServerName</code> yönergesinde yazılı |
| değeri kullanır.</p> |
| |
| <p>‘Göstermelik’ yapılan şeylerden biri de <code>DocumentRoot</code> |
| yönergesi ile yapılandırılan belge kök dizini olup CGI’ler tarafından |
| <code>DOCUMENT_ROOT</code> ortam değişkeni üzerinden kullanılır. Normal |
| yapılandırmada <module>core</module> modülü tarafından dosya isimlerini |
| URI’lere eşlerken kullanılır. Fakat sunucu devingen sanal konakları |
| kullanmak üzere yapılandırıldığında, eşleştirmeyi farklı yollardan yapan |
| başka bir modül devreye girer (<code>mod_vhost_alias</code> veya |
| <code>mod_rewrite</code>). <code>DOCUMENT_ROOT</code> ortam değişkenine |
| değerini atamaktan sorumlu olan bu iki modülden biri kullanılmazsa CGI |
| veya SSI belgeleri yanlış değerlerle üretilirler.</p> |
| |
| </section> |
| |
| <section id="simple"><title>Basit Devingen Sanal Konaklar</title> |
| |
| <p>Yukarıda <a href="#motivation">Amaç</a> bölümünde özetlenen sanal konak |
| düzenlemesinin <code>mod_vhost_alias</code> kullanarak daha soysal bir |
| tarzda gerçekleştirilmiş halini içeren <code>httpd.conf</code> bölümü |
| aşağıdadır.</p> |
| |
| <example> |
| # sunucu ismini Host: başlığından elde edelim<br /> |
| UseCanonicalName Off<br /> |
| <br /> |
| # Bu günlükleme biçiminde ilk alana bakarak<br /> |
| # sanal konak günlükleri ayrıştırılabilir<br /> |
| LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon<br /> |
| CustomLog logs/access_log vcommon<br /> |
| <br /> |
| # istekleri yerine getirmek için kullanılacak<br /> |
| # dosya isimlerine sunucu ismini ekleyelim<br /> |
| VirtualDocumentRoot /siteler/%0/belgeler<br /> |
| VirtualScriptAlias /siteler/%0/cgi-bin |
| </example> |
| |
| <p>Bu yapılandırmayı IP’ye dayalı sanal konaklar için kullanmak isterseniz |
| <code>UseCanonicalName Off</code> yerine <code>UseCanonicalName |
| DNS</code> yazmanız yeterlidir. Böylece dosya ismine eklenecek konak |
| ismi sanal konağın IP adresinden türetilir.</p> |
| |
| </section> |
| |
| <section id="homepages"><title>Sanal Kişisel Sayfalar Sistemi</title> |
| |
| <p>Bu sistem, yukarıdaki yapılandırmanın bir ISS’nin kişisel sayfalar |
| sunucusuna uyarlanmasından başka bir şey değildir. Biraz daha karmaşık |
| bir yapılandırma ile dosya isimlerine <code>/home/kullanıcı/</code> |
| dizinlerini ekleyebiliriz. Farklı olarak her sanal konak için bir tane |
| değil hepsi için bir tane <code>cgi-bin</code> olacaktır.</p> |
| |
| <example> |
| # Son bölüm hariç yukarıdaki yapılandırma, burada...<br /> |
| <br /> |
| # sunucu ismine eklenecek dosya isimlerini oluşturalım<br /> |
| VirtualDocumentRoot /siteler/%2/belgeler<br /> |
| <br /> |
| # ortak cgi-bin dizini<br /> |
| ScriptAlias /cgi-bin/ /siteler/std-cgi/<br /> |
| </example> |
| |
| <p><module>mod_vhost_alias</module> belgesinde daha karmaşık |
| <code>VirtualDocumentRoot</code> örnekleri vardır.</p> |
| |
| </section> |
| |
| <section id="combinations"><title>Aynı Sunucuda Kişisel ve Kurumsal Sanal Konaklar</title> |
| |
| <p>Daha karmaşık ayarlamalar yaparak Apache’inin normal |
| <code><VirtualHost></code> bölümlerini farklı kitlesel sanal konak |
| yapılandırmaları için kullanabilirsiniz. Örneğin, bireysel |
| müşterileriniz için bir IP adresiniz, kurumsal müşterileriniz için de |
| başka bir IP adresiniz olsun. Her biri için ayrı ayrı sanal konaklar |
| ayarlamak yerine aşağıdaki gibi bir yapılandırma kullanabilirsiniz:</p> |
| |
| <example> |
| UseCanonicalName Off<br /> |
| <br /> |
| LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon<br /> |
| <br /> |
| <Directory /siteler/kurumsal><br /> |
| <indent> |
| Options FollowSymLinks<br /> |
| AllowOverride All<br /> |
| </indent> |
| </Directory><br /> |
| <br /> |
| <Directory /siteler/bireysel><br /> |
| <indent> |
| Options FollowSymLinks<br /> |
| AllowOverride None<br /> |
| </indent> |
| </Directory><br /> |
| <br /> |
| <VirtualHost 111.22.33.44><br /> |
| <indent> |
| ServerName kurumsal.iss.dom<br /> |
| <br /> |
| CustomLog logs/access_log.kurumsal vcommon<br /> |
| <br /> |
| VirtualDocumentRoot /siteler/kurumsal/%0/belgeler<br /> |
| VirtualScriptAlias /siteler/kurumsal/%0/cgi-bin<br /> |
| </indent> |
| </VirtualHost><br /> |
| <br /> |
| <VirtualHost 111.22.33.45><br /> |
| <indent> |
| ServerName bireysel.iss.dom<br /> |
| <br /> |
| CustomLog logs/access_log.bireysel vcommon<br /> |
| <br /> |
| VirtualDocumentRoot /siteler/bireysel/%0/belgeler<br /> |
| ScriptAlias /cgi-bin/ /siteler/std-cgi/<br /> |
| </indent> |
| </VirtualHost> |
| </example> |
| </section> |
| |
| <section id="ipbased"><title>IP’ye dayalı sanal konakları daha verimli kılmak</title> |
| |
| <p><a href="#simple">İlk örnekte</a> IP’ye dayalı sanal konaklar için |
| kullanılmak istenirse yapılandırmada neyin nasıl değiştirileceği |
| belirtilmişti. Her istek için ayrı bir DNS sorgusu gerekeceğinden bu |
| başarım düşmesine yol açar. DNS sorgusu ihtiyacını ortadan kaldırmak |
| için, bir çözüm olarak dosya sistemi, konak isimleri yerine IP |
| adreslerine göre düzenlenebilir. Günlük kayıtları da IP adreslerine göre |
| ayrıştırılacak şekilde ayarlanabilir.</p> |
| |
| <example> |
| # Sunucu ismini IP adresinden ters DNS sorgusu ile elde edelim<br /> |
| UseCanonicalName DNS<br /> |
| <br /> |
| # Günlük kayıtları IP adreslerine göre ayrıştırılabilsin<br /> |
| LogFormat "%A %h %l %u %t \"%r\" %s %b" vcommon<br /> |
| CustomLog logs/access_log vcommon<br /> |
| <br /> |
| # dosya isimleri IP adreslerini içersin<br /> |
| VirtualDocumentRootIP /siteler/%0/belgeler<br /> |
| VirtualScriptAliasIP /siteler/%0/cgi-bin<br /> |
| </example> |
| |
| </section> |
| |
| <section id="simple.rewrite"><title><code>mod_rewrite</code> ile Kurumsal Müşteriler Sistemi</title> |
| |
| <p>Buradaki <code>httpd.conf</code> bölümü de <a href="#simple">ilk |
| örnekteki</a> gibi elde edilmiştir. İlk yarı, bazı değişiklikler dışında |
| yukarıdaki örneğe çok benzer. Bu değişiklikler yapılandırmanın |
| <code>mod_rewrite</code> bölümünün düzgün çalışması ve geriye doğru |
| uyumluluk için gereklidir. İkinci yarı, asıl işi yapan |
| <code>mod_rewrite</code> yapılandırmasını içerir.</p> |
| |
| <p>Biraz uzmanlık gerektiren bazı kısımlar var: Öntanımlı olarak |
| <code>mod_rewrite</code> diğer (<code>mod_alias</code>, vs. gibi) URI |
| dönüşüm modüllerinden önce çalışır. Dolayısıyla bu modülleri kullanmak |
| isterseniz, <code>mod_rewrite</code>’ı bunlara izin verecek şekilde |
| yapılandırmalısınız. Ayrıca her devingen sanal konağa eşdeğer bir |
| <code>ScriptAlias</code> yapmak için de biraz büyü yapmak gerekir.</p> |
| |
| <example> |
| # Sunucu ismini Host: başlığınıdan alalım.<br /> |
| UseCanonicalName Off<br /> |
| <br /> |
| # Günlük dosyasından bilgileri ayıklayabilelim.<br /> |
| LogFormat "%{Host}i %h %l %u %t \"%r\" %s %b" vcommon<br /> |
| CustomLog logs/access_log vcommon<br /> |
| <br /> |
| <Directory /siteler/hosts><br /> |
| <indent> |
| # ScriptAlias için yaptıklarımızla CGI betiklerini<br /> |
| # çalışmaya zorlayamayacağımızdan ExecCGI burada gerekli.<br /> |
| Options FollowSymLinks ExecCGI<br /> |
| </indent> |
| </Directory><br /> |
| <br /> |
| # İşin zor yanına geldik.<br /> |
| <br /> |
| RewriteEngine On<br /> |
| <br /> |
| # Host: başlığından elde edilen sunucu isminde harf<br /> |
| # büyüklükleri çeşitli olabilir. Hepsini küçük harf yapalım.<br /> |
| RewriteMap lowercase int:tolower<br /> |
| <br /> |
| ## önce normal belgelerle anlaşalım:<br /> |
| # Alias /icons/ çalışsın - diğer rumuzlar için yineleyelim<br /> |
| RewriteCond %{REQUEST_URI} !^/icons/<br /> |
| # CGI’ler de çalışsın.<br /> |
| RewriteCond %{REQUEST_URI} !^/cgi-bin/<br /> |
| # Biraz da büyü yapalım.<br /> |
| RewriteRule ^/(.*)$ /siteler/${lowercase:%{SERVER_NAME}}/belgeler/$1<br /> |
| <br /> |
| ## Artık CGI’lerle anlaşabiliriz. - Bir MIME türü isteyelim.<br /> |
| RewriteCond %{REQUEST_URI} ^/cgi-bin/<br /> |
| RewriteRule ^/(.*)$ /siteler/${lowercase:%{SERVER_NAME}}/cgi-bin/$1 [T=application/x-httpd-cgi]<br /> |
| <br /> |
| # Bu kadar! |
| </example> |
| |
| </section> |
| |
| <section id="homepages.rewrite"><title><code>mod_rewrite</code> ile Kişisel Sayfalar Sistemi</title> |
| |
| <p>Burada da <a href="#homepages">ikinci örnekte</a> yaptıklarımızı |
| yapıyoruz.</p> |
| |
| <example> |
| RewriteEngine on<br /> |
| <br /> |
| RewriteMap lowercase int:tolower<br /> |
| <br /> |
| # CGI’ler çalışsın.<br /> |
| RewriteCond %{REQUEST_URI} !^/cgi-bin/<br /> |
| <br /> |
| # konak ismi doğru mu bakalım yoksa RewriteRule çalışmaz.<br /> |
| RewriteCond ${lowercase:%{SERVER_NAME}} ^www\.[a-z-]+\.isp\.dom$<br /> |
| <br /> |
| # URI’nin başına sanal konak ismini ekleyelim.<br /> |
| # [C], bunu bitirdikten sonra, sonraki rewrite ile devam et demek.<br /> |
| RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C]<br /> |
| <br /> |
| # Artık asıl dosya ismini oluşturabiliriz.<br /> |
| RewriteRule ^www\.([a-z-]+)\.isp\.dom/(.*) /home/$1/$2<br /> |
| <br /> |
| # Ortak CGI dizinini tanımlayalım.<br /> |
| ScriptAlias /cgi-bin/ /siteler/std-cgi/ |
| </example> |
| |
| </section> |
| |
| <section id="xtra-conf"><title>Sanal konaklar için ayrı bir yapılandırma dosyası kullanmak</title> |
| |
| <p>Burada, sanal konak isimlerinden belge kök dizini elde ederken |
| <module>mod_rewrite</module> modülünün daha gelişkin özelliklerinden |
| yararlanarak isimleri ayrı bir dosyadan okutacağız. Bu, esnekliği |
| artırır ama daha karmaşık bir yapılandırma gerekir.</p> |
| |
| <p>Aşağıdaki içeriğe sahip bir <code>vhost.map</code>dosyamız olsun:</p> |
| |
| <example> |
| musteri-1.dom /siteler/kurumsal/1<br /> |
| musteri-2.dom /siteler/kurumsal/2<br /> |
| # ...<br /> |
| musteri-N.dom /siteler/kurumsal/N<br /> |
| </example> |
| |
| <p><code>httpd.conf</code> dosyamız da şunları içerecektir:</p> |
| |
| <example> |
| RewriteEngine on<br /> |
| <br /> |
| RewriteMap lowercase int:tolower<br /> |
| <br /> |
| # Eşlem dosyasını tanımlayalım<br /> |
| RewriteMap vhost txt:/siteler/conf/vhost.map<br /> |
| <br /> |
| # Rumuzları yukarıdaki gibi halledelim.<br /> |
| RewriteCond %{REQUEST_URI} !^/icons/<br /> |
| RewriteCond %{REQUEST_URI} !^/cgi-bin/<br /> |
| RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$<br /> |
| # Eşlemeyi dosyalar için de yapalım.<br /> |
| RewriteCond ${vhost:%1} ^(/.*)$<br /> |
| RewriteRule ^/(.*)$ %1/belgeler/$1<br /> |
| <br /> |
| RewriteCond %{REQUEST_URI} ^/cgi-bin/<br /> |
| RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$<br /> |
| RewriteCond ${vhost:%1} ^(/.*)$<br /> |
| RewriteRule ^/(.*)$ %1/cgi-bin/$1 |
| </example> |
| |
| </section> |
| </manualpage> |