mirror of
https://github.com/apache/httpd.git
synced 2025-11-06 16:49:32 +03:00
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1178089 13f79535-47bb-0310-9956-ffa450edef68
406 lines
17 KiB
XML
406 lines
17 KiB
XML
<?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: 659902:1174747 (outdated) -->
|
||
<!-- =====================================================
|
||
Translated by: Nilgün Belma Bugüner <nilgun belgeler.org>
|
||
Reviewed by: Orhan Berent <berent belgeler.org>
|
||
========================================================== -->
|
||
|
||
<!--
|
||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||
contributor license agreements. See the NOTICE file distributed with
|
||
this work for additional information regarding copyright ownership.
|
||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||
(the "License"); you may not use this file except in compliance with
|
||
the License. You may obtain a copy of the License at
|
||
|
||
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
||
Unless required by applicable law or agreed to in writing, software
|
||
distributed under the License is distributed on an "AS IS" BASIS,
|
||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
See the License for the specific language governing permissions and
|
||
limitations under the License.
|
||
-->
|
||
|
||
<manualpage metafile="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>
|
||
|
||
<note><title>Bilginize</title>
|
||
<p>Eğer ilk <code><VirtualHost></code> bölümü bir <directive
|
||
module="core">ServerName</directive> yönergesi içermezse ilgili IP
|
||
için ters DNS sorgusu yapılır. Eğer sorgudan elde edilen isim
|
||
sunucunun ismi değilse bu istenmeyen duruma bir çözüm olarak bir
|
||
bilgilendirme bölümü (<code>ServerName isimsiz.iss.dom</code>)
|
||
eklenebilir.</p>
|
||
</note>
|
||
|
||
</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 eylemci isteyelim.<br />
|
||
RewriteCond %{REQUEST_URI} ^/cgi-bin/<br />
|
||
RewriteRule ^/(.*)$ /siteler/${lowercase:%{SERVER_NAME}}/cgi-bin/$1 [H=cgi-script]<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 [H=cgi-script]
|
||
</example>
|
||
|
||
</section>
|
||
</manualpage>
|