APACHE 2.2.3 : AĞ SUNUCUSU |
( soner.sag@linuxprompt.com ) |
Giriş |
Internet küçük, büyük ağların buluştuğu bir ortamdır. Bu ağlar içerikleri sayesinde ziyaretçilere birçok konuda bilgi sunmaktadırlar. Internetin en cazip tarafı işte bu zengin içeriktir. Ama bu içeriğin kullanıcılarla buluşması için bir yazılıma ihtiyaç var. Bu belgede Orta ölçekli bir server'da çalışan ve birkaç host barındıran "Apache 2.2.3" ağ sunucusunun nasıl yapılandırıldığı incelenecektir.
Bir web sunucusu varsa en az bir de IP adresi olmalıdır. HTTP 1.1 'den önce mantık her web sitesi için bir IP adresi idi. Apache 1.1 versiyonu ile birlikte isim tabanlı hizmetlere destek vermeye başlandi. Bu sayede bir IP adresi üzerinden bir çok host barındırılabilir hale getirildi. Apache 1.1 ve http 1.1 sürümleri aşağı yukarı aynı tarihler de çıktı. Bu açıdan bakıldığında apache isim tabanlı sanal sunucu ayarlarını destekleyen ilk web sunuculardandır.
Aynı zamanda bir ağ sunucusunun yapısının esnek olması taleplere cevap verirken de güvenli olması gerekmektedir. Apache 'nin gücü ensekliğidir. Özelikle "Apache 2" ile ön plana çıkan bu esneklik herhangi bir modul eklemek için yeniden derleme gerekliliğini ortadan kaldirmiştir. "Apache 1.3" de karşimiza çıkan httpd.conf dosyasının yerini apache2.conf dosyası almıştır. |
Modüller apache 'nin ne hizmeti verdiğinin göstergesidir. İlk kurulumla gelen moduller standart bir belge yayını için gereken minumum ayarlar içindir. apache2 'de moduller "/etc/apache2/mods-available" dizininde tutulur. Burada çalıştırmak istediğiniz modulü "/etc/apache2/mods-enabled" dizinine linkle bağlamanız gerekmektedir. Mesela php5 kullanmanız gerekiyor. "/etc/apache2/mods-enabled" dizinine girerek "ln -s ../mods-available/php5* ." komutu vermeniz yeterlidir. Bu işlem "a2enmod <modul_adı>" şeklinde de yapılabilir. Tabi bu işlemden sonra apache2 yeniden başlatılır.
Apache de bir web sitesini veya belgeyi yayınlamak için öncelikle bunların bir dizine yerleştirilmeleri gerekir. Bu yazı da bahsedilen bu aşamadan sonrası yani ayarlar kısmı içindir. Bu yazı da bu dizinler apache 'ye gösterilecek ve içeriğe göre bazı yetkilendirilmeler yapılacaktır. Serverımızda da çalışan apache2 'de 2 adet ayar dosyası bulunmaktadır. Bu dosyalar aşağıya yazılmıştır.
linuxprompt.com.conf
default.linuxpromt.com.conf
Apache server ile ilgili ayar dosyalarımızın "/etc/apache2/sites-available" dizinin de bulunması gerekir. Bu dizinden de "/etc/apache2/sites-enabled" dizinine linklenmelidirler. Bu işlemler için komut satırı açilarak aşağıdaki komutlar girilir.
| linuxprompt~# cd /etc/apache2/sites-available |
| linuxprompt~# a2ensite linuxprompt.com.conf |
| linuxprompt~# a2ensite default.linuxprompt.conf |
Temel ayarlar "/etc/apache2/apache2.conf" dosyasında tutulmaktadır. Gerektiğinde performans veya güvenlik için değiştirilmesi gerekebilir. Burada değiştirilen ayarlar tüm apache 'nin davranışını değiştirmektedir.
Bu ayar Apache 'nin kaç süreç 'le başlatılacağını gösterir. Server da prosesleri görmek için
komutunu kullandığınız da görülen
| 31092 ? Ss 0:00 /usr/sbin/apache2 -k start |
süreçlerdir.
Aynı anda bağlanılabilecek kullanıcı sayısıdır. 100 orta ve küçük ölçekli bir servis çalıştırılıyorsa yeterlidir.
Bu sayı apache alt süreci öldürmeden önce sürecin tamamlaması gereken istek sayısıdır.
Apache de yayın yapılacak dizinin kontrolunu "/etc/apache2/sites-available" dizininin altına koyduğumuz ayar dosyasından yapariz. Fakat istersek her dizini ayrı ayrı bulunduğu alandan yönetmemiz mümkündür. Bu seçenek on ise o dizinde .htaccess dosyası olup olmadığına bakacaktır ve .htaccess dosyasının içinde dizin yetkileri olmalıdır.
| PidFile /var/run/apache2.pid |
Bu parametre apache 'nin ana sürecinin tutulduğu dosyanın yeridir.
Apache 'nin istemci ile bağlantısının koptuğundan emin olması için yanıt almadan beklemesi gereken süredir. Saniye cinsinden belirtilir. 300 saniye yani 5 dakikadır.
Apache aniden artabilecek isteğe karşı belirli bi sayıda yedek sunucu bulundurur. Ani yük artışlarında toplam süreç sayısı 10 ise burada 5 artırılacaktır. Yani toplam da 15 süreç görülecektir.
Apache aktif süreçler kapatılırken süreç toplamına buradaki sayı kadar süreç kler.. Bunun sebebi ani yüklenme durumunda hızlı cevap vermesi gerektiği içindir. Burada bahsedilen 'ler fazla yük durumunda dır. 140 tane istek varsa ve hızla 110 isteğe düşmüşse apache 120 süreç çalıştırır.
| User www-data |
| Group www-data |
Apache2 'nin kullanıcı adı ve grubudur. www-data olarak gelmektedir.
Belgenin başında belirtildiği gibi buraya kadar olan ayarların tüm web hizmetlerini etkileyeceğinden bilgi olarak saklanması sadece belirli yeterlilikten sonra kullanılmalıdır.
Apache ayar dosyalarında http 'de kullanılan taglar gibi işaretler kullanılır."<Directory>...</Directory>" şeklinde tagların içine ayarlar yerleştirilir. Bu tagların dışında kalan apache komutları bu belgede global ayarlar olarak nitelendirilecektir.
Açıklamalar da öncelik global tanımlara verilecektir.
| <VirtualHost _default_:80>........</VirtualHost> |
Apache server 'da birkaç domain yayını yapılacaksa VirtualHost tanımı kullanmamız gerekmektedir. <VirtualHost> tanımı ayarlar yazıldıktan sonra </VirtualHost> ile kapatılmalıdır. "default_"_ webserverınızın default ip adresidir._default_:80 yerine *:80 veya *:443 gibi kullandığımız portla birlikte belirtilebilir.
Apache 'de tanımlamalar yukardaki VirtualHost örneğindeki gibi tagların içinde yer alır.Bu taglar gitgide daraltılarak istenilen ayar oluşturulur. Bir web yayınında bazı ayarları bir kere girmeniz yeterlidir. Bunlar ilk tag açıldıktan sonra girilir. Bu ayarlar aşağıda açiklanmiştir.
Yayının yapılacağı dizini belirtir. Aksi belirtilmedikçe apache, kullanıcılarını bu dizinin altina indirilmez.
| ServerName www.linuxprompt.com |
Serverımızın adıdır. Mesela serverımıza "www.linuxprompt.com" adı ile girilecekse yukardaki ServerName tanımı yapılmalıdır. Burada dikkat edilmesi gereken http://linuxprompt.com ile http://www.linuxprompt.com adları arasında fark olduğudur. Eğer ki bir alana birkaç isimle bağlanılacaksa ServerAlias ( Server Lakabı ) kullanılmalıdır. Server adı ve lakabı DNS kayıtlarımızda olması gerekmektedir. IP Aksi taktirde çalışmayacaktır.
| ServerAlias linuxprompt.com |
Serverımızı başka bir isimle de ulaşmak istersek diger ismi bu bölüme yazmalıyız. Birden çok kullanılabilir. Burada kullandığınız adın da DNS kayıtlarınız da olması gerektiğini unutmayın.
| ServerAdmin admin@linuxprompt.com |
Hataların bildirileceği sistem yöneticisinin adresidir. Örnek olarak sitenizde herhangi bir hata oluştuğunda kullanıcının sizinle irtibata geçmesini sağlama için hata mesajının içerisinde belitilir.
Yayın yapılacak belgenin karakter seti 'dir. Farklı lisanların farklı Charset kodları vardır. Türkçenin ISO Charset 'i ISO-8859-9 dur. Ama aynı belge içinde hem arapça hem türkçe karakter kullanmamız gerekebilir. Bu durumda evrensel bir kodlama gerekmektedir. Bu server 'da bu yüzden evresel karakter set olan UTF-8 karakter seti kullanılmaktadır.
Apache web sunucusu için tasarlanmış en karmaşık modüllerden bir tanesi de rewrite modülüdür. Bu modül sayesinde apache web sunucusu istemciden gelen URL üzerinde değişiklik yapabilmektedir. Bu modülün temel kullanım amacı istemciden gönderilen URL üzerinde belli örüntüler aramak ve bu örüntüleri içeren URL'ler üzerinde değişiklik yapmaktır. Biz bu örüntüleri dile göre içerik sunacağımızdan kullanacağız. Varsayılan olarak rewrite modülü aktif değildir. Modülün aktif olup olmadığı "RewriteEngine" deyimi ile kontrol edilmektedir. "RewriteEngine On" Sunucuya anlamlı linkler tekniğine başladığımızı söyler. Modül yüklü değilse "a2enmod rewrite" yazarak rewrite.load modulunun yüklenmesi gerekmektedir.
| RewriteLog /var/log/apache2/rewrite.log |
rewrite işlemi ile ilgili log tutacağımız dosya "/var/log/apache2/rewrite.log" dosyasıdır.
Log seviyesini belirtiyoruz. Log seviyesi 0 dan 9 a kadardır. 0 Log yapılmayacağını belirtir. Biz debug olarak en düşük değeri yani 3 'ü seçiyoruz.
RewriteRule ^/tr/* http://tr.linuxprompt.com [R,L]
RewriteRule ^/fr/* http://fr.linuxprompt.com [R,L]
RewriteRule ^/de/* http://de.linuxprompt.com [R,L]
RewriteRule ^/ru/* http://ru.linuxprompt.com [R,L]
RewriteRule ^/en/* http://en.linuxprompt.com [R,L] |
URL 'yi yeniden yazma işlemini gerçekleştiren RewriteRule deyimleridir.
İstemciden gelen ve istekte bulunan URL üzerinde, yukarda verilen regüler ifadeler (^/tr/*,^/fr/*, ^/de/*, ^/ru/*, ^/en/* ) ile arama gerçekleştirilir. Verilen regüler ifade , istemcinin istediği URL'ye uyduğu takdirde, (hangisi örtüşüyorsa) istemciden gelen URL YENI_URL olarak değiştirilir. Yani www.linuxprompt.com olarak giren bir kullanıcı browser 'ı almanca kullanıyorsa ^/de/* reguler ifadesi ile örtüşecek ve de.linuxprompt.com alanına yönlendirilecektir.
[R,L]
R : Yeni URL'ye yönlendirme işleminin kullanıcının browserından gerçekleştirilmesini sağlar. R bayrağı verilemediği durumlarda yönlendirme işlemi apache sunucusu tarafından gerçekleştirilir. R bayrağı verildiği takdirde apache web sunucusu kulanıcının browser 'ına yönlendirme işlemini yapabilmesi için 302 numaralı HTTP mesajı ve yeni URL'yi gönderir.
L : URL yeniden yazma işleminin biritirilmesini sağlar. Bu kuraldan sonra tanımlanmış kurallar işletilmez. Yani işlem bitirilir.
linuxprompt.com alan adının DNS tanımlarında "CNAME" ile bu adlar tanımlanmalıdır. ( tr, fr, de, ru, en )
DIZIN HAKLARININ YAPILANDIRILMASI |
| <Directory "/srv/www/linuxprompt.com"> ......</Directory> |
"/srv/www/linuxprompt.com" dizininden web yayınının yapılacağını belirtiyoruz. Directory tagları arasında apache 'nin bu dizine nasıl davranıcağını ayarlayacağız.
| DirectoryIndex index.html index.php |
Dizinin içerisinde gösterilecek olan ön tanımlı dosya adları belirtiliyor. Apache 'nin genel tanımlarında index.html olarak yer almaktadır. Biz burada index.php dosyasını da ekliyoruz. Bazı dizinlerimiz de yoksa index.php varsa ve kullanıcı dizini çağırdığında index.php dosyası açılacaktır.
| AllowOverride Options FileInfo |
| AllowOverride None |
.htaccess dosyalarının desteğinin kaldırılması için bu komut gereklidir.
| Order allow,deny |
| Allow from all |
Bu sunucudan kimlerin dosya okumasına izin verildiğinin ayarı.Bütün adreslerden erişime izin ver.
| Alias /phpmyadmin "/srv/www/phpmyadmin" |
Bir web yayınında bazen uzun dizinler ve dosya adları kullanmak gerekir. Ya da belirli bir alana belirli bir isimle başvurulması istenebilir. Bu durumlar da Alias ( Lakap ) kullanılmalıdır. Yukarıda www.linuxprompt.com/phpmyadmin yazılarak "srv/www/phpmyadmin" dizinine gidileceği yazılmıştır. Alias 'dan sonra <Directory> .. </Directory> tagları arasında bu dizine erişimi ayarlayacağız.
| Allow from 127. 10. 88.249.93.13 |
Sadece 127. 10. ile başlayan ve 88.249.93.29 IP adresinden gelen isteklere cevap verileceği söyleniyor.
| ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ |
Bu komut ile /cgi-bin/ ayrı bir ScriptAlias komutu verilmeyen bütün sanal sunucularda kullanacaktır. CGI betikleri bu dizinin içine yerleştirilmelidir.
Dizinin içeriğinin gösterilmeyeceğini belirtiyoruz. Güvenlik için kullanılması önerilir.
| Options FollowSymLinks |
| Options ExecCGI -MultiViews +SymLinksIfOwnerMatch |
ExecCGI ile bu dizinde CGI betiklerini çalıştırılabilir duruma getiriyoruz. -MultiViews ile yapılan bir istekte uzantilari dikkate almaksızın "index.*" gibi dosyalari listelemesi engelleniyor. " - " ile bu özelliği kapalı tutuyoruz. SymLinksIfOwnerMatch ile herhangi bir kullanıcının dizin içersinde bir link vermesini engelliyoruz. SymLinksIfOwnerMatch komutu FollowSymLinks 'den daha güvenlidir.Ancak istenen dizinin birkaç seviye içerde olması durumunda tepki süresini epey yavaşlatır. Fakat burada bahsedilen cgi dizini olduğu için güvenliği üst seviyede tumak gerekir.
| Options Indexes MultiViews FollowSymLinks |
Indexes MultiViews ile yapılan bir istekte uzantilari dikkate almaksızın "index.*" gibi dosyalari listeliyor. FollowSymLinks ile dosya haklarını ve link olup olmadığını kontrol ediyor.
Tüm Options seçeneklerini kapatmak için kullanılır.
linuxprompt.com, phpmyadmin, cgi-bin, doc, dizinlerinin yayınlandığı
/etc/apache2/sites-available/default.linuxprompt.com.conf
dosyasının içeriği aşağıdadır.
<VirtualHost _default_:80>
DocumentRoot /srv/www/linuxprompt.com
ServerName www.linuxprompt.com
ServerAlias www.linuxprompt.com
ServerAlias linuxprompt.com
ServerAdmin info@linuxprompt.com
CharsetDefault UTF-8
<Directory "/srv/www/linuxprompt.com">
Options -Indexes
Options FollowSymLinks
DirectoryIndex index.php index.html index.htm
AllowOverride None
Order allow,deny
Allow from all
</Directory>
Alias /phpmyadmin "/srv/www/phpmyadmin"
<Directory /srv/www/phpmyadmin/>
Options -Indexes
AllowOverride None
Order allow,deny
Allow from 127. 10. 88.249.93.13
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost> |
default.linuxprompt.com.conf ile ilgili
/etc/apache2/sites-available/linuxprompt.com.conf
dosyasının içeriği aşağıdadır.
<VirtualHost *:80>
DocumentRoot /srv/www/linuxprompt.com
RewriteEngine On
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3
RewriteRule ^/tr/* http://tr.linuxprompt.com [R,L]
RewriteRule ^/fr/* http://fr.linuxprompt.com [R,L]
RewriteRule ^/de/* http://de.linuxprompt.com [R,L]
RewriteRule ^/ru/* http://ru.linuxprompt.com [R,L]
RewriteRule ^/en/* http://en.linuxprompt.com [R,L]
ServerName linuxprompt.com
ServerAlias linuxprompt.com
ServerAlias www.linuxprompt.com
ServerAlias linuxprompt.net
ServerAlias www.linuxprompt.net
ServerAlias linuxprompt.com
ServerAlias www.linuxprompt.com
ServerAdmin info@linuxprompt.com
<Directory /srv/www/linuxprompt.com>
AllowOverride Options FileInfo
DirectoryIndex index.php index.html index.htm
Options -Indexes FollowSymLinks
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /srv/ftp/0
ServerName ftp.linuxprompt.com
ServerAdmin info@linuxprompt.com
<Directory /srv/ftp/DOWNLOAD>
AllowOverride Options FileInfo
Options Indexes FollowSymLinks
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
#Dile göre yapılandirilmis v.hostlar
<VirtualHost *:80>
DocumentRoot /srv/www/linuxprompt.com/tr
ServerName tr.linuxprompt.com
ServerAlias tr.linuxprompt.com
ServerAlias tr.linuxprompt.com
ServerAdmin info@linuxprompt.com
<Directory /srv/www/linuxprompt.com/tr>
AllowOverride Options FileInfo
DirectoryIndex index.php index.html index.htm
Options -Indexes FollowSymLinks
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /srv/www/linuxprompt.com/fr
ServerName fr.linuxprompt.com
ServerAlias fr.linuxprompt.com
ServerAlias fr.linuxprompt.com
ServerAdmin info@linuxprompt.com
<Directory /srv/www/linuxprompt.com/fr>
AllowOverride Options FileInfo
DirectoryIndex index.php index.html index.htm
Options -Indexes FollowSymLinks
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /srv/www/linuxprompt.com/en
ServerName en.linuxprompt.com
ServerAlias en.linuxprompt.com
ServerAlias en.linuxprompt.com
ServerAdmin info@linuxprompt.com
<Directory /srv/www/linuxprompt.com/en>
AllowOverride Options FileInfo
DirectoryIndex index.php index.html index.htm
Options -Indexes FollowSymLinks
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /srv/www/linuxprompt.com/de
ServerName de.linuxprompt.com
ServerAlias de.linuxprompt.com
ServerAlias de.linuxprompt.com
ServerAdmin info@linuxprompt.com
<Directory /srv/www/linuxprompt.com/de>
AllowOverride Options FileInfo
DirectoryIndex index.php index.html index.htm
Options -Indexes FollowSymLinks
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /srv/www/linuxprompt.com/tr
ServerName ru.linuxprompt.com
ServerAlias ru.linuxprompt.com
ServerAlias ru.linuxprompt.com
ServerAdmin info@linuxprompt.com
<Directory /srv/www/linuxprompt.com/ru>
AllowOverride Options FileInfo
DirectoryIndex index.php index.html index.htm
Options -Indexes FollowSymLinks
Order allow,deny
Allow from all
</Directory>
</VirtualHost> |
|