Apache Yönergeleri
İçindekiler
- servername,-bu-sanal-konak-için,-internet-tarayıcısında-yazılan-sunucu-adıyla-(www.magmalinux.com gibi)-eşleşecek-ismi-belirler. www.magmalinux.com yerine-sadece-magmalinux.com-yazıldığı-zaman-da-bu-sanal-konağa-erişilebilmesi-için,-bir-de-serveralias-tanımladık.-documentroot-ise,-bu-sanal-konak-için-kök-dizinimizi-belirler-(yani http://www.magmalinux.com/ şeklinde-istekte-bulunulduğunda-yayınlanacak-içeriğin-bulunduğu-dizin).-bu-örneğimizde,-sanal-konaklarımızın-varsayılan-web-sitesinden-ayrı-olması-gerekçesiyle-/var/www-yerine-/srv/www/vhosts-dizinini-seçtik.dikkat!-bu-sanal-konağımızın-çalışabilmesi-için-dns-sunucusunda-magmalinux.com-alan-adı-için-gereken-ayarlamalar-yapılmış-olmalıdır-(yani www.magmalinux.com ve-magmalinux.com-adresleri-doğru-bilgisayarlara-işaret-etmelidir).-sanal-konak-dosyasında-yaptığınız-bu-ayarlar,-dns-ayarlarınızı-gerÇekleŞtİrmez.-dns-ayarlamaları-için-bakınız http://belgeler.magmalinux.org/bind/.Şimdi-kök-dizinimiz-olan-/srv/www/vhosts/www.magmalinux.com-için-bir-takım-ayarlar-yapalım.-İşletim-sistemindeki-dosya-sisteminin-bir-parçası-olan-dizinler-için-yapılan-ayarlar-
--etiketleri-arasında-bulunur.-Örneğin: servername www.magmalinux.comserveralias-magmalinux.comdocumentroot-"/srv/www/vhosts/www.magmalinux.com" options-indexes-followsymlinks-multiviewsallowoverride-noneorder-allow,denyallow-from-allgördüğünüz-üzere-/srv/www/vhosts/www.magmalinux.com-dizini-için- - -etiketleri-arasında-bazı-ayarlar-var.-sırayla-incelersek:options-indexes-followsymlinks-multiviews-satırı-bu-dizin-için-bir-kaç-seçeneği-aktif-etmiştir:indexes:-eğer-bu-dizin-içerisinde-directoryindex-yönergesinde-belirtilen-dosya-(varsayılan-index.html)-mevcut-değilse,-dizinin-içeriğini-gösteren-otomatik-bir-index-yaratılır-(mod_authindex-tarafından)-ve-istemciye-cevap-olarak-gönderilir.followsymlinks:-apache’ye-bir-sembolik-link-ile-karşılaştığı-zaman-bu-linki-takip-etmesini-söyler.multiviews:-diyelim-ki,-sunucunuzda-/srv/www/vhosts/www.magmalinux.com-altında-bir-ornek.php-dosyası-var-ve-siz-bu-dosyaya http://www.magmalinux.com/ornek seklinde-de-erismek-istiyorsunuz-(uzantıyı-belirtmeden).-multiviews-özelliği-mod_negotiation-modülünü-kullanarak-size-bu-desteği-sağlar-(dikkat!-sunucuya-http://www.magmalinux.com/ornek-dosyasının-isteği-geldiğinde,-istemcinin-http-isteğinde-gönderdiği-accept:-değerine-bakılarak,-ornek-dosyası-aranır.-yani-istemciniz-http-isteğini-gerçekleştirirken-accept:-değerine-sadece-text/html-girmiş-ise,-ornek-dosyasına-bakılırken,-sadece-ornek.html-aranacak-ve-ornek.php-bulunamayacak).yukarıdakilerin-dışında-options-yönergesine-belirtebileceğiniz-seçenekler:execcgi:-aktif-edildiği-dizin-içerisindeki-çalıştırılabilir-dosyaların,-mod_cgi-kullanılarak-çalıştırılması-sağlanır-(genelde-bu-seçenek,-cgi-bin-dizinleri-için-aktif-hale-getirilir).-İlerleyen-kısımlarda-cgi-kullanımı-açıklanacaktır.includes:-aktif-edildiği-dizin-içerisinde,-ssi-(server-side-include)-dosyaları-çalıştırabilmeye-izin-verir.-ssi,-apache-tarafından-sunulan-basit-bir-betik-dili-gibi-düşünülebilir.-bu-konu,-belgenin-ilerleyen-bölümlerinde-ayrıntılandırılacaktır.includesnoexec:-ssi-izni-verilir-fakat,-ssi-dosyaları-içerisinden-harici-bir-uygulama-çağrılması-yasaklanır.symlinksifownermatch:-followsymlinks-ile-benzerdir.-ancak,-sembolik-linkin-bulunduğu-dizinin-sahibi,-sembolik-linkin-gösterdiği-dosyanın-(ya-da-dizinin)-sahibi-ile-aynı-ise,-sunucu-sembolik-linki-takip-eder-(bu-özelliğin-açık-olması-durumunda,-apache-her-istek-geldiğinde-dizinin-ve-işaret-edilen-dosyanın-sahibi-kontrol-edileceği-için,-symlinksifownermatch-özelliği-sunucuyu-yavaşlatan-bir-özelliktir.-sembolik-linkleriniz-için-bu-güvenlik-gerekmiyorsa-followsymlinks-özelliğini-tercih-edin).tekrardan-/srv/www/vhosts/www.magmalinux.com-dizini-için-belirttiğimiz-seçeneklere-dönelim:allowoverride-none-seçeneği-ise,-hatırlandığı-üzere,-belirtilen-dizin-ve-alt-dizinleri-için-apache’nin-.htaccess-dosyasını-yorumlamasını-kapatır-(alt-dizin-için-başka-bir-allowoverride-belirtilene-kadar).order-allow,deny:-allow-ve-deny-talimatları-ile-anlamlıdır-(bu-örneğimizde-sadece-allow-from-all-talimatı-var).-İzin-sıralamasını-belirler.-sıralama-allow,deny-ya-da-deny,allow-olabilir.-eğer-genel-olarak-erişime-izin-vermek,-sadece-belli-durumlar-için-yasaklama-getirmek-istiyorsanız-allow,deny-sıralamasını;-ya-da-eğer-genel-olarak-erişimi-yasaklamak,-sadece-belli-durumlar-için-izin-vermek-istiyorsanız-deny,allow-sıralamasını-kullanın.allow-from-all:-allow-talimatı-dizine-erişimine-izin-verilecek-bilgisayarları-belirler.-İkinci-parametresi-daima-from-dur.-allow-from-all-herkese-izin-verir.-alan-adına-(ters-dns-sorgusu-gerektirir),-ip-adresine-ya-da-bir-çevresel-değişkenin-değerine-göre-erişim-iznini-ayarlayabilirsiniz.-ayrıntılarından-ilerleyen-kısımlarda-bahsedilecektir.dosyayı-inceledikten-sonra,-şimdi-sites-available-daki-bu-siteyi-işler-hale-getirmek-için#-a2ensite www.magmalinux.comkomutunu-kullanalım-(ya-da-elle,-sites-available-dizinindeki-magmalinux.com-dosyasına-sites-enabled-dizininden-sembolik-link-oluşturun).-a2ensite-komutuna-verdiğimiz-parametre,-sites-available-dizininde-oluşturduğumuz-dosyanın-ismi-olduğuna-dikkat-edin.-yapılan-değişikliklerin-etkili-olabilmesi-için-apache’yi-yeniden-başlatmalıyız:#-/etc/init.d/apache2-restart2.2.2 www.magmalinux.net alan-adı-için-sanal-konakaynı-apache-sunucusu-içerisinde-bir-de-magmalinux.net-alan-adı-için-hizmet-verelim-(tekrar-dikkat!-magmalinux.net-alan-adına-gelen-isteğin-apache’ye-ulaşabilmesi-için-öncelikle-dns-sunucunuz-bu-alan-adı-için-yapılandırılmış-olmalı).-yine-sites-available-dizini-altında www.magmalinux.net sanal-konağı-için-ayarların-duracağı www.magmalinux.net isminde-bir-dosya-oluşturalım-ve-içeriğini-aşağıdaki-gibi-dolduralım:servername www.magmalinux.netserveralias-magmalinux.netdocumentroot-"/srv/www/vhosts/www.magmalinux.net" options-indexes-followsymlinks-multiviewsallowoverride-noneorder-allow,denyallow-from-all servername-doc.magmalinux.netdocumentroot-"/srv/www/vhosts/doc.magmalinux.net" options-indexes-followsymlinks-multiviewsallowoverride-noneorder-allow,denyallow-from-allÖrnek-olması-açısından www.magmalinux.net dosyası-içerisinde www.magmalinux.net ve-doc.magmalinux.net-olmak-üzere-iki-tane-sanal-konak-tanımladık.-Şimdi www.magmalinux.net web-sitesini-aktif-hale-getirmek-için:#-a2ensite www.magmalinux.net#-/etc/init.d/apache2-restartkomutlarını-çalıştıralım.2.2.3-mod_vhost_aliasaynı-apache-http-sunucusu-altında-çok-fazla-web-sitesi-varsa,-her-biri-için-yukarıdaki-ayarları-yapmaktan-sıkılabilirsiniz.-Şimdi-bizi-bu-dertten-kurtaracak-olan-mod_vhost_alias-modülünü-inceleyelim.modülümüzü-etkinleştirmeden-önce-mods-available-dizini-altında-vhost_alias.conf-dosyası-oluşturalım.-bu-dosyanın-en-basit-içeriği-şu-şekilde-olabilir:usecanonicalname-offvirtualdocumentroot-/srv/www/vhosts/%0virtualdocumentroot-/srv/www/vhosts/%0-satırındaki-%0,-tam-alan-adını-belirtmektedir-(www.magmalinux.com,-doc.magmalinux.net-gibi).-eğer-istenirse-tam-alan-adının-belli-parçaları-da-kullanılabilir.-Örneğin-alan-adının-soldan-ikinci-parçası-(magmalinux)-belirtilmek-isteniyorsa-%2,-sağdan-1.-parçası-(com)-isteniyorsa-%-1-ya-da-sondan-2-kısım-(magmalinux.com)-isteniyorsa-%2+-kullanılabilir.dosyayı-kaydettikten-sonra-vhost_alias-modülünü-aktikleştirelim-ve-değişikliklerin-geçerli-olması-için-apache’yi-yeniden-başlatalım:#-a2enmod-vhost_alias#-/etc/init.d/apache2-restart2.3-apache-yapılandırma-dosyaları-söz-dizimiapache-yapılandırma-dosyalarında-html-elementlerine-benzer,-kendi-içerisinde-birden-fazla-yönerge-içeren-bazı-yönergeler-vardır-( - -gibi).-bu-tip-yönergelere-kap-(container)-denir.-Şimdi-bunlardan-bir-kaçını-inceleyelim.2.3.1-İşletim-sisteminin-dosya-sistemindeki-belli-bir-dizin-ve-onun-alt-dizinleri-için-yapılandırmaları-(yönergeleri)-tutar.-Örneğin: dizin-yolu-içerisinde-joker-karakterde-belirtebilirsiniz-(hatırlatma:-?-joker-karakteri-tek-bir-harf-eşleşmesi-için,-*-karakteri-herhangi-bir-karakter-dizisi-için,-[]-karakterleri-aralık-için-kullanılabilir.-yeri-gelmişken-’/’-karakteri-hiçbir-joker-karakteri-ile-eşleşmez).-Örneğin:options-followsymlinksallowoverride-none options-followsymlinksallowoverride-none2.3.2- directorymatch,-directory-ile-hemen-hemen-aynıdır.-directory’nin-sağladıklarının-yanında-düzenli-ifade-desteği-sağlar-(directory’yi-kullanarak- Örnekteki-düzenli-ifade,-www-ile-başlayan-com-ile-biten-dizinler-ile-eşleşecektir.2.3.3--şeklinde-düzenli-ifade-belirtebilsekte,-ve-bu-işlemin-yeni-yolu-directorymatch’tir).-bir-örnek-incelersek: options-followsymlinksallowoverride-none bazı-dosyalara-özel-yapılandırma-yapmak-için-kullanılır.-Örneğin: yukarıdaki-yapılandırma,-gizli.html-dosyasının-hangi-dizinde-olduğuna-bakılmaksızın,-bu-dosyaya-erişimi-engeller.-order-deny,allowdeny-from-all -şeklinde-belirtilse-bile,-dikkate-alınacak-kısım-yolun-son-parçası-olan-gizli.html-olduğu-için-yukarıdaki-örnekten-farkı-yoktur.-eğer-sadece-belli-bir-dizin-içerisindeki-gizli.html-dosyası-ile-ilgili-yapılandırma-yapmak-gerekirse,- -kabı,- 2.3.4--içerisinde-kullanılabilir.-Örneğin: order-deny,allowdeny-from-all filesmatch,-files-ile-benzer-olmasına-karşın,-dosya-ismi-içerisinde-düzenli-ifade-kullanabilmemizi-sağlar-( -ile-de- yukarıdaki-yapılandırma,-gelen-istekteki-referer-adresi-magmalinux.com-ya-da-magmalinux.net-değilse;-png,-jpeg-ve-png-dosyalarına-erişimi-yasaklar.2.3.5--şeklinde-düzenli-ifade-kullanabiliyor-olsakta,-düzenli-ifade-kullanmanın-yeni-yolu-filesmatch’tir).Örnek-bir-filesmatch-kullanımı-şöyle-olabilir: setenvifnocase-referer-"^http://.*.magmalinux.(com|net)"-local=1order-allow,denyallow-from-env=local directory’de-olduğu-gibi-dosya-sistemindeki-kök-dizinden-başlayan-dizinler-için-ayarlama-yapmak-yerine,-apache’nin-sunduğu-web-sitesinin-kök-dizininden-başlayan-dizinler-için-ayarlama-yapmak-istiyorsanız-location-kullanabilirsiniz.-kısaca-location-size,-apache’nin-sunduğu-web-sitesinin-kök-dizinini-taban-alıp,-buna-göreceli-dizinler-için-ayarlamalar-yapmanızı-sağlar.-Örneğin: yukarıdaki-yapılandırma,-işletim-sistemindeki-/-dizinin-altında-cgi-bin-dizini-değil,-apache’nin-sunduğu-web-sitesinin-kök-dizini-altındaki-cgi-bin-dizini-içindir.options-execcgi -benzeri,-düzenli-ifade-belirtebildiğimiz-bir-de- options-yönergesindeki-includes-seçeneğinin,-belirtilen-dizin-için-ssi-desteğini-aktifleştirdiğini-hatırlayınız.yaptığımız-değişikliklerden-sonra-apache’yi-yeniden-başlatalım:#-/etc/init.d/apache2-restartŞimdi-yazacağımız-ssi-dosyalarının-içeriğinden-kısaca-bahsedelim.-bir-ssi-dosyasının-html-dosyasından-hiç-bir-farkı-yoktur.-ssi-komutları-html-yorum-satırları-arasına-yazılır.-bir-ssi-komutunun-yapısı-şu-şekildedir:Örnek-bir-deneme.shtml-dosyası-yazıp,-/srv/www/vhosts/www.magmalinux.com/ssi/-dizinine-kopyalayalım:-vardır.-kullanım-şekli- -veya- -ile-aynıdır.2.3.6-optionssanal-konaklarımızı-ayarlarken-options-yönergesinden-bahsetmiştik.- -kabı-ile-bir-dizin-için-belirttiğimiz-özellikler,-alt-dizinlere-de-uygulandığından,-bir-dizin-için-birden-fazla-options-tanımlandığı-durum-oluşabilir.-Örneğin: options-indexes options-include-execcgiyukarıdaki-örnekte-/var/www/altdizin-için-kullandığımız-options-yönergesi,-üst-dizindeki-options-yönergesinin-üzerine-yazacak.-yani-/var/www/altdizin-için-indexes-seçeneği-aktif-olmayacak.-eğer-bir-dizin-için-options-yönergesinde-belirttiğimiz-seçeneklerden-birinin,-üst-dizindeki-ayarlamalara-eklenmesini-istiyorsak,-options-yönergesindeki-o-seçeneğin-başına-+-işareti-koymalıyız-(eğer-üst-dizindeki-ayarlamalardan-çıkarılmasını-istiyorsak-başına---işareti-koymalıyız).-Örneğin: options-indexes-multiviews options-+include-+execcgi--multiviews2.3.7-aliasbir-web-sitesinin-kök-dizini-ağacının-içerisinde-bulunmayan-bir-dizini-kök-dizininin-içerisine-dahil-etmeye-yarar.-aslında-temelde-yaptığı-şey,-dosya-sistemi-içerisindeki-bir-dizin-için-web-sitesi-üzerinde-bir-takma-ad-tanımlamaktır.-Örneğin:alias-/doc-/usr/share/docyukarıdaki-tanımı-sites-available/www.magmalinux.com-dosyası-içerisinde- --kapları-arasında-yaptığımızda,-istemci-http://www.magmalinux.com/doc-içeriğini-istediği-zaman,-cevap-olarak /usr/share/doc içeriği-gönderilir.alias-kullanırken-dizin-adreslerinin-sonunda-/-karakteri-olup-olmamasına-dikkat-edin.-eğeralias-/doc/-/usr/share/docbiçiminde-kullanılmış-olsaydı,-bu-alias http://www.magmalinux.com/doc isteği-için-geçerli-olmazdı.-alias-tanımında-/doc-kısmında-sona-/-koymadığımızda,-alias-hem-/doc-hem-de-/doc/-için-geçerli-olur.2.3.8-aliasmatchyaptığı-iş-alias-ile-aynıdır.-takma-ad-için-düzenli-ifadeleri-destekler.-Örneğin:aliasmatch-^/doc-(.*)-/usr/share/doc/http://www.magmalinux.com/doc-apache2 adresine-istek-gelmiş-ise,-bu-istek-tanımladığımız-alias-ile-eşlecek-ve-kullanıcıya-/usr/share/doc/apache2-içeriği-gösterilecek-(alias-tanımındaki-,-parantez-içindeki-düzenli-ifade-ile-eşleşen-metni-verir).2.3.9-redirectbelirlenen-bir-dosya-(ya-da-dizin)-istendiğinde-istemciyi-başka-bir-adrese-yönlendirmeye-yarar.-Örneğin:redirect-/doc http://doc.magmalinux.net/ana-apache-ayar-dosyalarında,- ,- bu-dosya-da-bizim-için-önemli-olan-sslengine-ve-sslcertificatefile-yönergeleri.-adlarından-da-anlaşılacağı-üzere-sslengine-yönergesi,-bu-web-sitesi-için-ssl’i-aktif-ederken,-sslcertificatefile-yönergesi-de-sertifika-dosyasının-yolunu-belirtir.son-olarak-ports.conf-dosyamıza,-apache’ye,-http-üzerinden-ssl-bağlantısı-için-kullanılan-varsayılan-443-numaralı-portu-dinlemesini-söylüyoruz.-Örnek-ports.conf-dosyamız:listen-80listen-443şeklinde-olabilir.-bütün-bu-işlemler-bittikten-sonra,-değişikliklerin-geçerli-olabilmesi-için,-apache’yi-yeniden-başlatalım:#-/etc/init.d/apache2-restart2.5-dinamik-İçerikli-web-sayfalarıtemelde-web-sunucusu,-istemciden-gelen-isteklere-göre,-sunucuda-bulunan-bir-dosyayı-istemciye-gönderirken,-bu-dosya-içerisinde-hiç-bir-değişiklik-yapmaz.-dosya-içeriklerinin-statik-olduğu-bu-durumda,-çeşitli-kullanıcılara-özel-ya-da-çeşitli-durumlara-özel,-dinamik-içerik-oluşturmak-söz-konusu-olamaz.-bu-durum-web’in-kullanımı-için-büyük-bir-kısıtlamadır.2.5.1-ssissi-(server-side-include---sunucu-taraflı-İçerik)-dosyaları,-sunucu-tarafında-dinamik-içerik-oluşturmanın-en-ilkel-yoludur.-ssi-kullanılarak-bir-html-dosyasına-alt-ve-üst-bilgi,-sunucudaki-bir-uygulamanın-çıktısı,-çevresel-değişkenlere-erişim-gibi-bir-takım-ilkel-dinamik-içerik-oluşturulabilir.-ssi-dosyalarının-varsayılan-uzantısı-.shtml-dir-(tabi-uygun-bir-yapılandırılma-ile-başka-bir-uzantı-da-kullanılabilir).apache’nin-ssi-desteğini-açmak-için-öncelikle-mod_include-modülünü-aktif-edelim:#-a2enmod-includedaha-sonra-web-sitemiz-içerisinde-bir-dizin-oluşturup,-bu-dizin-içerisinde-ssi-dosyalarının-işlenmesine-izin-verelim.-bu-örnek-için www.magmalinux.com web-sitesini-seçelim.-İlk-olarak-ssi-dizinimizi-oluşturalım:#-mkdir-/srv/www/vhosts/www.magmalinux.com/ssiŞimdi-sites-available/www.magmalinux.com-dosyasını-açıp--etiketleri-içerisinde-ya-da-.htaccess-dosyasında-belirtilebilir.2.3.10-redirectmatchredirect-ile-aynı-olmasının-yanında,-düzenli-ifadeleri-destekler.-debian-standart-varsayılan-web-sayfasındaki-(sites-available/default)-örneğe-bakalım:redirectmatch-^/$-/apache2-default/2.4-apache-sslapache-ssl-servisimiz-için-ilk-olarak-sertifika-oluşturmamız-gerekiyor.-eğer-elinizde-satın-aldığınız-hazır-sertifika-varsa-bu-aşamayı-atlayabilirsiniz.-biz-bu-örneğimizde,-openssl-yazılımıyla-10-yıl-boyunca-geçerli-olacak-bir-sertifika-oluşturacağız:#-openssl-req--new--x509--days-3650--nodes--out-apache.pem--keyout-apache.pemkomutunu-çalıştırdığımızda-karşımıza-sertifikamız-için-bir-takım-sorular-gelecek.-bu-sorulardan-bizim-için-en-önemli-olanları,-passphrase-ve-commonname.-passphrase,-sertifikamız-için-gireceğimiz-parola-(passphrase’in-password’den-farkı,-daha-uzun-olabilmesiydi.-eski-unix’lerde-password’ün-en-fazla-8-karakter-olduğundan,-8-karakterden-uzun-parolalara-pashphrase-deniyordu),-commonname-ise-web-sitemize-erişilirken-girilen-alan-adı-bilgisi-olacak-(Örneğin www.magmalinux.com).Şimdi-oluşan-apache.pem-dosyasını-(ya-da-satın-aldığımız-sertifikayı)-/etc/apache2/-dizinine-kopyalayalım-(apache.pem-dosyasını-/etc/apache2-dizinine-kopyalamak-gibi-bir-zorunluluk-bulunmamaktadır.-biz-sadece-örnek-olarak-bu-dizini-seçtik.-farklı-bir-dizin-kullanırsanız,-ilerleyen-kısımlardaki-ayar-dosyalarını-kendinize-göre-değiştirmeniz-gerekecek).sıra,-bu-ssl-sertifikasının-kullanılacağı-web-sitesini-yaratma-kısmına-geldi.-bunun-için-sanal-konaklar-kısmında-edindiğimiz-bilgileri-hatırlayalım.-Önce-sites-available-dizini-altında-bir-dosya-oluşturup-(örneğin www.magmalinux.com-ssl),-içini-aşağıdakine-benzer-bir-biçimde-dolduralım:namevirtualhost-*:443 servername www.magmalinux.comsslengine-onsslcertificatefile-/etc/apache2/apache.pemdocumentroot-/srv/www/www.magmalinux.com#-...#-... --kapları-arasına-aşağıdakileri-girelim: options-+includes orta- include-komutu-başka-bir-dosyayı-dahil-eder.-exec-ise-.shtml-dosyası-içerisinden-harici-bir-uygulama-çalıştırıp,-uygulamanın-çıktısını-bu-.shtml-dosyasına-yazar.-exec-komutunun-sonucu-olarak,-sunucu-tarafında-çalışan-bir-uygulamanın-çıktısı-istemciye-gönderilmiş-olur.bir-başka-komut-olan-echo-belli-bir-çevresel-değişkenin-değerini-almada-kullanılır.-Örnek-kullanımı:ssi-dosyaları-içerisinde-basit-if-else-ifadeleri-de-kullanabilirsiniz.-biz-bu-belge-de-bunun-ayrıntısına-girmeyeceğiz.-ssi-hakkında-daha-ayrıntılı-bilgi-almak-için, mod_include---apache-http-server adresine-bakınız.2.5.2-cgicgi-(common-gateway-interface---ortak-geçit-arayüzü)-bize,-sunucu-tarafında-uygulama-çalıştırıp,-bu-uygulamanın-çıktısının-istemciye-gönderilmesini-ve-istemciden-bu-uygulamaya-bir-takım-verilerin-aktarılmasını-sağlar.-bu-bize,-kullanıcıya-göre-dinamik-içerik-oluşturmayı-sağlar.cgi’ın-ilk-günlerinde,-cgi-kelimesinin-her-geçtiği-yerde-perl-kelimesini-görsekte;-cgi’ın-perl-dili-ile-pek-bir-alakası-yoktur.-cgi-bize,-istemciden-gelen-bir-takım-bilgilerin-sunucu-tarafındaki-harici-bir-uygulamaya-aktarılıp,-bu-uygulamanın-ürettiği-çıktının-istemciye-geri-gönderilmesini-sağlar.-sunucu-tarafında-çalışacak,-web-üzerinden-gelen-isteklere-göre-davranacak-harici-uygulama-yazılırken,-yoğunlukla-perl-dili-kullanıldı.-sunucu-tarafında-çalıştırdığımız-bu-harici-uygulama-perl-dışında-herhangi-bir-betik-dili-olabileceği-gibi-(php,-python,-ruby-...),-c-ile-yazılıp-derlenmiş-bir-uygulama-da-olabilir-(zaten-bir-betik-dilini-çalıştırabiliyorsanız,-bu-betik-dilini-yorumlayacak-olan-uygulama-makina-koduna-dönüştürülmüş-bir-uygulama-olacağından;-direk-makina-koduna-dönüştürülmüş-bir-uygulamayı-da-çalıştırabilmek-şaşırtıcı-bir-durum-değil).günümüzde,-cgi’ın-tarihe-gömüldüğü-gibi-bir-yanlış-anlayış-vardır.-cgi’ın-hızı-php-ve-java-dillerinde-yazılan-web-uygulamaları-ile-karşılaştırılır.-cgi’ın-sunucu-tarafında-çalıştırdığı-uygulama-bir-php-ya-da-java-uygulaması-da-olabilir.-aslında-cgi-içerisinde,-herhangi-bir-dilde-yazılmış-bir-uygulamayı-çalıştırmak-ile-php-web-uygulamasını-çalıştırmak-arasındaki-tek-fark,-apache-sunucusunda-php-programlarına-gelen-her-istek-için-ayrı-bir-php-yorumlayıcısı-çalıştırılmasını-önleyen-mod_php-modülüdür.-bu-sayede,-aşırı-istek-alan-bir-web-sunucusu-her-cgi-isteği-için-ayrı-bir-php-süreci-başlatmayacağından,-sunucunun-belleği-daha-etkin-kullanılmış-olur.Şimdi-sunucuda-çalışacak-harici-programlarımızın-bulunacağı-dizin-için-gerekli-apache-ayarlarını-yapalım.-bunu-sağlamanın-iki-yolu-var.birinci-yol:birinci-yol-için www.magmalinux.com web-sitemizi-kullanalım.-Öncelikle-cgi-uygulamalarının-bulunacağı-dizini-oluşturalım:#-mkdir-/srv/www/vhosts/www.magmalinux.com/cgi-bindizinin-ismini-cgi-bin-olarak-belirtmek-zorunda-değilsiniz.-biz-geleneklere-bağlı-kalarak-bu-ismi-seçtik.-Şimdi-sites-available/www.magmalinux.com-dosyamızı-açıp- --kapları-arasında-herhangi-bir-yere-aşağıdakileri-girelim:serveralias-/cgi-bin/-/srv/www/vhosts/www.magmalinux.com/cgi-bin/serveralias,-alias’a-benzer-biçimde-davranır.-farkı-ise,-apache-serveralias’ta-belirtilen-dizin-içindekilerin-hepsini-çalıştırılabilir-dosya-olarak-düşünür.-bu-dizindeki-herhangi-bir-dosyaya-bir-istek-geldiğinde,-apache-bu-dosyayı-çalıştırmayı-dener.İkinci-yol:İkinci-yol-için www.magmalinux.net sayfamızı-kullanalım.-İlk-olarak, www.magmalinux.net sitemizin-kök-dizininde-cgi-bin-dizinimizi-oluşturalım:#-mkdir-/srv/www/vhosts/www.magmalinux.net/cgi-binardından,-sites-available/www.magmalinux.net-dosyamızda,- --kapları-arasına-aşağıdakileri-ekleyelim:addhandler-cgi-script-.pl-.cgi-.rb options-+execcgiaddhandler-yönergesi,-apache’ye-.pl,-.cgi-ve-.rb-uzantılı-dosyaları-cgi-scripti-olarak-ele-almasını-söyler.Şimdi-seçtiğimiz-bu-iki-yöntemi-de-test-etmek-için,-bir-betik-oluşturup-hem-magmalinux.com’un-cgi-bin-dizinine-hem-de-magmalinux.net’in-cgi-bin-dizinine-atalım.-aşağıda-ruby-dilinde-yazılmış-örnek-bir-betik-var,-deneme.rb-isminde-kaydedip-bahsettiğimiz-cgi-bin-dizinlerine-kopyalayın:#!/usr/bin/rubyprint-"content-type:-text/html;nn"print-"cgi-deneme"test-için-tarayıcınızla http://www.magmalinux.com/cgi-bin/deneme.rb ve http://www.magmalinux.net/cgi-bin/deneme.rb sayfalarını-ziyaret-edin.2.6-Çok-kullanılan-apache-modülleri2.6.1-mod_userdirmod_userdir,-apache’nin-yüklü-olduğu-sunucudaki-sistem-kullanıcılarının,-kendi-ev-(home)-dizinlerindeki-dosyaları-apache-üzerinden-yayınlayabilmesini-sağlar.mod_userdir-modülünü-aktif-edelim:#-a2enmod-userdirdiyelim-ki,-apache’nin-yüklü-sistemimizde,-dogan-isminde-ev-dizini-/home/dogan-olan-bir-kullanıcı-var.-bu-kullanıcının-ev-dizini-içerisinde-bir-public_html-dizini-oluşturalım-(dogan-kullanıcısının-ev-dizininde-işlem-yaptığınızdan-bu-işlemi-dogan-kullanıcısı-iken-yapın):$-mkdir-/home/dogan/public_htmlŞimdi-bu-dizine-bir-kaç-dosya-kopyalayıp,-tarayıcımızla http://www.magmalinux.com/~dogan/ sayfasını-ziyaret-edelim.mod_userdir-ile-ilgili-ayarlama-yapmak-istiyorsanız-(dizin-için-public_html-yerine-başka-bir-isim-kullanmak-gibi)-/etc/apache2/mods-available/userdir.conf-dosyasını-düzenleyin.-varsayılan-ayarlarıyla-userdir.conf-dosyası-aşağıdakine-benzer-bir-biçimdedir: userdir-public_htmluserdir-disabled-root allowoverride-fileinfo-authconfig-limitoptions-multiviews-indexes-symlinksifownermatch - -içerisindeki-ilk-satır,-userdir-public_html,-yayınlanmak-üzere-kullanıcıların-ev-dizinininde-aranacak-dizinin-ismini-belirtir-(bu-adı-değiştirdiğiniz-taktirde,-takip-eden-satırlardaki--yönergesini-de-uygun-şekilde-değiştirin).-bu-satırda-boşluklarla-ayrılmış-birden-fazla-dizin-ya-da-uri-belirtebilirsiniz.-apache,-bir-istek-geldiğinde-belirttiğiniz-sıra-ile-aramaya-başlayacak.mod_userdir-modülünü-belirli-kullanıcılar-için-kapatmak-istiyorsanız-(yukarıdaki-örnekte-olduğu-gibi),userdir-disabled-root-ahmet-mehmetşeklinde-boşluklarla-ayırarak-belirtebilirsiniz.-ya-da-mod_userdir-modülünü-sadece-belli-kullanıcıların-kullanabilmesini-istiyorsanız:userdir-disableduserdir-enabled-dogan-enesşeklinde-kullanabilirsiniz.2.6.2-mod_rewritemod_rewrite-modülü,-istekte-bulunulan-url’yi-düzenli-ifadeler-ile-karşılaştırıp-oldukça-esnek-yönlendirme-kuralları-tanımlamamızı-sağlar.mod_rewrite’ı-aktif-edelim:#-a2enmod-rewritedeneylerimizi www.magmalinux.com sitesi-üzerinde-yapalım.-bunun-için-sites-available/www.magmalinux.com-dosyamızı-açıp,-rewrite-modülümüzü-bu-site-için-aktif-hale-getiriyoruz.-aşağıdaki-satırı- --etiketleri-arasına-ekleyelim:rewriteengine-ontest-için-yukarıda-yazdığımız-satırın-altına,-aşağıdaki-kuralları-ekleyelim:rewriterule-^/ping*-/pong-[r]rewriterule-^/user/(.*)$-/index.php?user=İlk-kuralımız, http://www.magmalinux.com/ping adresi-isteklerini, http://www.magmalinux.com/pong adresine-yönlendirecek.-sonraki-[r]-bayrağı,-bu-işlemin-istemci-tarafında-yapılacağını-belirtir.-yani-istemci http://www.magmalinux.com/ping adresini-istediği-zaman,-apache-cevap-olarak-bu-sayfanın-taşındığını-(302-moved)-ve-taşındığı-adresi-(http://www.magmalinux.com/pong)-söyler.-tarayıcı-da-buna-göre-yeni-adrese-gider.İkinci-satırdaki-örnek-ise http://www.magmalinux.com/user/dogan gibi-bir-isteği http://www.magmalinux.com/index.php?user=dogan a-dönüştürür-(ikinci-satırdaki-,-parantez-içindeki-düzenli-ifade-ile-eşleşecek-metin-ile-yer-değiştirir.-birden-fazla-parantez-ile-gruplanmış-düzenli-ifadeniz-varsa,-bunlarla-eşleşen-metinleri,-düzenli-ifadedeki-sıralarıyla-,-,-...-referanslarını-kullanarak-elde-edebilirsiniz.-ayrıntılı-bilgi-için,-bir-düzenli-ifadeler-kaynağına-başvurun).-bu-tip-yönlendirmeleri-kullanarak,-web-uygulamalarınız-için-çok-daha-temiz-görünen-uri’ler-tanımlayabilirsiniz.mod_rewrite’ı-kullanırken-logları-takip-etmek-faydalı-olabilir.-mod_rewrite-logları-için-log-dosyasını-ve-log-seviyesini-aşağıdaki-gibi-ayarlayabiliriz-(ana-ayar-dosyaları-ya-da- -etiketi-içerisinde):rewritelog-"/var/log/apache2/rewrite_log"rewriteloglevel-32.7-apache-Çoklu-süreç-modülleri-(multi-processing-module---mpm)apache-mpm’ler,-apache’nin-aynı-anda-birden-fazla-isteği-sunucu-tarafında-nasıl-gerçekleştireceği-ile-ilgili-yöntemler-sağlar.-her-yeni-gelen-için-ayrı-bir-süreç-mi-(process)-ya-da-ayrı-bir-thread-mi-başlatılacağı-kullanılan-mpm’e-bağlıdır.2.7.1-mpm-preforkprefork-mpm’i,-apache-1.3’te-olduğu-gibi,-her-gelen-istek-için-ayrı-bir-süreç-yaratır.-bu-yüzden-diğerlerine-göre-yavaş-olsa-da,-bu-mpm’in-avantajı-kararlılıktır.-her-gelen-isteği-ayrı-bir-süreç-cevapladığından,-istekler-birbirinden-iyi-bir-şekilde-yalıtılmıştır.-bu-yüzden-herhangi-bir-istekteki-sorun,-bir-diğer-isteği-etkilemeyecektir.-uygulamalarında-thread-safe-olmayan-kütüphaneler-kullanan-web-siteleri-için-uygundur.-ayrıca,-php-uygulamaları-yayını-yapacaksanız,-prefork-mpm’ini-kullanmalısınız.apache2.conf-dosyasındaki-prefork-mpm’inin-ayarlarına-göz-atalım: startservers-5minspareservers-5maxspareservers-10maxclients-150maxrequestsperchild-0startservers:-apache’nin-başlatılması-sırasında-oluşturulacak-çocuk-süreç-sayısını-belirler.minspareservers:-herhangi-bir-anda-gelebilecek-isteklere-karşı-hazır,-boşta-bulunan-minimum-çocuk-süreç-sayısını-belirler.-bu-sayıdan-az-boşta-bekleyen-çocuk-süreç-olduğu-durumda,-apache-ana-süreci-boşta-beklemesi-için-yeni-çocuk-süreçler-yaratır.maxspareservers:-herhangi-bir-anda-gelebilecek-isteklere-karşı-hazır,-boşta-bulunan-maximum-çocuk-süreç-sayısını-belirler.-bu-sayıdan-fazla-boşta-bekleyen-çocuk-süreç-olduğu-durumda,-apache-ana-süreci-fazla-olan-süreçleri-öldürür.maxclients:-aynı-anda-hizmet-verilecek-istek-sayısını-belirler.-bu-sayıdan-fazla-istek-geldiğinde,-bu-istekler-kuyruğa-alınır-(kuyrukta-bekletilecek-maksimum-istek-sayısını-listenbacklog-yönergesi-ile-ayarlayabilirsiniz).maxrequestsperchild:-tek-bir-çocuk-sürecin-ömrü-boyunca-cevap-verebileceği-maksimum-istek-sayısını-belirler.-0-değeri-sınırsız-anlamına-gelir.2.7.2-mpm-workermelez-yapıya-sahip-bir-mpm’dir.-her-gelen-istek-için-thread-kullanmasının-sağladığı-hız-ve-hafızanın-etkin-kullanımı-yanında,-çoklu-süreç-yapısı-sayesinde-kararlılığını-korur.-her-süreç,-isteklere-cevap-veren-birden-fazla-threade-sahiptir.-Özellikle-yüksek-trafiğe-sahip-sunucularda-kullanılması-tavsiye-edilir.-ayrıca,-debian’da-varsayılan-mpm’dir.apache2.conf-dosyasındaki-worker-mpm’inin-ayarlarına-göz-atalım: startservers-2maxclients-150minsparethreads-25maxsparethreads-75threadsperchild-25maxrequestsperchild-0startservers:-apache’nin-başlatılması-sırasında-oluşturulacak-çocuk-süreç-sayısını-belirler.-bu-süreçlerden-her-biri-threadsperchild-yönergesinde-belirtilen-kadar-threade-sahip-olacaktır.maxclients:-aynı-anda-hizmet-verilecek-istek-sayısını-belirler.-bu-sayıdan-fazla-istek-geldiğinde,-bu-istekler-kuyruğa-alınır.minsparethreads:-bütün-süreçlerdeki-toplam,-minimum-boştaki-thread-sayısını-belirler-(her-sürecin-sahip-olması-gereken-boştaki-minimum-thread-sayısını-değil).-bu-sayıdan-az-boşta-bekleyen-thread-olduğu-durumda,-apache-bu-sayıya-ulaşana-kadar-yeni-süreçler-yaratır.maxsparethreads:-minsparethreads’e-benzer-şekilde,-boştaki-maksimum-thread-sayısını-belirler.threadsperchild:-süreç-başına-yaratılacak-thread-sayısını-belirler yönergeler allowoverride-yönergesi allowoverride-yönergesi,- ,- -veya- -bölümlerinde-değil,-sadece-düzenli-ifade-içermeyen- -bölümlerinde-geçerlidir. yönergeye-değer-olarak none belirtilirse-.htaccess-dosyaları-tamamen-yok-sayılır.-bu-durumda,-sunucu-dosya-sisteminde-rastladığı-.htaccess-dosyalarını-okumaya-dahi-çalışmayacaktır. -bu-yönergeye-all-değeri-atanırsa,-.htaccess-bağlamında-kullanılabilecek-her-yönergeye-.htaccess-dosyalarında-izin-verilir. İki-sebepten-ötürü-htaccess-dosyalarına-izin-vermek-istemeyebilirsiniz: birinci-neden,-size-kaybettireceği-performanstır.-apache-bir-dizinde-.htaccess-dosyası-olmasa-bile,-bu-dosyanın-var-olup-olmadığını-kontrol-ederken-vakit-harcayacaktır-ve-her-istek-geldiğinde-bu-dosyanın-içeriği-tekrardan-okunacaktır.-ayrıca-apache,-.htaccess-desteği-verilmiş-bütün-üst-dizinlerdeki-htaccess-dosyalarını-kontrol-edecektir-(Örneğin-/var/www/doc/-dizininin-içindeki-bir-dosyaya-istekte-bulunulduğunu-ve-/-dizinin-bile-.htaccess-desteği-olduğunu-düşünelim.-apache-sırasıyla-/.htaccess,-/var/.htaccess,-/var/www/.htaccess,-ve-/var/www/doc/.htaccess-dosyalarını-okuyacaktır). İkinci-neden-ise,-.htaccess-dosyası-içerisinde-gereğinden-fazla-yetki-verdiğinizde-(allowoverride-all-gibi)-oluşabilecek-güvenlik-sorunlarıdır. ">Apache Yönergeleri Apache konfigrasyon dosyaları için gerekli yönergeler Apache yapılandırma dosyası (apache2.conf) düzen açısından birden fazla dosyaya bölünmüştür. Kabaca bu dosyalara göz atalım: /etc/apache2/httpd.conf Bu dosya boş gelir. Apache yöneticisinin ayarlarını tanımladığı dosyadır. Bu dosyanın içeriği ana apache yapılandırma dosyasına (apache2.conf) dahil edilecektir. Yani bu dosyaya yazılan her şey apache2.conf dosyasına yazılmış gibi davranılır. Bu yüzden, sistem yöneticilerinin apache2.conf yerine bu dosyayı değiştirmeleri tercih edilir. /etc/apache2/apache2.conf Apache 2 ana yapılandırma dosyasıdır. Apache servisi sürecinin temel ayarları, genel Apache ayarları, log ayarları gibi ayarları barındırır. Ayrıca parçalara bölünmüş bütün apache ayar dosyaları bu dosya içerisine aşağıdaki yönergeler vasıtasıyla dahil edilir: # Include module configuration:Include /etc/apache2/mods-enabled/*.loadInclude /etc/apache2/mods-enabled/*.conf# Include all the user configurations:Include /etc/apache2/httpd.conf# Include ports listingInclude /etc/apache2/ports.conf# Include generic snippets of statementsInclude /etc/apache2/conf.d/# Include the virtual host configurations:Include /etc/apache2/sites-enabled/ /etc/apache2/ports.conf Dinlenen portların ayarlandığı dosyadır. /etc/apache2/conf.d/ Yukarıda bahsedilen durumlar dışında bazı özel durumlara özgü ayarların ayrı ayrı dosyalar halinde tutulduğu dizindir. Bu dizin içindeki bütün dosyalar apache2.conf dosyasına dahil edilir. /etc/apache2/mods-enabled/ Aktif edilen Apache modülleri ayar dosyalarının bulunduğu dizindir. Aslında bu ayar dosyaları /etc/apache2/mods-available/ dizininde durur. mods-enabled dizinindeki dosyalar gerçekte mods-available dizinindekilere birer sembolik linktir. Bir Apache modülünü kaldırmak için ilgili modülün mods-enabled dizinindeki sembolik linkini silebilir ve bir Apache modülünü aktif hale getirmek için mods-enabled dizininden mods-available dizini içerisindeki ilgili modülün dosyalarına sembolik link oluşturabilirsiniz. /etc/apache2/sites-enabled/ Aktif edilen Apache siteleri (sanal konak - virtual host) ayarlarının bulunduğu dizindir. mods-enabled dizinine benzer şekilde, sites-enabled dizinindeki dosyalar /etc/apache2/sites-available dizininde ilgili yerlere birer sembolik linktir. a2ensite ve a2dissite araçlarıyla sırasıyla bir siteyi faal hale getirebilir veya bir siteyi kaldırabilirsiniz. .htaccess Bu dosya, içinde bulunduğu dizin için geçerli olacak Apache ayarlarını tanımlar. Yani ana Apache ayar dosyasını değiştirmeden, web yöneticilerinin kendine ait dizinlerinin ayarlarını özelleştirebilmelerini sağlar. En son okunacak ayar dosyası olduğu için diğerlerinden baskındır ve bu dosyadaki değişikliklerin etkili olabilmesi için Apache’yi yeniden başlatmaya gerek yoktur. Ana Apache ayar dosyalarında AllowOverride None seçeneği ile .htaccess dosyaları etkisiz hale getirilebilir. 2.1 Debian Ön Tanımlı Yapılandırma Dosyalarının İncelenmesi2.1.1 apache2.confapache2.conf dosyasının ana Apache ayar dosyası olduğundan bahsetmiştik. Apache servisi ile ilgili genel ayarların bulunduğu bu dosyaya biraz daha yakından bakalım:KeepAlive OnMaxKeepAliveRequests 100KeepAliveTimeout 15User www-dataGroup www-dataAccessFileName .htaccessHostnameLookups OffKeepAlive yönergesi, kalıcı bağlantı özelliğini açıp kapatır. Aynı bağlantı üzerinden çok sayıda isteğin gönderilebilmesine izin vermek istiyorsak değeri On olmalı.MaxKeepAliveRequest yönergesi, KeepAlive seçeneği açık iken, bağlantı başına kabul edilecek istek sayısını belirler. 0 değeri sonsuz anlamındadır. Yüksek performans (başarım) için yüksek değerler vermeniz tavsiye edilir.KeepAliveTimeout yönergesi, sunucu kalıcı bir bağlantıyı kapatmadan önce, bir sonraki isteği kaç saniye bekleyeceğini belirler.User ve Group yönergeleri Apache sürecini çalıştıracak kullanıcıyı ve grubu belirler. Seçtiğiniz kullanıcı ve grup, Apache’nin ilgilendiği dizinler üzerinde gerekli haklara sahip olmalıdır. Genellikle varsayılan değerleri değiştirmenize gerek yoktur.AccessFileName yönergesi, meşhur .htaccess dosyası için farklı bir isim belirlemeye yarar.HostnameLookups yönergesi, istemcinin IP adresinin DNS sistemi içerisinde tersine sorgulanıp alan adının bulunması isteniyorsa, On yapılmalıdır. İstemcinin adına (hostname) ihtiyaç duymayan sitelerde ağ trafiğini yormamak düşüncesi ile varsayılan değeri Off tur. Değeri On ise, bulunan ad, CGI çevre değişkenlerinden REMOTE_HOST’a aktarılır. Bir diğer değer olan Double ise IP adresini tersine sorguladıktan sonra, elde ettiği adı bir kez daha DNS sistemi içerisinde sorgular ve sonuçta elde edilen IP adresi istemcininkine eşit olup olmadığı kontrol edilir.Eğer ayar dosyalarınızda Allow from Ceren Bilgisayar şeklinde alan adına göre erişim denetimi yapıyorsanız, HostnameLookups ayarının değerine bakılmaksızın çift yönlü (Double) DNS sorgusu yapılır.HostnameLookups ve alan adına göre erişim denetimi gibi DNS sorgusu gerektiren işlemler, Apache’yi oldukça yavaşlatır. Bu yüzden, bu seçenekler gerçekten gerekiyorsa kullanılmalıdır.ErrorLog yönergesi, hata loglarının hangi dosyaya yazılacağını belirler. Varsayılan /var/log/apache2/error.log dur.LogLevel yönergesi, log seviyesini belirler. Hata ayıklama, test, ürün ortamınıza göre değiştirmeniz gerekebilir.Ayar dosyalarındaki diğer yönergeler için daha ayrıntılı bilgiyi http://httpd.apache.org/docs/2.2/mod/quickreference.html adresinde bulabilirsiniz.2.1.2 ports.confApache’nin gelen istekler için dinleyeceği portların belirlendiği dosya. Varsayılan olarak içeriği genelde tek satırdan oluşur:Listen 80Listen yönergesi, Apache’nin dinleyeceği IP adresi ve portu belirler (Listen IPv4ort ya da Listen [IPv6]ort şeklinde belirtilebilir. IPv6 adresleri belirtilirken etrafına [] karakterleri konur). Eğer IP adresi belirtilmemişse, tüm arabirimlerin belirtilen portu dinlenecektir.Birden fazla Listen yönergesine sahip olabilirsiniz (En az bir tane olmalı). Bu durumda Apache belirtilen portların (belirtilmişse IP’lerin) hepsini dinleyecektir. Örneğin ports.conf dosyanız şu şekilde olabilir:Listen 80Listen 81Örneğin SSL bağlantıları için Apache’den 443 nolu portu dinlemesini isteyebilirsiniz:Listen 80Listen 443Ya da sadece mod_ssl modülü yüklenmişse bu portu dinlemesini isteyebilirsiniz:Listen 80 Listen 443 Varsayılan durumda mod_ssl aktif değilse, aktif hale getirmek için a2enmod ssl komutunu kullanın.etiketi içerisindeki yönergeler, modul_adi modülü yüklenmiş ise gerçekleştirilir.2.2 Sanal Konaklar (Virtual Hosts)Tek bir Apache HTTP sunucusunun, birden fazla web sitesine ayrı ayrı hizmet vermesini sağlayabiliriz. Örneğin magmalinux.com, magmalinux.net ve cerenbilgisayar.com.tr web siteleri birbirinden bağımsız bir şekilde aynı Apache sunucusu altında çalışabilir.Her bir sanal konak için Apache sites-available dizini altında, bir dosya oluşturup ilgili sanal konak ayarlarını yapmak gerekir (Sanal konakların çalışabilmesi için istemcinin HTTP 1.1 protokolünü kullanıyor olması gerekir. Ayrıca alan adlarının ilgili DNS ayarlarını da yapmış olmalısınız).2.2.1 www.magmalinux.com Alan adı için Sanal KonakÖncelikle sites-available dizini içerisinde bir dosya oluşturup sanal konak tanımımızı bu dosya içinde yapalım. Sanak konak ayarlarının bulunacağı bu dosyaya istediğimiz ismi verebilsekte, anlaşılabilirlik ve düzen açısından dosyamıza www.magmalinux.com ismini verelim. www.magmalinux.com sanal konağı için temel ayarlarımız şu şekilde: ServerName www.magmalinux.comServerAlias magmalinux.comDocumentRoot "/srv/www/vhosts/www.magmalinux.com" ServerName, bu sanal konak için, internet tarayıcısında yazılan sunucu adıyla (www.magmalinux.com gibi) eşleşecek ismi belirler. www.magmalinux.com yerine sadece magmalinux.com yazıldığı zaman da bu sanal konağa erişilebilmesi için, bir de ServerAlias tanımladık. DocumentRoot ise, bu sanal konak için kök dizinimizi belirler (Yani http://www.magmalinux.com/ şeklinde istekte bulunulduğunda yayınlanacak içeriğin bulunduğu dizin). Bu örneğimizde, sanal konaklarımızın varsayılan web sitesinden ayrı olması gerekçesiyle /var/www yerine /srv/www/vhosts dizinini seçtik.Dikkat! Bu sanal konağımızın çalışabilmesi için DNS sunucusunda magmalinux.com alan adı için gereken ayarlamalar yapılmış olmalıdır (Yani www.magmalinux.com ve magmalinux.com adresleri doğru bilgisayarlara işaret etmelidir). Sanal konak dosyasında yaptığınız bu ayarlar, DNS ayarlarınızı GERÇEKLEŞTİRMEZ. DNS ayarlamaları için bakınız http://belgeler.magmalinux.org/bind/.Şimdi kök dizinimiz olan /srv/www/vhosts/www.magmalinux.com için bir takım ayarlar yapalım. İşletim sistemindeki dosya sisteminin bir parçası olan dizinler için yapılan ayarlarServerName www.magmalinux.comServerAlias magmalinux.comDocumentRoot "/srv/www/vhosts/www.magmalinux.com" Gördüğünüz üzere /srv/www/vhosts/www.magmalinux.com dizini içinOptions Indexes FollowSymLinks MultiViewsAllowOverride NoneOrder allow,denyAllow from all ServerName www.magmalinux.netServerAlias magmalinux.netDocumentRoot "/srv/www/vhosts/www.magmalinux.net" Options Indexes FollowSymLinks MultiViewsAllowOverride NoneOrder allow,denyAllow from all ServerName doc.magmalinux.netDocumentRoot "/srv/www/vhosts/doc.magmalinux.net" Örnek olması açısından www.magmalinux.net dosyası içerisinde www.magmalinux.net ve doc.magmalinux.net olmak üzere iki tane sanal konak tanımladık. Şimdi www.magmalinux.net web sitesini aktif hale getirmek için:# a2ensite www.magmalinux.net# /etc/init.d/apache2 restartkomutlarını çalıştıralım.2.2.3 mod_vhost_aliasAynı Apache HTTP sunucusu altında çok fazla web sitesi varsa, her biri için yukarıdaki ayarları yapmaktan sıkılabilirsiniz. Şimdi bizi bu dertten kurtaracak olan mod_vhost_alias modülünü inceleyelim.Modülümüzü etkinleştirmeden önce mods-available dizini altında vhost_alias.conf dosyası oluşturalım. Bu dosyanın en basit içeriği şu şekilde olabilir:UseCanonicalName OffVirtualDocumentRoot /srv/www/vhosts/%0VirtualDocumentRoot /srv/www/vhosts/%0 satırındaki %0, tam alan adını belirtmektedir (www.magmalinux.com, doc.magmalinux.net gibi). Eğer istenirse tam alan adının belli parçaları da kullanılabilir. Örneğin alan adının soldan ikinci parçası (magmalinux) belirtilmek isteniyorsa %2, sağdan 1. parçası (com) isteniyorsa %-1 ya da sondan 2 kısım (magmalinux.com) isteniyorsa %2+ kullanılabilir.Dosyayı kaydettikten sonra vhost_alias modülünü aktikleştirelim ve değişikliklerin geçerli olması için Apache’yi yeniden başlatalım:# a2enmod vhost_alias# /etc/init.d/apache2 restart2.3 Apache Yapılandırma Dosyaları Söz DizimiApache yapılandırma dosyalarında HTML elementlerine benzer, kendi içerisinde birden fazla yönerge içeren bazı yönergeler vardır (Options Indexes FollowSymLinks MultiViewsAllowOverride NoneOrder allow,denyAllow from all İşletim sisteminin dosya sistemindeki belli bir dizin ve onun alt dizinleri için yapılandırmaları (yönergeleri) tutar. Örneğin: Options FollowSymLinksAllowOverride None Dizin yolu içerisinde joker karakterde belirtebilirsiniz (Hatırlatma: ? joker karakteri tek bir harf eşleşmesi için, * karakteri herhangi bir karakter dizisi için, [] karakterleri aralık için kullanılabilir. Yeri gelmişken ’/’ karakteri hiçbir joker karakteri ile eşleşmez). Örneğin:Options FollowSymLinksAllowOverride None 2.3.2DirectoryMatch, Directory ile hemen hemen aynıdır. Directory’nin sağladıklarının yanında düzenli ifade desteği sağlar (Directory’yi kullanarak şeklinde düzenli ifade belirtebilsekte, ve bu işlemin yeni yolu DirectoryMatch’tir). Bir örnek incelersek: Options FollowSymLinksAllowOverride None Örnekteki düzenli ifade, www ile başlayan com ile biten dizinler ile eşleşecektir.2.3.3Bazı dosyalara özel yapılandırma yapmak için kullanılır. Örneğin: Order deny,allowDeny from all Yukarıdaki yapılandırma, gizli.html dosyasının hangi dizinde olduğuna bakılmaksızın, bu dosyaya erişimi engeller.şeklinde belirtilse bile, dikkate alınacak kısım yolun son parçası olan gizli.html olduğu için yukarıdaki örnekten farkı yoktur. Eğer sadece belli bir dizin içerisindeki gizli.html dosyası ile ilgili yapılandırma yapmak gerekirse, kabı, içerisinde kullanılabilir. Örneğin: 2.3.4Order deny,allowDeny from all FilesMatch, Files ile benzer olmasına karşın, dosya ismi içerisinde düzenli ifade kullanabilmemizi sağlar ( ile de şeklinde düzenli ifade kullanabiliyor olsakta, düzenli ifade kullanmanın yeni yolu FilesMatch’tir).Örnek bir FilesMatch kullanımı şöyle olabilir: Yukarıdaki yapılandırma, gelen istekteki Referer adresi magmalinux.com ya da magmalinux.net değilse; png, jpeg ve png dosyalarına erişimi yasaklar.2.3.5SetEnvIfNoCase Referer "^http://.*.magmalinux.(com|net)" local=1Order allow,denyAllow from env=local Directory’de olduğu gibi dosya sistemindeki kök dizinden başlayan dizinler için ayarlama yapmak yerine, Apache’nin sunduğu web sitesinin kök dizininden başlayan dizinler için ayarlama yapmak istiyorsanız Location kullanabilirsiniz. Kısaca Location size, Apache’nin sunduğu web sitesinin kök dizinini taban alıp, buna göreceli dizinler için ayarlamalar yapmanızı sağlar. Örneğin: Options ExecCGI Yukarıdaki yapılandırma, işletim sistemindeki / dizinin altında cgi-bin dizini değil, Apache’nin sunduğu web sitesinin kök dizini altındaki cgi-bin dizini içindir.benzeri, düzenli ifade belirtebildiğimiz bir de vardır. Kullanım şekli veya ile aynıdır.2.3.6 OptionsSanal konaklarımızı ayarlarken Options yönergesinden bahsetmiştik. kabı ile bir dizin için belirttiğimiz özellikler, alt dizinlere de uygulandığından, bir dizin için birden fazla Options tanımlandığı durum oluşabilir. Örneğin: Options Indexes Options Include ExecCGI Yukarıdaki örnekte /var/www/altdizin için kullandığımız Options yönergesi, üst dizindeki Options yönergesinin üzerine yazacak. Yani /var/www/altdizin için Indexes seçeneği aktif olmayacak. Eğer bir dizin için Options yönergesinde belirttiğimiz seçeneklerden birinin, üst dizindeki ayarlamalara eklenmesini istiyorsak, Options yönergesindeki o seçeneğin başına + işareti koymalıyız (eğer üst dizindeki ayarlamalardan çıkarılmasını istiyorsak başına - işareti koymalıyız). Örneğin:Options Indexes MultiViews Options +Include +ExecCGI -MultiViews 2.3.7 AliasBir web sitesinin kök dizini ağacının içerisinde bulunmayan bir dizini kök dizininin içerisine dahil etmeye yarar. Aslında temelde yaptığı şey, dosya sistemi içerisindeki bir dizin için web sitesi üzerinde bir takma ad tanımlamaktır. Örneğin:Alias /doc /usr/share/docYukarıdaki tanımı sites-available/www.magmalinux.com dosyası içerisinde, etiketleri içerisinde ya da .htaccess dosyasında belirtilebilir.2.3.10 RedirectMatchRedirect ile aynı olmasının yanında, düzenli ifadeleri destekler. Debian standart varsayılan web sayfasındaki (sites-available/default) örneğe bakalım:RedirectMatch ^/$ /apache2-default/2.4 Apache SSLApache SSL servisimiz için ilk olarak sertifika oluşturmamız gerekiyor. Eğer elinizde satın aldığınız hazır sertifika varsa bu aşamayı atlayabilirsiniz. Biz bu örneğimizde, OpenSSL yazılımıyla 10 yıl boyunca geçerli olacak bir sertifika oluşturacağız:# openssl req -new -x509 -days 3650 -nodes -out apache.pem -keyout apache.pemkomutunu çalıştırdığımızda karşımıza sertifikamız için bir takım sorular gelecek. Bu sorulardan bizim için en önemli olanları, PassPhrase ve CommonName. PassPhrase, sertifikamız için gireceğimiz parola (PassPhrase’in Password’den farkı, daha uzun olabilmesiydi. Eski UNIX’lerde Password’ün en fazla 8 karakter olduğundan, 8 karakterden uzun parolalara PashPhrase deniyordu), CommonName ise web sitemize erişilirken girilen alan adı bilgisi olacak (Örneğin www.magmalinux.com).Şimdi oluşan apache.pem dosyasını (ya da satın aldığımız sertifikayı) /etc/apache2/ dizinine kopyalayalım (apache.pem dosyasını /etc/apache2 dizinine kopyalamak gibi bir zorunluluk bulunmamaktadır. Biz sadece örnek olarak bu dizini seçtik. Farklı bir dizin kullanırsanız, ilerleyen kısımlardaki ayar dosyalarını kendinize göre değiştirmeniz gerekecek).Sıra, bu SSL sertifikasının kullanılacağı web sitesini yaratma kısmına geldi. Bunun için sanal konaklar kısmında edindiğimiz bilgileri hatırlayalım. Önce sites-available dizini altında bir dosya oluşturup (örneğin www.magmalinux.com-ssl), içini aşağıdakine benzer bir biçimde dolduralım:NameVirtualHost *:443 ServerName www.magmalinux.comSSLEngine onSSLCertificateFile /etc/apache2/apache.pemDocumentRoot /srv/www/www.magmalinux.com# ...# ... Bu dosya da bizim için önemli olan SSLEngine ve SSLCertificateFile yönergeleri. Adlarından da anlaşılacağı üzere SSLEngine yönergesi, bu web sitesi için SSL’i aktif ederken, SSLCertificateFile yönergesi de sertifika dosyasının yolunu belirtir.Son olarak ports.conf dosyamıza, Apache’ye, HTTP üzerinden SSL bağlantısı için kullanılan varsayılan 443 numaralı portu dinlemesini söylüyoruz. Örnek ports.conf dosyamız:Listen 80Listen 443şeklinde olabilir. Bütün bu işlemler bittikten sonra, değişikliklerin geçerli olabilmesi için, Apache’yi yeniden başlatalım:# /etc/init.d/apache2 restart2.5 Dinamik İçerikli Web SayfalarıTemelde Web sunucusu, istemciden gelen isteklere göre, sunucuda bulunan bir dosyayı istemciye gönderirken, bu dosya içerisinde hiç bir değişiklik yapmaz. Dosya içeriklerinin statik olduğu bu durumda, çeşitli kullanıcılara özel ya da çeşitli durumlara özel, dinamik içerik oluşturmak söz konusu olamaz. Bu durum Web’in kullanımı için büyük bir kısıtlamadır.2.5.1 SSISSI (Server Side Include - Sunucu Taraflı İçerik) dosyaları, sunucu tarafında dinamik içerik oluşturmanın en ilkel yoludur. SSI kullanılarak bir HTML dosyasına alt ve üst bilgi, sunucudaki bir uygulamanın çıktısı, çevresel değişkenlere erişim gibi bir takım ilkel dinamik içerik oluşturulabilir. SSI dosyalarının varsayılan uzantısı .shtml dir (Tabi uygun bir yapılandırılma ile başka bir uzantı da kullanılabilir).Apache’nin SSI desteğini açmak için öncelikle mod_include modülünü aktif edelim:# a2enmod includeDaha sonra web sitemiz içerisinde bir dizin oluşturup, bu dizin içerisinde SSI dosyalarının işlenmesine izin verelim. Bu örnek için www.magmalinux.com web sitesini seçelim. İlk olarak SSI dizinimizi oluşturalım:# mkdir /srv/www/vhosts/www.magmalinux.com/ssiŞimdi sites-available/www.magmalinux.com dosyasını açıpOptions +Includes Options yönergesindeki Includes seçeneğinin, belirtilen dizin için SSI desteğini aktifleştirdiğini hatırlayınız.Yaptığımız değişikliklerden sonra Apache’yi yeniden başlatalım:# /etc/init.d/apache2 restartŞimdi yazacağımız SSI dosyalarının içeriğinden kısaca bahsedelim. Bir SSI dosyasının HTML dosyasından hiç bir farkı yoktur. SSI komutları HTML yorum satırları arasına yazılır. Bir SSI komutunun yapısı şu şekildedir:Örnek bir deneme.shtml dosyası yazıp, /srv/www/vhosts/www.magmalinux.com/ssi/ dizinine kopyalayalım:
Orta
include komutu başka bir dosyayı dahil eder. exec ise .shtml dosyası içerisinden harici bir uygulama çalıştırıp, uygulamanın çıktısını bu .shtml dosyasına yazar. exec komutunun sonucu olarak, sunucu tarafında çalışan bir uygulamanın çıktısı istemciye gönderilmiş olur.Bir başka komut olan echo belli bir çevresel değişkenin değerini almada kullanılır. Örnek kullanımı:SSI dosyaları içerisinde basit if-else ifadeleri de kullanabilirsiniz. Biz bu belge de bunun ayrıntısına girmeyeceğiz. SSI hakkında daha ayrıntılı bilgi almak için, mod_include - Apache HTTP Server adresine bakınız.2.5.2 CGICGI (Common Gateway Interface - Ortak Geçit Arayüzü) bize, sunucu tarafında uygulama çalıştırıp, bu uygulamanın çıktısının istemciye gönderilmesini ve istemciden bu uygulamaya bir takım verilerin aktarılmasını sağlar. Bu bize, kullanıcıya göre dinamik içerik oluşturmayı sağlar.CGI’ın ilk günlerinde, CGI kelimesinin her geçtiği yerde Perl kelimesini görsekte; CGI’ın Perl dili ile pek bir alakası yoktur. CGI bize, istemciden gelen bir takım bilgilerin sunucu tarafındaki harici bir uygulamaya aktarılıp, bu uygulamanın ürettiği çıktının istemciye geri gönderilmesini sağlar. Sunucu tarafında çalışacak, web üzerinden gelen isteklere göre davranacak harici uygulama yazılırken, yoğunlukla Perl dili kullanıldı. Sunucu tarafında çalıştırdığımız bu harici uygulama Perl dışında herhangi bir betik dili olabileceği gibi (PHP, Python, Ruby ...), C ile yazılıp derlenmiş bir uygulama da olabilir (Zaten bir betik dilini çalıştırabiliyorsanız, bu betik dilini yorumlayacak olan uygulama makina koduna dönüştürülmüş bir uygulama olacağından; direk makina koduna dönüştürülmüş bir uygulamayı da çalıştırabilmek şaşırtıcı bir durum değil).Günümüzde, CGI’ın tarihe gömüldüğü gibi bir yanlış anlayış vardır. CGI’ın hızı PHP ve Java dillerinde yazılan web uygulamaları ile karşılaştırılır. CGI’ın sunucu tarafında çalıştırdığı uygulama bir PHP ya da Java uygulaması da olabilir. Aslında CGI içerisinde, herhangi bir dilde yazılmış bir uygulamayı çalıştırmak ile PHP web uygulamasını çalıştırmak arasındaki tek fark, Apache sunucusunda php programlarına gelen her istek için ayrı bir php yorumlayıcısı çalıştırılmasını önleyen mod_php modülüdür. Bu sayede, aşırı istek alan bir web sunucusu her CGI isteği için ayrı bir PHP süreci başlatmayacağından, sunucunun belleği daha etkin kullanılmış olur.Şimdi sunucuda çalışacak harici programlarımızın bulunacağı dizin için gerekli Apache ayarlarını yapalım. Bunu sağlamanın iki yolu var.Birinci yol:Birinci yol için www.magmalinux.com web sitemizi kullanalım. Öncelikle cgi uygulamalarının bulunacağı dizini oluşturalım:# mkdir /srv/www/vhosts/www.magmalinux.com/cgi-binDizinin ismini cgi-bin olarak belirtmek zorunda değilsiniz. Biz geleneklere bağlı kalarak bu ismi seçtik. Şimdi sites-available/www.magmalinux.com dosyamızı açıpOptions +ExecCGI AddHandler yönergesi, Apache’ye .pl, .cgi ve .rb uzantılı dosyaları cgi-scripti olarak ele almasını söyler.Şimdi seçtiğimiz bu iki yöntemi de test etmek için, bir betik oluşturup hem magmalinux.com’un cgi-bin dizinine hem de magmalinux.net’in cgi-bin dizinine atalım. Aşağıda Ruby dilinde yazılmış örnek bir betik var, deneme.rb isminde kaydedip bahsettiğimiz cgi-bin dizinlerine kopyalayın:#!/usr/bin/rubyprint "Content-type: text/html;nn"print "CGI deneme"Test için tarayıcınızla http://www.magmalinux.com/cgi-bin/deneme.rb ve http://www.magmalinux.net/cgi-bin/deneme.rb sayfalarını ziyaret edin.2.6 Çok Kullanılan Apache Modülleri2.6.1 mod_userdirmod_userdir, Apache’nin yüklü olduğu sunucudaki sistem kullanıcılarının, kendi ev (home) dizinlerindeki dosyaları Apache üzerinden yayınlayabilmesini sağlar.mod_userdir modülünü aktif edelim:# a2enmod userdirDiyelim ki, Apache’nin yüklü sistemimizde, dogan isminde ev dizini /home/dogan olan bir kullanıcı var. Bu kullanıcının ev dizini içerisinde bir public_html dizini oluşturalım (dogan kullanıcısının ev dizininde işlem yaptığınızdan bu işlemi dogan kullanıcısı iken yapın):$ mkdir /home/dogan/public_htmlŞimdi bu dizine bir kaç dosya kopyalayıp, tarayıcımızla http://www.magmalinux.com/~dogan/ sayfasını ziyaret edelim.mod_userdir ile ilgili ayarlama yapmak istiyorsanız (dizin için public_html yerine başka bir isim kullanmak gibi) /etc/apache2/mods-available/userdir.conf dosyasını düzenleyin. Varsayılan ayarlarıyla userdir.conf dosyası aşağıdakine benzer bir biçimdedir:UserDir public_htmlUserDir disabled root AllowOverride FileInfo AuthConfig LimitOptions MultiViews Indexes SymLinksIfOwnerMatch yönergesini de uygun şekilde değiştirin). Bu satırda boşluklarla ayrılmış birden fazla dizin ya da URI belirtebilirsiniz. Apache, bir istek geldiğinde belirttiğiniz sıra ile aramaya başlayacak.mod_userdir modülünü belirli kullanıcılar için kapatmak istiyorsanız (yukarıdaki örnekte olduğu gibi),UserDir disabled root ahmet mehmetşeklinde boşluklarla ayırarak belirtebilirsiniz. Ya da mod_userdir modülünü sadece belli kullanıcıların kullanabilmesini istiyorsanız:UserDir disabledUserDir enabled dogan enesşeklinde kullanabilirsiniz.2.6.2 mod_rewritemod_rewrite modülü, istekte bulunulan URL’yi düzenli ifadeler ile karşılaştırıp oldukça esnek yönlendirme kuralları tanımlamamızı sağlar.mod_rewrite’ı aktif edelim:# a2enmod rewriteDeneylerimizi www.magmalinux.com sitesi üzerinde yapalım. Bunun için sites-available/www.magmalinux.com dosyamızı açıp, rewrite modülümüzü bu site için aktif hale getiriyoruz. Aşağıdaki satırı etiketi içerisinde):RewriteLog "/var/log/apache2/rewrite_log"RewriteLogLevel 32.7 Apache Çoklu Süreç Modülleri (Multi-Processing Module - MPM)Apache MPM’ler, Apache’nin aynı anda birden fazla isteği sunucu tarafında nasıl gerçekleştireceği ile ilgili yöntemler sağlar. Her yeni gelen için ayrı bir süreç mi (process) ya da ayrı bir thread mi başlatılacağı kullanılan MPM’e bağlıdır.2.7.1 MPM PreforkPrefork MPM’i, Apache 1.3’te olduğu gibi, her gelen istek için ayrı bir süreç yaratır. Bu yüzden diğerlerine göre yavaş olsa da, bu MPM’in avantajı kararlılıktır. Her gelen isteği ayrı bir süreç cevapladığından, istekler birbirinden iyi bir şekilde yalıtılmıştır. Bu yüzden herhangi bir istekteki sorun, bir diğer isteği etkilemeyecektir. Uygulamalarında thread-safe olmayan kütüphaneler kullanan web siteleri için uygundur. Ayrıca, PHP uygulamaları yayını yapacaksanız, Prefork MPM’ini kullanmalısınız.apache2.conf dosyasındaki Prefork MPM’inin ayarlarına göz atalım: StartServers 5MinSpareServers 5MaxSpareServers 10MaxClients 150MaxRequestsPerChild 0 StartServers: Apache’nin başlatılması sırasında oluşturulacak çocuk süreç sayısını belirler.MinSpareServers: Herhangi bir anda gelebilecek isteklere karşı hazır, boşta bulunan minimum çocuk süreç sayısını belirler. Bu sayıdan az boşta bekleyen çocuk süreç olduğu durumda, Apache ana süreci boşta beklemesi için yeni çocuk süreçler yaratır.MaxSpareServers: Herhangi bir anda gelebilecek isteklere karşı hazır, boşta bulunan maximum çocuk süreç sayısını belirler. Bu sayıdan fazla boşta bekleyen çocuk süreç olduğu durumda, Apache ana süreci fazla olan süreçleri öldürür.MaxClients: Aynı anda hizmet verilecek istek sayısını belirler. Bu sayıdan fazla istek geldiğinde, bu istekler kuyruğa alınır (Kuyrukta bekletilecek maksimum istek sayısını ListenBacklog yönergesi ile ayarlayabilirsiniz).MaxRequestsPerChild: Tek bir çocuk sürecin ömrü boyunca cevap verebileceği maksimum istek sayısını belirler. 0 değeri sınırsız anlamına gelir.2.7.2 MPM WorkerMelez yapıya sahip bir MPM’dir. Her gelen istek için thread kullanmasının sağladığı hız ve hafızanın etkin kullanımı yanında, çoklu süreç yapısı sayesinde kararlılığını korur. Her süreç, isteklere cevap veren birden fazla threade sahiptir. Özellikle yüksek trafiğe sahip sunucularda kullanılması tavsiye edilir. Ayrıca, Debian’da varsayılan MPM’dir.apache2.conf dosyasındaki Worker MPM’inin ayarlarına göz atalım:StartServers 2MaxClients 150MinSpareThreads 25MaxSpareThreads 75ThreadsPerChild 25MaxRequestsPerChild 0 StartServers: Apache’nin başlatılması sırasında oluşturulacak çocuk süreç sayısını belirler. Bu süreçlerden her biri ThreadsPerChild yönergesinde belirtilen kadar threade sahip olacaktır.MaxClients: Aynı anda hizmet verilecek istek sayısını belirler. Bu sayıdan fazla istek geldiğinde, bu istekler kuyruğa alınır.MinSpareThreads: Bütün süreçlerdeki toplam, minimum boştaki thread sayısını belirler (her sürecin sahip olması gereken boştaki minimum thread sayısını değil). Bu sayıdan az boşta bekleyen thread olduğu durumda, Apache bu sayıya ulaşana kadar yeni süreçler yaratır.MaxSpareThreads: MinSpareThreads’e benzer şekilde, boştaki maksimum thread sayısını belirler.ThreadsPerChild: Süreç başına yaratılacak thread sayısını belirler Yönergeler AllowOverride Yönergesi AllowOverride yönergesi,, veya bölümlerinde değil, sadece düzenli ifade içermeyen bölümlerinde geçerlidir. Yönergeye değer olarak None belirtilirse .htaccess dosyaları tamamen yok sayılır. Bu durumda, sunucu dosya sisteminde rastladığı .htaccess dosyalarını okumaya dahi çalışmayacaktır. Bu yönergeye All değeri atanırsa, .htaccess bağlamında kullanılabilecek her yönergeye .htaccess dosyalarında izin verilir. İki sebepten ötürü htaccess dosyalarına izin vermek istemeyebilirsiniz: Birinci neden, size kaybettireceği performanstır. Apache bir dizinde .htaccess dosyası olmasa bile, bu dosyanın var olup olmadığını kontrol ederken vakit harcayacaktır ve her istek geldiğinde bu dosyanın içeriği tekrardan okunacaktır. Ayrıca Apache, .htaccess desteği verilmiş bütün üst dizinlerdeki htaccess dosyalarını kontrol edecektir (Örneğin /var/www/doc/ dizininin içindeki bir dosyaya istekte bulunulduğunu ve / dizinin bile .htaccess desteği olduğunu düşünelim. Apache sırasıyla /.htaccess, /var/.htaccess, /var/www/.htaccess, ve /var/www/doc/.htaccess dosyalarını okuyacaktır). İkinci neden ise, .htaccess dosyası içerisinde gereğinden fazla yetki verdiğinizde (AllowOverride All gibi) oluşabilecek güvenlik sorunlarıdır. - Apache konfigrasyon dosyaları için gerekli yönergeler
- /etc/apache2/httpd.conf
- /etc/apache2/apache2.conf
- /etc/apache2/ports.conf
- /etc/apache2/conf.d/
- /etc/apache2/mods-enabled/
- /etc/apache2/sites-enabled/
- Yönergeler
- AllowOverride Yönergesi
Apache Yönergeleri
Apache konfigrasyon dosyaları için gerekli yönergeler
Apache yapılandırma dosyası (apache2.conf) düzen açısından birden fazla dosyaya bölünmüştür.
Kabaca bu dosyalara göz atalım:
/etc/apache2/httpd.conf
Bu dosya boş gelir. Apache yöneticisinin ayarlarını tanımladığı dosyadır. Bu dosyanın içeriği ana apache yapılandırma dosyasına (apache2.conf) dahil edilecektir. Yani bu dosyaya yazılan her şey apache2.conf dosyasına yazılmış gibi davranılır. Bu yüzden, sistem yöneticilerinin apache2.conf yerine bu dosyayı değiştirmeleri tercih edilir.
/etc/apache2/apache2.conf
Apache 2 ana yapılandırma dosyasıdır. Apache servisi sürecinin temel ayarları, genel Apache ayarları, log ayarları gibi ayarları barındırır. Ayrıca parçalara bölünmüş bütün apache ayar dosyaları bu dosya içerisine aşağıdaki yönergeler vasıtasıyla dahil edilir:
# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
# Include all the user configurations:
Include /etc/apache2/httpd.conf
# Include ports listing
Include /etc/apache2/ports.conf
# Include generic snippets of statements
Include /etc/apache2/conf.d/
# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/
/etc/apache2/ports.conf
Dinlenen portların ayarlandığı dosyadır.
/etc/apache2/conf.d/
Yukarıda bahsedilen durumlar dışında bazı özel durumlara özgü ayarların ayrı ayrı dosyalar halinde tutulduğu dizindir. Bu dizin içindeki bütün dosyalar apache2.conf dosyasına dahil edilir.
/etc/apache2/mods-enabled/
Aktif edilen Apache modülleri ayar dosyalarının bulunduğu dizindir. Aslında bu ayar dosyaları /etc/apache2/mods-available/ dizininde durur. mods-enabled dizinindeki dosyalar gerçekte mods-available dizinindekilere birer sembolik linktir.
Bir Apache modülünü kaldırmak için ilgili modülün mods-enabled dizinindeki sembolik linkini silebilir ve bir Apache modülünü aktif hale getirmek için mods-enabled dizininden mods-available dizini içerisindeki ilgili modülün dosyalarına sembolik link oluşturabilirsiniz.
/etc/apache2/sites-enabled/
Aktif edilen Apache siteleri (sanal konak - virtual host) ayarlarının bulunduğu dizindir. mods-enabled dizinine benzer şekilde, sites-enabled dizinindeki dosyalar /etc/apache2/sites-available dizininde ilgili yerlere birer sembolik linktir. a2ensite ve a2dissite araçlarıyla sırasıyla bir siteyi faal hale getirebilir veya bir siteyi kaldırabilirsiniz.
.htaccess
Bu dosya, içinde bulunduğu dizin için geçerli olacak Apache ayarlarını tanımlar. Yani ana Apache ayar dosyasını değiştirmeden, web yöneticilerinin kendine ait dizinlerinin ayarlarını özelleştirebilmelerini sağlar. En son okunacak ayar dosyası olduğu için diğerlerinden baskındır ve bu dosyadaki değişikliklerin etkili olabilmesi için Apache’yi yeniden başlatmaya gerek yoktur. Ana Apache ayar dosyalarında AllowOverride None seçeneği ile .htaccess dosyaları etkisiz hale getirilebilir.
2.1 Debian Ön Tanımlı Yapılandırma Dosyalarının İncelenmesi
2.1.1 apache2.conf
apache2.conf dosyasının ana Apache ayar dosyası olduğundan bahsetmiştik. Apache servisi ile ilgili genel ayarların bulunduğu bu dosyaya biraz daha yakından bakalım:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
User www-data
Group www-data
AccessFileName .htaccess
HostnameLookups Off
KeepAlive yönergesi, kalıcı bağlantı özelliğini açıp kapatır. Aynı bağlantı üzerinden çok sayıda isteğin gönderilebilmesine izin vermek istiyorsak değeri On olmalı.
MaxKeepAliveRequest yönergesi, KeepAlive seçeneği açık iken, bağlantı başına kabul edilecek istek sayısını belirler. 0 değeri sonsuz anlamındadır. Yüksek performans (başarım) için yüksek değerler vermeniz tavsiye edilir.
KeepAliveTimeout yönergesi, sunucu kalıcı bir bağlantıyı kapatmadan önce, bir sonraki isteği kaç saniye bekleyeceğini belirler.
User ve Group yönergeleri Apache sürecini çalıştıracak kullanıcıyı ve grubu belirler. Seçtiğiniz kullanıcı ve grup, Apache’nin ilgilendiği dizinler üzerinde gerekli haklara sahip olmalıdır. Genellikle varsayılan değerleri değiştirmenize gerek yoktur.
AccessFileName yönergesi, meşhur .htaccess dosyası için farklı bir isim belirlemeye yarar.
HostnameLookups yönergesi, istemcinin IP adresinin DNS sistemi içerisinde tersine sorgulanıp alan adının bulunması isteniyorsa, On yapılmalıdır. İstemcinin adına (hostname) ihtiyaç duymayan sitelerde ağ trafiğini yormamak düşüncesi ile varsayılan değeri Off tur. Değeri On ise, bulunan ad, CGI çevre değişkenlerinden REMOTE_HOST’a aktarılır. Bir diğer değer olan Double ise IP adresini tersine sorguladıktan sonra, elde ettiği adı bir kez daha DNS sistemi içerisinde sorgular ve sonuçta elde edilen IP adresi istemcininkine eşit olup olmadığı kontrol edilir.
Eğer ayar dosyalarınızda Allow from Ceren Bilgisayar şeklinde alan adına göre erişim denetimi yapıyorsanız, HostnameLookups ayarının değerine bakılmaksızın çift yönlü (Double) DNS sorgusu yapılır.
HostnameLookups ve alan adına göre erişim denetimi gibi DNS sorgusu gerektiren işlemler, Apache’yi oldukça yavaşlatır. Bu yüzden, bu seçenekler gerçekten gerekiyorsa kullanılmalıdır.
ErrorLog yönergesi, hata loglarının hangi dosyaya yazılacağını belirler. Varsayılan /var/log/apache2/error.log dur.
LogLevel yönergesi, log seviyesini belirler. Hata ayıklama, test, ürün ortamınıza göre değiştirmeniz gerekebilir.
Ayar dosyalarındaki diğer yönergeler için daha ayrıntılı bilgiyi http://httpd.apache.org/docs/2.2/mod/quickreference.html adresinde bulabilirsiniz.
2.1.2 ports.conf
Apache’nin gelen istekler için dinleyeceği portların belirlendiği dosya. Varsayılan olarak içeriği genelde tek satırdan oluşur:
Listen 80
Listen yönergesi, Apache’nin dinleyeceği IP adresi ve portu belirler (Listen IPv4ort ya da Listen [IPv6]ort şeklinde belirtilebilir. IPv6 adresleri belirtilirken etrafına [] karakterleri konur). Eğer IP adresi belirtilmemişse, tüm arabirimlerin belirtilen portu dinlenecektir.
Birden fazla Listen yönergesine sahip olabilirsiniz (En az bir tane olmalı). Bu durumda Apache belirtilen portların (belirtilmişse IP’lerin) hepsini dinleyecektir. Örneğin ports.conf dosyanız şu şekilde olabilir:
Listen 80
Listen 81
Örneğin SSL bağlantıları için Apache’den 443 nolu portu dinlemesini isteyebilirsiniz:
Listen 80
Listen 443
Ya da sadece mod_ssl modülü yüklenmişse bu portu dinlemesini isteyebilirsiniz:
Listen 80
<IfModule mod_ssl.c>
Listen 443
</IfModule>
Varsayılan durumda mod_ssl aktif değilse, aktif hale getirmek için a2enmod ssl komutunu kullanın.
<IfModule modul_adi> etiketi içerisindeki yönergeler, modul_adi modülü yüklenmiş ise gerçekleştirilir.
2.2 Sanal Konaklar (Virtual Hosts)
Tek bir Apache HTTP sunucusunun, birden fazla web sitesine ayrı ayrı hizmet vermesini sağlayabiliriz. Örneğin magmalinux.com, magmalinux.net ve cerenbilgisayar.com.tr web siteleri birbirinden bağımsız bir şekilde aynı Apache sunucusu altında çalışabilir.
Her bir sanal konak için Apache sites-available dizini altında, bir dosya oluşturup ilgili sanal konak ayarlarını yapmak gerekir (Sanal konakların çalışabilmesi için istemcinin HTTP 1.1 protokolünü kullanıyor olması gerekir. Ayrıca alan adlarının ilgili DNS ayarlarını da yapmış olmalısınız).
2.2.1 www.magmalinux.com Alan adı için Sanal Konak
Öncelikle sites-available dizini içerisinde bir dosya oluşturup sanal konak tanımımızı bu dosya içinde yapalım. Sanak konak ayarlarının bulunacağı bu dosyaya istediğimiz ismi verebilsekte, anlaşılabilirlik ve düzen açısından dosyamıza www.magmalinux.com ismini verelim. www.magmalinux.com sanal konağı için temel ayarlarımız şu şekilde:
<VirtualHost *>
ServerName www.magmalinux.com
ServerAlias magmalinux.com
DocumentRoot "/srv/www/vhosts/www.magmalinux.com"
</VirtualHost>
ServerName, bu sanal konak için, internet tarayıcısında yazılan sunucu adıyla (www.magmalinux.com gibi) eşleşecek ismi belirler. www.magmalinux.com yerine sadece magmalinux.com yazıldığı zaman da bu sanal konağa erişilebilmesi için, bir de ServerAlias tanımladık. DocumentRoot ise, bu sanal konak için kök dizinimizi belirler (Yani http://www.magmalinux.com/ şeklinde istekte bulunulduğunda yayınlanacak içeriğin bulunduğu dizin). Bu örneğimizde, sanal konaklarımızın varsayılan web sitesinden ayrı olması gerekçesiyle /var/www yerine /srv/www/vhosts dizinini seçtik.
Dikkat! Bu sanal konağımızın çalışabilmesi için DNS sunucusunda magmalinux.com alan adı için gereken ayarlamalar yapılmış olmalıdır (Yani www.magmalinux.com ve magmalinux.com adresleri doğru bilgisayarlara işaret etmelidir). Sanal konak dosyasında yaptığınız bu ayarlar, DNS ayarlarınızı GERÇEKLEŞTİRMEZ. DNS ayarlamaları için bakınız http://belgeler.magmalinux.org/bind/.
Şimdi kök dizinimiz olan /srv/www/vhosts/www.magmalinux.com için bir takım ayarlar yapalım. İşletim sistemindeki dosya sisteminin bir parçası olan dizinler için yapılan ayarlar <Directory dizin_ismi> </Directory> etiketleri arasında bulunur. Örneğin:
<VirtualHost *>
ServerName www.magmalinux.com
ServerAlias magmalinux.com
DocumentRoot "/srv/www/vhosts/www.magmalinux.com"
<Directory "/srv/www/vhosts/www.magmalinux.com">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Gördüğünüz üzere /srv/www/vhosts/www.magmalinux.com dizini için <Directory> </Directory> etiketleri arasında bazı ayarlar var. Sırayla incelersek:
Options Indexes FollowSymLinks MultiViews satırı bu dizin için bir kaç seçeneği aktif etmiştir:
Indexes: Eğer bu dizin içerisinde DirectoryIndex yönergesinde belirtilen dosya (varsayılan index.html) mevcut değilse, dizinin içeriğini gösteren otomatik bir index yaratılır (mod_authindex tarafından) ve istemciye cevap olarak gönderilir.
FollowSymLinks: Apache’ye bir sembolik link ile karşılaştığı zaman bu linki takip etmesini söyler.
MultiViews: Diyelim ki, sunucunuzda /srv/www/vhosts/www.magmalinux.com altında bir ornek.php dosyası var ve siz bu dosyaya http://www.magmalinux.com/ornek seklinde de erismek istiyorsunuz (uzantıyı belirtmeden). MultiViews özelliği mod_negotiation modülünü kullanarak size bu desteği sağlar (Dikkat! Sunucuya http://www.magmalinux.com/ornek dosyasının isteği geldiğinde, istemcinin HTTP isteğinde gönderdiği Accept: değerine bakılarak, ornek dosyası aranır. Yani istemciniz HTTP isteğini gerçekleştirirken Accept: değerine sadece text/html girmiş ise, ornek dosyasına bakılırken, sadece ornek.html aranacak ve ornek.php bulunamayacak).
Yukarıdakilerin dışında Options yönergesine belirtebileceğiniz seçenekler:
ExecCGI: Aktif edildiği dizin içerisindeki çalıştırılabilir dosyaların, mod_cgi kullanılarak çalıştırılması sağlanır (Genelde bu seçenek, cgi-bin dizinleri için aktif hale getirilir). İlerleyen kısımlarda CGI kullanımı açıklanacaktır.
Includes: Aktif edildiği dizin içerisinde, SSI (Server Side Include) dosyaları çalıştırabilmeye izin verir. SSI, Apache tarafından sunulan basit bir betik dili gibi düşünülebilir. Bu konu, belgenin ilerleyen bölümlerinde ayrıntılandırılacaktır.
IncludesNOEXEC: SSI izni verilir fakat, SSI dosyaları içerisinden harici bir uygulama çağrılması yasaklanır.
SymLinksIfOwnerMatch: FollowSymLinks ile benzerdir. Ancak, sembolik linkin bulunduğu dizinin sahibi, sembolik linkin gösterdiği dosyanın (ya da dizinin) sahibi ile aynı ise, sunucu sembolik linki takip eder (Bu özelliğin açık olması durumunda, Apache her istek geldiğinde dizinin ve işaret edilen dosyanın sahibi kontrol edileceği için, SymLinksIfOwnerMatch özelliği sunucuyu yavaşlatan bir özelliktir. Sembolik linkleriniz için bu güvenlik gerekmiyorsa FollowSymLinks özelliğini tercih edin).
Tekrardan /srv/www/vhosts/www.magmalinux.com dizini için belirttiğimiz seçeneklere dönelim:
AllowOverride None seçeneği ise, hatırlandığı üzere, belirtilen dizin ve alt dizinleri için Apache’nin .htaccess dosyasını yorumlamasını kapatır (Alt dizin için başka bir AllowOverride belirtilene kadar).
Order allow,deny: Allow ve Deny talimatları ile anlamlıdır (Bu örneğimizde sadece Allow from all talimatı var). İzin sıralamasını belirler. Sıralama allow,deny ya da deny,allow olabilir. Eğer genel olarak erişime izin vermek, sadece belli durumlar için yasaklama getirmek istiyorsanız allow,deny sıralamasını; ya da eğer genel olarak erişimi yasaklamak, sadece belli durumlar için izin vermek istiyorsanız deny,allow sıralamasını kullanın.
Allow from all: Allow talimatı dizine erişimine izin verilecek bilgisayarları belirler. İkinci parametresi daima from dur. Allow from all herkese izin verir. Alan adına (Ters DNS sorgusu gerektirir), IP adresine ya da bir çevresel değişkenin değerine göre erişim iznini ayarlayabilirsiniz. Ayrıntılarından ilerleyen kısımlarda bahsedilecektir.
Dosyayı inceledikten sonra, şimdi sites-available daki bu siteyi işler hale getirmek için
# a2ensite www.magmalinux.com
komutunu kullanalım (ya da elle, sites-available dizinindeki magmalinux.com dosyasına sites-enabled dizininden sembolik link oluşturun). a2ensite komutuna verdiğimiz parametre, sites-available dizininde oluşturduğumuz dosyanın ismi olduğuna dikkat edin. Yapılan değişikliklerin etkili olabilmesi için Apache’yi yeniden başlatmalıyız:
# /etc/init.d/apache2 restart
2.2.2 www.magmalinux.net Alan adı için Sanal Konak
Aynı Apache sunucusu içerisinde bir de magmalinux.net alan adı için hizmet verelim (Tekrar Dikkat! magmalinux.net alan adına gelen isteğin Apache’ye ulaşabilmesi için öncelikle DNS sunucunuz bu alan adı için yapılandırılmış olmalı). Yine sites-available dizini altında www.magmalinux.net sanal konağı için ayarların duracağı www.magmalinux.net isminde bir dosya oluşturalım ve içeriğini aşağıdaki gibi dolduralım:
<VirtualHost *:80>
ServerName www.magmalinux.net
ServerAlias magmalinux.net
DocumentRoot "/srv/www/vhosts/www.magmalinux.net"
<Directory "/srv/www/vhosts/www.magmalinux.net">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName doc.magmalinux.net
DocumentRoot "/srv/www/vhosts/doc.magmalinux.net"
<Directory "/srv/www/vhosts/doc.magmalinux.net">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Örnek olması açısından www.magmalinux.net dosyası içerisinde www.magmalinux.net ve doc.magmalinux.net olmak üzere iki tane sanal konak tanımladık. Şimdi www.magmalinux.net web sitesini aktif hale getirmek için:
# a2ensite www.magmalinux.net
# /etc/init.d/apache2 restart
komutlarını çalıştıralım.
2.2.3 mod_vhost_alias
Aynı Apache HTTP sunucusu altında çok fazla web sitesi varsa, her biri için yukarıdaki ayarları yapmaktan sıkılabilirsiniz. Şimdi bizi bu dertten kurtaracak olan mod_vhost_alias modülünü inceleyelim.
Modülümüzü etkinleştirmeden önce mods-available dizini altında vhost_alias.conf dosyası oluşturalım. Bu dosyanın en basit içeriği şu şekilde olabilir:
UseCanonicalName Off
VirtualDocumentRoot /srv/www/vhosts/%0
VirtualDocumentRoot /srv/www/vhosts/%0 satırındaki %0, tam alan adını belirtmektedir (www.magmalinux.com, doc.magmalinux.net gibi). Eğer istenirse tam alan adının belli parçaları da kullanılabilir. Örneğin alan adının soldan ikinci parçası (magmalinux) belirtilmek isteniyorsa %2, sağdan 1. parçası (com) isteniyorsa %-1 ya da sondan 2 kısım (magmalinux.com) isteniyorsa %2+ kullanılabilir.
Dosyayı kaydettikten sonra vhost_alias modülünü aktikleştirelim ve değişikliklerin geçerli olması için Apache’yi yeniden başlatalım:
# a2enmod vhost_alias
# /etc/init.d/apache2 restart
2.3 Apache Yapılandırma Dosyaları Söz Dizimi
Apache yapılandırma dosyalarında HTML elementlerine benzer, kendi içerisinde birden fazla yönerge içeren bazı yönergeler vardır (<Directory> </Directory> gibi). Bu tip yönergelere kap (container) denir. Şimdi bunlardan bir kaçını inceleyelim.
2.3.1 <Directory>
İşletim sisteminin dosya sistemindeki belli bir dizin ve onun alt dizinleri için yapılandırmaları (yönergeleri) tutar. Örneğin:
<Directory /var/www>
Options FollowSymLinks
AllowOverride None
</Directory>
Dizin yolu içerisinde joker karakterde belirtebilirsiniz (Hatırlatma: ? joker karakteri tek bir harf eşleşmesi için, * karakteri herhangi bir karakter dizisi için, [] karakterleri aralık için kullanılabilir. Yeri gelmişken ’/’ karakteri hiçbir joker karakteri ile eşleşmez). Örneğin:
<Directory /srv/www/vhosts/*/doc>
Options FollowSymLinks
AllowOverride None
</Directory>
2.3.2 <DirectoryMatch>
DirectoryMatch, Directory ile hemen hemen aynıdır. Directory’nin sağladıklarının yanında düzenli ifade desteği sağlar (Directory’yi kullanarak <Directory ~ duzenli_ifade> şeklinde düzenli ifade belirtebilsekte, ve bu işlemin yeni yolu DirectoryMatch’tir). Bir örnek incelersek:
<DirectoryMatch "/srv/www/vhosts/^www.*com$">
Options FollowSymLinks
AllowOverride None
</DirectoryMatch>
Örnekteki düzenli ifade, www ile başlayan com ile biten dizinler ile eşleşecektir.
2.3.3 <Files>
Bazı dosyalara özel yapılandırma yapmak için kullanılır. Örneğin:
<Files gizli.html>
Order deny,allow
Deny from all
</Files>
Yukarıdaki yapılandırma, gizli.html dosyasının hangi dizinde olduğuna bakılmaksızın, bu dosyaya erişimi engeller. <Files /var/www/gizli.html> şeklinde belirtilse bile, dikkate alınacak kısım yolun son parçası olan gizli.html olduğu için yukarıdaki örnekten farkı yoktur. Eğer sadece belli bir dizin içerisindeki gizli.html dosyası ile ilgili yapılandırma yapmak gerekirse, <Files> kabı, <Directory> içerisinde kullanılabilir. Örneğin:
<Directory /var/www>
<Files gizli.html>
Order deny,allow
Deny from all
</Files>
</Directory>
2.3.4 <FilesMatch>
FilesMatch, Files ile benzer olmasına karşın, dosya ismi içerisinde düzenli ifade kullanabilmemizi sağlar (<Files> ile de <Files ~ duzenli_ifade> şeklinde düzenli ifade kullanabiliyor olsakta, düzenli ifade kullanmanın yeni yolu FilesMatch’tir).
Örnek bir FilesMatch kullanımı şöyle olabilir:
<FilesMatch ".(png|jpe?g|png)$">
SetEnvIfNoCase Referer "^http://.*.magmalinux.(com|net)" local=1
Order allow,deny
Allow from env=local
</Files>
Yukarıdaki yapılandırma, gelen istekteki Referer adresi magmalinux.com ya da magmalinux.net değilse; png, jpeg ve png dosyalarına erişimi yasaklar.
2.3.5 <Location>
Directory’de olduğu gibi dosya sistemindeki kök dizinden başlayan dizinler için ayarlama yapmak yerine, Apache’nin sunduğu web sitesinin kök dizininden başlayan dizinler için ayarlama yapmak istiyorsanız Location kullanabilirsiniz. Kısaca Location size, Apache’nin sunduğu web sitesinin kök dizinini taban alıp, buna göreceli dizinler için ayarlamalar yapmanızı sağlar. Örneğin:
<Location /cgi-bin>
Options ExecCGI
</Location>
Yukarıdaki yapılandırma, işletim sistemindeki / dizinin altında cgi-bin dizini değil, Apache’nin sunduğu web sitesinin kök dizini altındaki cgi-bin dizini içindir.
<Location> benzeri, düzenli ifade belirtebildiğimiz bir de <LocationMatch> vardır. Kullanım şekli <FilesMatch> veya <DirectoryMatch> ile aynıdır.
2.3.6 Options
Sanal konaklarımızı ayarlarken Options yönergesinden bahsetmiştik. <Directory> kabı ile bir dizin için belirttiğimiz özellikler, alt dizinlere de uygulandığından, bir dizin için birden fazla Options tanımlandığı durum oluşabilir. Örneğin:
<Directory "/var/www">
Options Indexes
</Directory>
<Directory "/var/www/altdizin">
Options Include ExecCGI
</Directory>
Yukarıdaki örnekte /var/www/altdizin için kullandığımız Options yönergesi, üst dizindeki Options yönergesinin üzerine yazacak. Yani /var/www/altdizin için Indexes seçeneği aktif olmayacak. Eğer bir dizin için Options yönergesinde belirttiğimiz seçeneklerden birinin, üst dizindeki ayarlamalara eklenmesini istiyorsak, Options yönergesindeki o seçeneğin başına + işareti koymalıyız (eğer üst dizindeki ayarlamalardan çıkarılmasını istiyorsak başına - işareti koymalıyız). Örneğin:
<Directory "/var/www">
Options Indexes MultiViews
</Directory>
<Directory "/var/www/altdizin">
Options +Include +ExecCGI -MultiViews
</Directory>
2.3.7 Alias
Bir web sitesinin kök dizini ağacının içerisinde bulunmayan bir dizini kök dizininin içerisine dahil etmeye yarar. Aslında temelde yaptığı şey, dosya sistemi içerisindeki bir dizin için web sitesi üzerinde bir takma ad tanımlamaktır. Örneğin:
Alias /doc /usr/share/doc
Yukarıdaki tanımı sites-available/www.magmalinux.com dosyası içerisinde <VirtualHost *:80> </VirtualHost> kapları arasında yaptığımızda, istemci http://www.magmalinux.com/doc içeriğini istediği zaman, cevap olarak /usr/share/doc içeriği gönderilir.
Alias kullanırken dizin adreslerinin sonunda / karakteri olup olmamasına dikkat edin. Eğer
Alias /doc/ /usr/share/doc
biçiminde kullanılmış olsaydı, bu Alias http://www.magmalinux.com/doc isteği için geçerli olmazdı. Alias tanımında /doc kısmında sona / koymadığımızda, Alias hem /doc hem de /doc/ için geçerli olur.
2.3.8 AliasMatch
Yaptığı iş Alias ile aynıdır. Takma ad için düzenli ifadeleri destekler. Örneğin:
AliasMatch ^/doc-(.*) /usr/share/doc/
http://www.magmalinux.com/doc-apache2 adresine istek gelmiş ise, bu istek tanımladığımız alias ile eşlecek ve kullanıcıya /usr/share/doc/apache2 içeriği gösterilecek (Alias tanımındaki , parantez içindeki düzenli ifade ile eşleşen metni verir).
2.3.9 Redirect
Belirlenen bir dosya (ya da dizin) istendiğinde istemciyi başka bir adrese yönlendirmeye yarar. Örneğin:
Redirect /doc http://doc.magmalinux.net/
Ana apache ayar dosyalarında, <VirtualHost>, <Directory> etiketleri içerisinde ya da .htaccess dosyasında belirtilebilir.
2.3.10 RedirectMatch
Redirect ile aynı olmasının yanında, düzenli ifadeleri destekler. Debian standart varsayılan web sayfasındaki (sites-available/default) örneğe bakalım:
RedirectMatch ^/$ /apache2-default/
2.4 Apache SSL
Apache SSL servisimiz için ilk olarak sertifika oluşturmamız gerekiyor. Eğer elinizde satın aldığınız hazır sertifika varsa bu aşamayı atlayabilirsiniz. Biz bu örneğimizde, OpenSSL yazılımıyla 10 yıl boyunca geçerli olacak bir sertifika oluşturacağız:
# openssl req -new -x509 -days 3650 -nodes -out apache.pem -keyout apache.pem
komutunu çalıştırdığımızda karşımıza sertifikamız için bir takım sorular gelecek. Bu sorulardan bizim için en önemli olanları, PassPhrase ve CommonName. PassPhrase, sertifikamız için gireceğimiz parola (PassPhrase’in Password’den farkı, daha uzun olabilmesiydi. Eski UNIX’lerde Password’ün en fazla 8 karakter olduğundan, 8 karakterden uzun parolalara PashPhrase deniyordu), CommonName ise web sitemize erişilirken girilen alan adı bilgisi olacak (Örneğin www.magmalinux.com).
Şimdi oluşan apache.pem dosyasını (ya da satın aldığımız sertifikayı) /etc/apache2/ dizinine kopyalayalım (apache.pem dosyasını /etc/apache2 dizinine kopyalamak gibi bir zorunluluk bulunmamaktadır. Biz sadece örnek olarak bu dizini seçtik. Farklı bir dizin kullanırsanız, ilerleyen kısımlardaki ayar dosyalarını kendinize göre değiştirmeniz gerekecek).
Sıra, bu SSL sertifikasının kullanılacağı web sitesini yaratma kısmına geldi. Bunun için sanal konaklar kısmında edindiğimiz bilgileri hatırlayalım. Önce sites-available dizini altında bir dosya oluşturup (örneğin www.magmalinux.com-ssl), içini aşağıdakine benzer bir biçimde dolduralım:
NameVirtualHost *:443
<VirtualHost *:443>
ServerName www.magmalinux.com
SSLEngine on
SSLCertificateFile /etc/apache2/apache.pem
DocumentRoot /srv/www/www.magmalinux.com
# ...
# ...
</VirtualHost>
Bu dosya da bizim için önemli olan SSLEngine ve SSLCertificateFile yönergeleri. Adlarından da anlaşılacağı üzere SSLEngine yönergesi, bu web sitesi için SSL’i aktif ederken, SSLCertificateFile yönergesi de sertifika dosyasının yolunu belirtir.
Son olarak ports.conf dosyamıza, Apache’ye, HTTP üzerinden SSL bağlantısı için kullanılan varsayılan 443 numaralı portu dinlemesini söylüyoruz. Örnek ports.conf dosyamız:
Listen 80
Listen 443
şeklinde olabilir. Bütün bu işlemler bittikten sonra, değişikliklerin geçerli olabilmesi için, Apache’yi yeniden başlatalım:
# /etc/init.d/apache2 restart
2.5 Dinamik İçerikli Web Sayfaları
Temelde Web sunucusu, istemciden gelen isteklere göre, sunucuda bulunan bir dosyayı istemciye gönderirken, bu dosya içerisinde hiç bir değişiklik yapmaz. Dosya içeriklerinin statik olduğu bu durumda, çeşitli kullanıcılara özel ya da çeşitli durumlara özel, dinamik içerik oluşturmak söz konusu olamaz. Bu durum Web’in kullanımı için büyük bir kısıtlamadır.
2.5.1 SSI
SSI (Server Side Include - Sunucu Taraflı İçerik) dosyaları, sunucu tarafında dinamik içerik oluşturmanın en ilkel yoludur. SSI kullanılarak bir HTML dosyasına alt ve üst bilgi, sunucudaki bir uygulamanın çıktısı, çevresel değişkenlere erişim gibi bir takım ilkel dinamik içerik oluşturulabilir. SSI dosyalarının varsayılan uzantısı .shtml dir (Tabi uygun bir yapılandırılma ile başka bir uzantı da kullanılabilir).
Apache’nin SSI desteğini açmak için öncelikle mod_include modülünü aktif edelim:
# a2enmod include
Daha sonra web sitemiz içerisinde bir dizin oluşturup, bu dizin içerisinde SSI dosyalarının işlenmesine izin verelim. Bu örnek için www.magmalinux.com web sitesini seçelim. İlk olarak SSI dizinimizi oluşturalım:
# mkdir /srv/www/vhosts/www.magmalinux.com/ssi
Şimdi sites-available/www.magmalinux.com dosyasını açıp <VirtualHost *:80> </VirtualHost> kapları arasına aşağıdakileri girelim:
<Location /ssi>
Options +Includes
</Location>
Options yönergesindeki Includes seçeneğinin, belirtilen dizin için SSI desteğini aktifleştirdiğini hatırlayınız.
Yaptığımız değişikliklerden sonra Apache’yi yeniden başlatalım:
# /etc/init.d/apache2 restart
Şimdi yazacağımız SSI dosyalarının içeriğinden kısaca bahsedelim. Bir SSI dosyasının HTML dosyasından hiç bir farkı yoktur. SSI komutları HTML yorum satırları arasına yazılır. Bir SSI komutunun yapısı şu şekildedir:
<!--#komut parametre="deger" -->
Örnek bir deneme.shtml dosyası yazıp, /srv/www/vhosts/www.magmalinux.com/ssi/ dizinine kopyalayalım:
<!--#include virtual="ust.html"-->
<br />
Orta <br />
<!--#exec cmd="ls -F" -->
<br />
<!--#include virtual="alt.html"-->
include komutu başka bir dosyayı dahil eder. exec ise .shtml dosyası içerisinden harici bir uygulama çalıştırıp, uygulamanın çıktısını bu .shtml dosyasına yazar. exec komutunun sonucu olarak, sunucu tarafında çalışan bir uygulamanın çıktısı istemciye gönderilmiş olur.
Bir başka komut olan echo belli bir çevresel değişkenin değerini almada kullanılır. Örnek kullanımı:
<!--#echo var="REMOTE_ADDR" -->
SSI dosyaları içerisinde basit if-else ifadeleri de kullanabilirsiniz. Biz bu belge de bunun ayrıntısına girmeyeceğiz. SSI hakkında daha ayrıntılı bilgi almak için, mod_include - Apache HTTP Server adresine bakınız.
2.5.2 CGI
CGI (Common Gateway Interface - Ortak Geçit Arayüzü) bize, sunucu tarafında uygulama çalıştırıp, bu uygulamanın çıktısının istemciye gönderilmesini ve istemciden bu uygulamaya bir takım verilerin aktarılmasını sağlar. Bu bize, kullanıcıya göre dinamik içerik oluşturmayı sağlar.
CGI’ın ilk günlerinde, CGI kelimesinin her geçtiği yerde Perl kelimesini görsekte; CGI’ın Perl dili ile pek bir alakası yoktur. CGI bize, istemciden gelen bir takım bilgilerin sunucu tarafındaki harici bir uygulamaya aktarılıp, bu uygulamanın ürettiği çıktının istemciye geri gönderilmesini sağlar. Sunucu tarafında çalışacak, web üzerinden gelen isteklere göre davranacak harici uygulama yazılırken, yoğunlukla Perl dili kullanıldı. Sunucu tarafında çalıştırdığımız bu harici uygulama Perl dışında herhangi bir betik dili olabileceği gibi (PHP, Python, Ruby ...), C ile yazılıp derlenmiş bir uygulama da olabilir (Zaten bir betik dilini çalıştırabiliyorsanız, bu betik dilini yorumlayacak olan uygulama makina koduna dönüştürülmüş bir uygulama olacağından; direk makina koduna dönüştürülmüş bir uygulamayı da çalıştırabilmek şaşırtıcı bir durum değil).
Günümüzde, CGI’ın tarihe gömüldüğü gibi bir yanlış anlayış vardır. CGI’ın hızı PHP ve Java dillerinde yazılan web uygulamaları ile karşılaştırılır. CGI’ın sunucu tarafında çalıştırdığı uygulama bir PHP ya da Java uygulaması da olabilir. Aslında CGI içerisinde, herhangi bir dilde yazılmış bir uygulamayı çalıştırmak ile PHP web uygulamasını çalıştırmak arasındaki tek fark, Apache sunucusunda php programlarına gelen her istek için ayrı bir php yorumlayıcısı çalıştırılmasını önleyen mod_php modülüdür. Bu sayede, aşırı istek alan bir web sunucusu her CGI isteği için ayrı bir PHP süreci başlatmayacağından, sunucunun belleği daha etkin kullanılmış olur.
Şimdi sunucuda çalışacak harici programlarımızın bulunacağı dizin için gerekli Apache ayarlarını yapalım. Bunu sağlamanın iki yolu var.
Birinci yol:
Birinci yol için www.magmalinux.com web sitemizi kullanalım. Öncelikle cgi uygulamalarının bulunacağı dizini oluşturalım:
# mkdir /srv/www/vhosts/www.magmalinux.com/cgi-bin
Dizinin ismini cgi-bin olarak belirtmek zorunda değilsiniz. Biz geleneklere bağlı kalarak bu ismi seçtik. Şimdi sites-available/www.magmalinux.com dosyamızı açıp <VirtualHost *:80> </VirtualHost> kapları arasında herhangi bir yere aşağıdakileri girelim:
ServerAlias /cgi-bin/ /srv/www/vhosts/www.magmalinux.com/cgi-bin/
ServerAlias, Alias’a benzer biçimde davranır. Farkı ise, Apache ServerAlias’ta belirtilen dizin içindekilerin hepsini çalıştırılabilir dosya olarak düşünür. Bu dizindeki herhangi bir dosyaya bir istek geldiğinde, Apache bu dosyayı çalıştırmayı dener.
İkinci yol:
İkinci yol için www.magmalinux.net sayfamızı kullanalım. İlk olarak, www.magmalinux.net sitemizin kök dizininde cgi-bin dizinimizi oluşturalım:
# mkdir /srv/www/vhosts/www.magmalinux.net/cgi-bin
Ardından, sites-available/www.magmalinux.net dosyamızda, <VirtualHost *:80> </VirtualHost> kapları arasına aşağıdakileri ekleyelim:
AddHandler cgi-script .pl .cgi .rb
<Location /cgi-bin>
Options +ExecCGI
</Location>
AddHandler yönergesi, Apache’ye .pl, .cgi ve .rb uzantılı dosyaları cgi-scripti olarak ele almasını söyler.
Şimdi seçtiğimiz bu iki yöntemi de test etmek için, bir betik oluşturup hem magmalinux.com’un cgi-bin dizinine hem de magmalinux.net’in cgi-bin dizinine atalım. Aşağıda Ruby dilinde yazılmış örnek bir betik var, deneme.rb isminde kaydedip bahsettiğimiz cgi-bin dizinlerine kopyalayın:
#!/usr/bin/ruby
print "Content-type: text/html;nn"
print "CGI deneme"
Test için tarayıcınızla http://www.magmalinux.com/cgi-bin/deneme.rb ve http://www.magmalinux.net/cgi-bin/deneme.rb sayfalarını ziyaret edin.
2.6 Çok Kullanılan Apache Modülleri
2.6.1 mod_userdir
mod_userdir, Apache’nin yüklü olduğu sunucudaki sistem kullanıcılarının, kendi ev (home) dizinlerindeki dosyaları Apache üzerinden yayınlayabilmesini sağlar.
mod_userdir modülünü aktif edelim:
# a2enmod userdir
Diyelim ki, Apache’nin yüklü sistemimizde, dogan isminde ev dizini /home/dogan olan bir kullanıcı var. Bu kullanıcının ev dizini içerisinde bir public_html dizini oluşturalım (dogan kullanıcısının ev dizininde işlem yaptığınızdan bu işlemi dogan kullanıcısı iken yapın):
$ mkdir /home/dogan/public_html
Şimdi bu dizine bir kaç dosya kopyalayıp, tarayıcımızla http://www.magmalinux.com/~dogan/ sayfasını ziyaret edelim.
mod_userdir ile ilgili ayarlama yapmak istiyorsanız (dizin için public_html yerine başka bir isim kullanmak gibi) /etc/apache2/mods-available/userdir.conf dosyasını düzenleyin. Varsayılan ayarlarıyla userdir.conf dosyası aşağıdakine benzer bir biçimdedir:
<IfModule mod_userdir.c>
UserDir public_html
UserDir disabled root
<Directory /home/*/public_html>
AllowOverride FileInfo AuthConfig Limit
Options MultiViews Indexes SymLinksIfOwnerMatch
</Directory>
</IfModule>
<IfModule> </IfModule> içerisindeki ilk satır, UserDir public_html, yayınlanmak üzere kullanıcıların ev dizinininde aranacak dizinin ismini belirtir (Bu adı değiştirdiğiniz taktirde, takip eden satırlardaki <Directory> yönergesini de uygun şekilde değiştirin). Bu satırda boşluklarla ayrılmış birden fazla dizin ya da URI belirtebilirsiniz. Apache, bir istek geldiğinde belirttiğiniz sıra ile aramaya başlayacak.
mod_userdir modülünü belirli kullanıcılar için kapatmak istiyorsanız (yukarıdaki örnekte olduğu gibi),
UserDir disabled root ahmet mehmet
şeklinde boşluklarla ayırarak belirtebilirsiniz. Ya da mod_userdir modülünü sadece belli kullanıcıların kullanabilmesini istiyorsanız:
UserDir disabled
UserDir enabled dogan enes
şeklinde kullanabilirsiniz.
2.6.2 mod_rewrite
mod_rewrite modülü, istekte bulunulan URL’yi düzenli ifadeler ile karşılaştırıp oldukça esnek yönlendirme kuralları tanımlamamızı sağlar.
mod_rewrite’ı aktif edelim:
# a2enmod rewrite
Deneylerimizi www.magmalinux.com sitesi üzerinde yapalım. Bunun için sites-available/www.magmalinux.com dosyamızı açıp, rewrite modülümüzü bu site için aktif hale getiriyoruz. Aşağıdaki satırı <VirtualHost *:80> </VirtualHost> etiketleri arasına ekleyelim:
RewriteEngine On
Test için yukarıda yazdığımız satırın altına, aşağıdaki kuralları ekleyelim:
RewriteRule ^/ping* /pong [R]
RewriteRule ^/user/(.*)$ /index.php?user=
İlk kuralımız, http://www.magmalinux.com/ping adresi isteklerini, http://www.magmalinux.com/pong adresine yönlendirecek. Sonraki [R] bayrağı, bu işlemin istemci tarafında yapılacağını belirtir. Yani istemci http://www.magmalinux.com/ping adresini istediği zaman, Apache cevap olarak bu sayfanın taşındığını (302 Moved) ve taşındığı adresi (http://www.magmalinux.com/pong) söyler. Tarayıcı da buna göre yeni adrese gider.
İkinci satırdaki örnek ise http://www.magmalinux.com/user/dogan gibi bir isteği http://www.magmalinux.com/index.php?user=dogan a dönüştürür (ikinci satırdaki , parantez içindeki düzenli ifade ile eşleşecek metin ile yer değiştirir. Birden fazla parantez ile gruplanmış düzenli ifadeniz varsa, bunlarla eşleşen metinleri, düzenli ifadedeki sıralarıyla , , ... referanslarını kullanarak elde edebilirsiniz. Ayrıntılı bilgi için, bir düzenli ifadeler kaynağına başvurun). Bu tip yönlendirmeleri kullanarak, web uygulamalarınız için çok daha temiz görünen URI’ler tanımlayabilirsiniz.
mod_rewrite’ı kullanırken logları takip etmek faydalı olabilir. mod_rewrite logları için log dosyasını ve log seviyesini aşağıdaki gibi ayarlayabiliriz (Ana ayar dosyaları ya da <VirtualHost> etiketi içerisinde):
RewriteLog "/var/log/apache2/rewrite_log"
RewriteLogLevel 3
2.7 Apache Çoklu Süreç Modülleri (Multi-Processing Module - MPM)
Apache MPM’ler, Apache’nin aynı anda birden fazla isteği sunucu tarafında nasıl gerçekleştireceği ile ilgili yöntemler sağlar. Her yeni gelen için ayrı bir süreç mi (process) ya da ayrı bir thread mi başlatılacağı kullanılan MPM’e bağlıdır.
2.7.1 MPM Prefork
Prefork MPM’i, Apache 1.3’te olduğu gibi, her gelen istek için ayrı bir süreç yaratır. Bu yüzden diğerlerine göre yavaş olsa da, bu MPM’in avantajı kararlılıktır. Her gelen isteği ayrı bir süreç cevapladığından, istekler birbirinden iyi bir şekilde yalıtılmıştır. Bu yüzden herhangi bir istekteki sorun, bir diğer isteği etkilemeyecektir. Uygulamalarında thread-safe olmayan kütüphaneler kullanan web siteleri için uygundur. Ayrıca, PHP uygulamaları yayını yapacaksanız, Prefork MPM’ini kullanmalısınız.
apache2.conf dosyasındaki Prefork MPM’inin ayarlarına göz atalım:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
StartServers: Apache’nin başlatılması sırasında oluşturulacak çocuk süreç sayısını belirler.
MinSpareServers: Herhangi bir anda gelebilecek isteklere karşı hazır, boşta bulunan minimum çocuk süreç sayısını belirler. Bu sayıdan az boşta bekleyen çocuk süreç olduğu durumda, Apache ana süreci boşta beklemesi için yeni çocuk süreçler yaratır.
MaxSpareServers: Herhangi bir anda gelebilecek isteklere karşı hazır, boşta bulunan maximum çocuk süreç sayısını belirler. Bu sayıdan fazla boşta bekleyen çocuk süreç olduğu durumda, Apache ana süreci fazla olan süreçleri öldürür.
MaxClients: Aynı anda hizmet verilecek istek sayısını belirler. Bu sayıdan fazla istek geldiğinde, bu istekler kuyruğa alınır (Kuyrukta bekletilecek maksimum istek sayısını ListenBacklog yönergesi ile ayarlayabilirsiniz).
MaxRequestsPerChild: Tek bir çocuk sürecin ömrü boyunca cevap verebileceği maksimum istek sayısını belirler. 0 değeri sınırsız anlamına gelir.
2.7.2 MPM Worker
Melez yapıya sahip bir MPM’dir. Her gelen istek için thread kullanmasının sağladığı hız ve hafızanın etkin kullanımı yanında, çoklu süreç yapısı sayesinde kararlılığını korur. Her süreç, isteklere cevap veren birden fazla threade sahiptir. Özellikle yüksek trafiğe sahip sunucularda kullanılması tavsiye edilir. Ayrıca, Debian’da varsayılan MPM’dir.
apache2.conf dosyasındaki Worker MPM’inin ayarlarına göz atalım:
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
StartServers: Apache’nin başlatılması sırasında oluşturulacak çocuk süreç sayısını belirler. Bu süreçlerden her biri ThreadsPerChild yönergesinde belirtilen kadar threade sahip olacaktır.
MaxClients: Aynı anda hizmet verilecek istek sayısını belirler. Bu sayıdan fazla istek geldiğinde, bu istekler kuyruğa alınır.
MinSpareThreads: Bütün süreçlerdeki toplam, minimum boştaki thread sayısını belirler (her sürecin sahip olması gereken boştaki minimum thread sayısını değil). Bu sayıdan az boşta bekleyen thread olduğu durumda, Apache bu sayıya ulaşana kadar yeni süreçler yaratır.
MaxSpareThreads: MinSpareThreads’e benzer şekilde, boştaki maksimum thread sayısını belirler.
ThreadsPerChild: Süreç başına yaratılacak thread sayısını belirler
Yönergeler
AllowOverride Yönergesi
AllowOverride yönergesi, <Location>, <DirectoryMatch> veya <Files> bölümlerinde değil, sadece düzenli ifade içermeyen <Directory> bölümlerinde geçerlidir.
Yönergeye değer olarak None belirtilirse .htaccess dosyaları tamamen yok sayılır. Bu durumda, sunucu dosya sisteminde rastladığı .htaccess dosyalarını okumaya dahi çalışmayacaktır. Bu yönergeye All değeri atanırsa, .htaccess bağlamında kullanılabilecek her yönergeye .htaccess dosyalarında izin verilir.
İki sebepten ötürü htaccess dosyalarına izin vermek istemeyebilirsiniz:
Birinci neden, size kaybettireceği performanstır. Apache bir dizinde .htaccess dosyası olmasa bile, bu dosyanın var olup olmadığını kontrol ederken vakit harcayacaktır ve her istek geldiğinde bu dosyanın içeriği tekrardan okunacaktır. Ayrıca Apache, .htaccess desteği verilmiş bütün üst dizinlerdeki htaccess dosyalarını kontrol edecektir (Örneğin /var/www/doc/ dizininin içindeki bir dosyaya istekte bulunulduğunu ve / dizinin bile .htaccess desteği olduğunu düşünelim. Apache sırasıyla /.htaccess, /var/.htaccess, /var/www/.htaccess, ve /var/www/doc/.htaccess dosyalarını okuyacaktır).
İkinci neden ise, .htaccess dosyası içerisinde gereğinden fazla yetki verdiğinizde (AllowOverride All gibi) oluşabilecek güvenlik sorunlarıdır.
Apache konfigrasyon dosyaları için gerekli yönergeler
Apache yapılandırma dosyası (apache2.conf) düzen açısından birden fazla dosyaya bölünmüştür.
Kabaca bu dosyalara göz atalım:
/etc/apache2/httpd.conf
Bu dosya boş gelir. Apache yöneticisinin ayarlarını tanımladığı dosyadır. Bu dosyanın içeriği ana apache yapılandırma dosyasına (apache2.conf) dahil edilecektir. Yani bu dosyaya yazılan her şey apache2.conf dosyasına yazılmış gibi davranılır. Bu yüzden, sistem yöneticilerinin apache2.conf yerine bu dosyayı değiştirmeleri tercih edilir.
/etc/apache2/apache2.conf
Apache 2 ana yapılandırma dosyasıdır. Apache servisi sürecinin temel ayarları, genel Apache ayarları, log ayarları gibi ayarları barındırır. Ayrıca parçalara bölünmüş bütün apache ayar dosyaları bu dosya içerisine aşağıdaki yönergeler vasıtasıyla dahil edilir:
# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
# Include all the user configurations:
Include /etc/apache2/httpd.conf
# Include ports listing
Include /etc/apache2/ports.conf
# Include generic snippets of statements
Include /etc/apache2/conf.d/
# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/
/etc/apache2/ports.conf
Dinlenen portların ayarlandığı dosyadır.
/etc/apache2/conf.d/
Yukarıda bahsedilen durumlar dışında bazı özel durumlara özgü ayarların ayrı ayrı dosyalar halinde tutulduğu dizindir. Bu dizin içindeki bütün dosyalar apache2.conf dosyasına dahil edilir.
/etc/apache2/mods-enabled/
Aktif edilen Apache modülleri ayar dosyalarının bulunduğu dizindir. Aslında bu ayar dosyaları /etc/apache2/mods-available/ dizininde durur. mods-enabled dizinindeki dosyalar gerçekte mods-available dizinindekilere birer sembolik linktir.
Bir Apache modülünü kaldırmak için ilgili modülün mods-enabled dizinindeki sembolik linkini silebilir ve bir Apache modülünü aktif hale getirmek için mods-enabled dizininden mods-available dizini içerisindeki ilgili modülün dosyalarına sembolik link oluşturabilirsiniz.
/etc/apache2/sites-enabled/
Aktif edilen Apache siteleri (sanal konak - virtual host) ayarlarının bulunduğu dizindir. mods-enabled dizinine benzer şekilde, sites-enabled dizinindeki dosyalar /etc/apache2/sites-available dizininde ilgili yerlere birer sembolik linktir. a2ensite ve a2dissite araçlarıyla sırasıyla bir siteyi faal hale getirebilir veya bir siteyi kaldırabilirsiniz.
.htaccess
Bu dosya, içinde bulunduğu dizin için geçerli olacak Apache ayarlarını tanımlar. Yani ana Apache ayar dosyasını değiştirmeden, web yöneticilerinin kendine ait dizinlerinin ayarlarını özelleştirebilmelerini sağlar. En son okunacak ayar dosyası olduğu için diğerlerinden baskındır ve bu dosyadaki değişikliklerin etkili olabilmesi için Apache’yi yeniden başlatmaya gerek yoktur. Ana Apache ayar dosyalarında AllowOverride None seçeneği ile .htaccess dosyaları etkisiz hale getirilebilir.
2.1 Debian Ön Tanımlı Yapılandırma Dosyalarının İncelenmesi
2.1.1 apache2.conf
apache2.conf dosyasının ana Apache ayar dosyası olduğundan bahsetmiştik. Apache servisi ile ilgili genel ayarların bulunduğu bu dosyaya biraz daha yakından bakalım:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
User www-data
Group www-data
AccessFileName .htaccess
HostnameLookups Off
KeepAlive yönergesi, kalıcı bağlantı özelliğini açıp kapatır. Aynı bağlantı üzerinden çok sayıda isteğin gönderilebilmesine izin vermek istiyorsak değeri On olmalı.
MaxKeepAliveRequest yönergesi, KeepAlive seçeneği açık iken, bağlantı başına kabul edilecek istek sayısını belirler. 0 değeri sonsuz anlamındadır. Yüksek performans (başarım) için yüksek değerler vermeniz tavsiye edilir.
KeepAliveTimeout yönergesi, sunucu kalıcı bir bağlantıyı kapatmadan önce, bir sonraki isteği kaç saniye bekleyeceğini belirler.
User ve Group yönergeleri Apache sürecini çalıştıracak kullanıcıyı ve grubu belirler. Seçtiğiniz kullanıcı ve grup, Apache’nin ilgilendiği dizinler üzerinde gerekli haklara sahip olmalıdır. Genellikle varsayılan değerleri değiştirmenize gerek yoktur.
AccessFileName yönergesi, meşhur .htaccess dosyası için farklı bir isim belirlemeye yarar.
HostnameLookups yönergesi, istemcinin IP adresinin DNS sistemi içerisinde tersine sorgulanıp alan adının bulunması isteniyorsa, On yapılmalıdır. İstemcinin adına (hostname) ihtiyaç duymayan sitelerde ağ trafiğini yormamak düşüncesi ile varsayılan değeri Off tur. Değeri On ise, bulunan ad, CGI çevre değişkenlerinden REMOTE_HOST’a aktarılır. Bir diğer değer olan Double ise IP adresini tersine sorguladıktan sonra, elde ettiği adı bir kez daha DNS sistemi içerisinde sorgular ve sonuçta elde edilen IP adresi istemcininkine eşit olup olmadığı kontrol edilir.
Eğer ayar dosyalarınızda Allow from Ceren Bilgisayar şeklinde alan adına göre erişim denetimi yapıyorsanız, HostnameLookups ayarının değerine bakılmaksızın çift yönlü (Double) DNS sorgusu yapılır.
HostnameLookups ve alan adına göre erişim denetimi gibi DNS sorgusu gerektiren işlemler, Apache’yi oldukça yavaşlatır. Bu yüzden, bu seçenekler gerçekten gerekiyorsa kullanılmalıdır.
ErrorLog yönergesi, hata loglarının hangi dosyaya yazılacağını belirler. Varsayılan /var/log/apache2/error.log dur.
LogLevel yönergesi, log seviyesini belirler. Hata ayıklama, test, ürün ortamınıza göre değiştirmeniz gerekebilir.
Ayar dosyalarındaki diğer yönergeler için daha ayrıntılı bilgiyi http://httpd.apache.org/docs/2.2/mod/quickreference.html adresinde bulabilirsiniz.
2.1.2 ports.conf
Apache’nin gelen istekler için dinleyeceği portların belirlendiği dosya. Varsayılan olarak içeriği genelde tek satırdan oluşur:
Listen 80
Listen yönergesi, Apache’nin dinleyeceği IP adresi ve portu belirler (Listen IPv4ort ya da Listen [IPv6]ort şeklinde belirtilebilir. IPv6 adresleri belirtilirken etrafına [] karakterleri konur). Eğer IP adresi belirtilmemişse, tüm arabirimlerin belirtilen portu dinlenecektir.
Birden fazla Listen yönergesine sahip olabilirsiniz (En az bir tane olmalı). Bu durumda Apache belirtilen portların (belirtilmişse IP’lerin) hepsini dinleyecektir. Örneğin ports.conf dosyanız şu şekilde olabilir:
Listen 80
Listen 81
Örneğin SSL bağlantıları için Apache’den 443 nolu portu dinlemesini isteyebilirsiniz:
Listen 80
Listen 443
Ya da sadece mod_ssl modülü yüklenmişse bu portu dinlemesini isteyebilirsiniz:
Listen 80
<IfModule mod_ssl.c>
Listen 443
</IfModule>
Varsayılan durumda mod_ssl aktif değilse, aktif hale getirmek için a2enmod ssl komutunu kullanın.
<IfModule modul_adi> etiketi içerisindeki yönergeler, modul_adi modülü yüklenmiş ise gerçekleştirilir.
2.2 Sanal Konaklar (Virtual Hosts)
Tek bir Apache HTTP sunucusunun, birden fazla web sitesine ayrı ayrı hizmet vermesini sağlayabiliriz. Örneğin magmalinux.com, magmalinux.net ve cerenbilgisayar.com.tr web siteleri birbirinden bağımsız bir şekilde aynı Apache sunucusu altında çalışabilir.
Her bir sanal konak için Apache sites-available dizini altında, bir dosya oluşturup ilgili sanal konak ayarlarını yapmak gerekir (Sanal konakların çalışabilmesi için istemcinin HTTP 1.1 protokolünü kullanıyor olması gerekir. Ayrıca alan adlarının ilgili DNS ayarlarını da yapmış olmalısınız).
2.2.1 www.magmalinux.com Alan adı için Sanal Konak
Öncelikle sites-available dizini içerisinde bir dosya oluşturup sanal konak tanımımızı bu dosya içinde yapalım. Sanak konak ayarlarının bulunacağı bu dosyaya istediğimiz ismi verebilsekte, anlaşılabilirlik ve düzen açısından dosyamıza www.magmalinux.com ismini verelim. www.magmalinux.com sanal konağı için temel ayarlarımız şu şekilde:
<VirtualHost *>
ServerName www.magmalinux.com
ServerAlias magmalinux.com
DocumentRoot "/srv/www/vhosts/www.magmalinux.com"
</VirtualHost>
ServerName, bu sanal konak için, internet tarayıcısında yazılan sunucu adıyla (www.magmalinux.com gibi) eşleşecek ismi belirler. www.magmalinux.com yerine sadece magmalinux.com yazıldığı zaman da bu sanal konağa erişilebilmesi için, bir de ServerAlias tanımladık. DocumentRoot ise, bu sanal konak için kök dizinimizi belirler (Yani http://www.magmalinux.com/ şeklinde istekte bulunulduğunda yayınlanacak içeriğin bulunduğu dizin). Bu örneğimizde, sanal konaklarımızın varsayılan web sitesinden ayrı olması gerekçesiyle /var/www yerine /srv/www/vhosts dizinini seçtik.
Dikkat! Bu sanal konağımızın çalışabilmesi için DNS sunucusunda magmalinux.com alan adı için gereken ayarlamalar yapılmış olmalıdır (Yani www.magmalinux.com ve magmalinux.com adresleri doğru bilgisayarlara işaret etmelidir). Sanal konak dosyasında yaptığınız bu ayarlar, DNS ayarlarınızı GERÇEKLEŞTİRMEZ. DNS ayarlamaları için bakınız http://belgeler.magmalinux.org/bind/.
Şimdi kök dizinimiz olan /srv/www/vhosts/www.magmalinux.com için bir takım ayarlar yapalım. İşletim sistemindeki dosya sisteminin bir parçası olan dizinler için yapılan ayarlar <Directory dizin_ismi> </Directory> etiketleri arasında bulunur. Örneğin:
<VirtualHost *>
ServerName www.magmalinux.com
ServerAlias magmalinux.com
DocumentRoot "/srv/www/vhosts/www.magmalinux.com"
<Directory "/srv/www/vhosts/www.magmalinux.com">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Gördüğünüz üzere /srv/www/vhosts/www.magmalinux.com dizini için <Directory> </Directory> etiketleri arasında bazı ayarlar var. Sırayla incelersek:
Options Indexes FollowSymLinks MultiViews satırı bu dizin için bir kaç seçeneği aktif etmiştir:
Indexes: Eğer bu dizin içerisinde DirectoryIndex yönergesinde belirtilen dosya (varsayılan index.html) mevcut değilse, dizinin içeriğini gösteren otomatik bir index yaratılır (mod_authindex tarafından) ve istemciye cevap olarak gönderilir.
FollowSymLinks: Apache’ye bir sembolik link ile karşılaştığı zaman bu linki takip etmesini söyler.
MultiViews: Diyelim ki, sunucunuzda /srv/www/vhosts/www.magmalinux.com altında bir ornek.php dosyası var ve siz bu dosyaya http://www.magmalinux.com/ornek seklinde de erismek istiyorsunuz (uzantıyı belirtmeden). MultiViews özelliği mod_negotiation modülünü kullanarak size bu desteği sağlar (Dikkat! Sunucuya http://www.magmalinux.com/ornek dosyasının isteği geldiğinde, istemcinin HTTP isteğinde gönderdiği Accept: değerine bakılarak, ornek dosyası aranır. Yani istemciniz HTTP isteğini gerçekleştirirken Accept: değerine sadece text/html girmiş ise, ornek dosyasına bakılırken, sadece ornek.html aranacak ve ornek.php bulunamayacak).
Yukarıdakilerin dışında Options yönergesine belirtebileceğiniz seçenekler:
ExecCGI: Aktif edildiği dizin içerisindeki çalıştırılabilir dosyaların, mod_cgi kullanılarak çalıştırılması sağlanır (Genelde bu seçenek, cgi-bin dizinleri için aktif hale getirilir). İlerleyen kısımlarda CGI kullanımı açıklanacaktır.
Includes: Aktif edildiği dizin içerisinde, SSI (Server Side Include) dosyaları çalıştırabilmeye izin verir. SSI, Apache tarafından sunulan basit bir betik dili gibi düşünülebilir. Bu konu, belgenin ilerleyen bölümlerinde ayrıntılandırılacaktır.
IncludesNOEXEC: SSI izni verilir fakat, SSI dosyaları içerisinden harici bir uygulama çağrılması yasaklanır.
SymLinksIfOwnerMatch: FollowSymLinks ile benzerdir. Ancak, sembolik linkin bulunduğu dizinin sahibi, sembolik linkin gösterdiği dosyanın (ya da dizinin) sahibi ile aynı ise, sunucu sembolik linki takip eder (Bu özelliğin açık olması durumunda, Apache her istek geldiğinde dizinin ve işaret edilen dosyanın sahibi kontrol edileceği için, SymLinksIfOwnerMatch özelliği sunucuyu yavaşlatan bir özelliktir. Sembolik linkleriniz için bu güvenlik gerekmiyorsa FollowSymLinks özelliğini tercih edin).
Tekrardan /srv/www/vhosts/www.magmalinux.com dizini için belirttiğimiz seçeneklere dönelim:
AllowOverride None seçeneği ise, hatırlandığı üzere, belirtilen dizin ve alt dizinleri için Apache’nin .htaccess dosyasını yorumlamasını kapatır (Alt dizin için başka bir AllowOverride belirtilene kadar).
Order allow,deny: Allow ve Deny talimatları ile anlamlıdır (Bu örneğimizde sadece Allow from all talimatı var). İzin sıralamasını belirler. Sıralama allow,deny ya da deny,allow olabilir. Eğer genel olarak erişime izin vermek, sadece belli durumlar için yasaklama getirmek istiyorsanız allow,deny sıralamasını; ya da eğer genel olarak erişimi yasaklamak, sadece belli durumlar için izin vermek istiyorsanız deny,allow sıralamasını kullanın.
Allow from all: Allow talimatı dizine erişimine izin verilecek bilgisayarları belirler. İkinci parametresi daima from dur. Allow from all herkese izin verir. Alan adına (Ters DNS sorgusu gerektirir), IP adresine ya da bir çevresel değişkenin değerine göre erişim iznini ayarlayabilirsiniz. Ayrıntılarından ilerleyen kısımlarda bahsedilecektir.
Dosyayı inceledikten sonra, şimdi sites-available daki bu siteyi işler hale getirmek için
# a2ensite www.magmalinux.com
komutunu kullanalım (ya da elle, sites-available dizinindeki magmalinux.com dosyasına sites-enabled dizininden sembolik link oluşturun). a2ensite komutuna verdiğimiz parametre, sites-available dizininde oluşturduğumuz dosyanın ismi olduğuna dikkat edin. Yapılan değişikliklerin etkili olabilmesi için Apache’yi yeniden başlatmalıyız:
# /etc/init.d/apache2 restart
2.2.2 www.magmalinux.net Alan adı için Sanal Konak
Aynı Apache sunucusu içerisinde bir de magmalinux.net alan adı için hizmet verelim (Tekrar Dikkat! magmalinux.net alan adına gelen isteğin Apache’ye ulaşabilmesi için öncelikle DNS sunucunuz bu alan adı için yapılandırılmış olmalı). Yine sites-available dizini altında www.magmalinux.net sanal konağı için ayarların duracağı www.magmalinux.net isminde bir dosya oluşturalım ve içeriğini aşağıdaki gibi dolduralım:
<VirtualHost *:80>
ServerName www.magmalinux.net
ServerAlias magmalinux.net
DocumentRoot "/srv/www/vhosts/www.magmalinux.net"
<Directory "/srv/www/vhosts/www.magmalinux.net">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName doc.magmalinux.net
DocumentRoot "/srv/www/vhosts/doc.magmalinux.net"
<Directory "/srv/www/vhosts/doc.magmalinux.net">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Örnek olması açısından www.magmalinux.net dosyası içerisinde www.magmalinux.net ve doc.magmalinux.net olmak üzere iki tane sanal konak tanımladık. Şimdi www.magmalinux.net web sitesini aktif hale getirmek için:
# a2ensite www.magmalinux.net
# /etc/init.d/apache2 restart
komutlarını çalıştıralım.
2.2.3 mod_vhost_alias
Aynı Apache HTTP sunucusu altında çok fazla web sitesi varsa, her biri için yukarıdaki ayarları yapmaktan sıkılabilirsiniz. Şimdi bizi bu dertten kurtaracak olan mod_vhost_alias modülünü inceleyelim.
Modülümüzü etkinleştirmeden önce mods-available dizini altında vhost_alias.conf dosyası oluşturalım. Bu dosyanın en basit içeriği şu şekilde olabilir:
UseCanonicalName Off
VirtualDocumentRoot /srv/www/vhosts/%0
VirtualDocumentRoot /srv/www/vhosts/%0 satırındaki %0, tam alan adını belirtmektedir (www.magmalinux.com, doc.magmalinux.net gibi). Eğer istenirse tam alan adının belli parçaları da kullanılabilir. Örneğin alan adının soldan ikinci parçası (magmalinux) belirtilmek isteniyorsa %2, sağdan 1. parçası (com) isteniyorsa %-1 ya da sondan 2 kısım (magmalinux.com) isteniyorsa %2+ kullanılabilir.
Dosyayı kaydettikten sonra vhost_alias modülünü aktikleştirelim ve değişikliklerin geçerli olması için Apache’yi yeniden başlatalım:
# a2enmod vhost_alias
# /etc/init.d/apache2 restart
2.3 Apache Yapılandırma Dosyaları Söz Dizimi
Apache yapılandırma dosyalarında HTML elementlerine benzer, kendi içerisinde birden fazla yönerge içeren bazı yönergeler vardır (<Directory> </Directory> gibi). Bu tip yönergelere kap (container) denir. Şimdi bunlardan bir kaçını inceleyelim.
2.3.1 <Directory>
İşletim sisteminin dosya sistemindeki belli bir dizin ve onun alt dizinleri için yapılandırmaları (yönergeleri) tutar. Örneğin:
<Directory /var/www>
Options FollowSymLinks
AllowOverride None
</Directory>
Dizin yolu içerisinde joker karakterde belirtebilirsiniz (Hatırlatma: ? joker karakteri tek bir harf eşleşmesi için, * karakteri herhangi bir karakter dizisi için, [] karakterleri aralık için kullanılabilir. Yeri gelmişken ’/’ karakteri hiçbir joker karakteri ile eşleşmez). Örneğin:
<Directory /srv/www/vhosts/*/doc>
Options FollowSymLinks
AllowOverride None
</Directory>
2.3.2 <DirectoryMatch>
DirectoryMatch, Directory ile hemen hemen aynıdır. Directory’nin sağladıklarının yanında düzenli ifade desteği sağlar (Directory’yi kullanarak <Directory ~ duzenli_ifade> şeklinde düzenli ifade belirtebilsekte, ve bu işlemin yeni yolu DirectoryMatch’tir). Bir örnek incelersek:
<DirectoryMatch "/srv/www/vhosts/^www.*com$">
Options FollowSymLinks
AllowOverride None
</DirectoryMatch>
Örnekteki düzenli ifade, www ile başlayan com ile biten dizinler ile eşleşecektir.
2.3.3 <Files>
Bazı dosyalara özel yapılandırma yapmak için kullanılır. Örneğin:
<Files gizli.html>
Order deny,allow
Deny from all
</Files>
Yukarıdaki yapılandırma, gizli.html dosyasının hangi dizinde olduğuna bakılmaksızın, bu dosyaya erişimi engeller. <Files /var/www/gizli.html> şeklinde belirtilse bile, dikkate alınacak kısım yolun son parçası olan gizli.html olduğu için yukarıdaki örnekten farkı yoktur. Eğer sadece belli bir dizin içerisindeki gizli.html dosyası ile ilgili yapılandırma yapmak gerekirse, <Files> kabı, <Directory> içerisinde kullanılabilir. Örneğin:
<Directory /var/www>
<Files gizli.html>
Order deny,allow
Deny from all
</Files>
</Directory>
2.3.4 <FilesMatch>
FilesMatch, Files ile benzer olmasına karşın, dosya ismi içerisinde düzenli ifade kullanabilmemizi sağlar (<Files> ile de <Files ~ duzenli_ifade> şeklinde düzenli ifade kullanabiliyor olsakta, düzenli ifade kullanmanın yeni yolu FilesMatch’tir).
Örnek bir FilesMatch kullanımı şöyle olabilir:
<FilesMatch ".(png|jpe?g|png)$">
SetEnvIfNoCase Referer "^http://.*.magmalinux.(com|net)" local=1
Order allow,deny
Allow from env=local
</Files>
Yukarıdaki yapılandırma, gelen istekteki Referer adresi magmalinux.com ya da magmalinux.net değilse; png, jpeg ve png dosyalarına erişimi yasaklar.
2.3.5 <Location>
Directory’de olduğu gibi dosya sistemindeki kök dizinden başlayan dizinler için ayarlama yapmak yerine, Apache’nin sunduğu web sitesinin kök dizininden başlayan dizinler için ayarlama yapmak istiyorsanız Location kullanabilirsiniz. Kısaca Location size, Apache’nin sunduğu web sitesinin kök dizinini taban alıp, buna göreceli dizinler için ayarlamalar yapmanızı sağlar. Örneğin:
<Location /cgi-bin>
Options ExecCGI
</Location>
Yukarıdaki yapılandırma, işletim sistemindeki / dizinin altında cgi-bin dizini değil, Apache’nin sunduğu web sitesinin kök dizini altındaki cgi-bin dizini içindir.
<Location> benzeri, düzenli ifade belirtebildiğimiz bir de <LocationMatch> vardır. Kullanım şekli <FilesMatch> veya <DirectoryMatch> ile aynıdır.
2.3.6 Options
Sanal konaklarımızı ayarlarken Options yönergesinden bahsetmiştik. <Directory> kabı ile bir dizin için belirttiğimiz özellikler, alt dizinlere de uygulandığından, bir dizin için birden fazla Options tanımlandığı durum oluşabilir. Örneğin:
<Directory "/var/www">
Options Indexes
</Directory>
<Directory "/var/www/altdizin">
Options Include ExecCGI
</Directory>
Yukarıdaki örnekte /var/www/altdizin için kullandığımız Options yönergesi, üst dizindeki Options yönergesinin üzerine yazacak. Yani /var/www/altdizin için Indexes seçeneği aktif olmayacak. Eğer bir dizin için Options yönergesinde belirttiğimiz seçeneklerden birinin, üst dizindeki ayarlamalara eklenmesini istiyorsak, Options yönergesindeki o seçeneğin başına + işareti koymalıyız (eğer üst dizindeki ayarlamalardan çıkarılmasını istiyorsak başına - işareti koymalıyız). Örneğin:
<Directory "/var/www">
Options Indexes MultiViews
</Directory>
<Directory "/var/www/altdizin">
Options +Include +ExecCGI -MultiViews
</Directory>
2.3.7 Alias
Bir web sitesinin kök dizini ağacının içerisinde bulunmayan bir dizini kök dizininin içerisine dahil etmeye yarar. Aslında temelde yaptığı şey, dosya sistemi içerisindeki bir dizin için web sitesi üzerinde bir takma ad tanımlamaktır. Örneğin:
Alias /doc /usr/share/doc
Yukarıdaki tanımı sites-available/www.magmalinux.com dosyası içerisinde <VirtualHost *:80> </VirtualHost> kapları arasında yaptığımızda, istemci http://www.magmalinux.com/doc içeriğini istediği zaman, cevap olarak /usr/share/doc içeriği gönderilir.
Alias kullanırken dizin adreslerinin sonunda / karakteri olup olmamasına dikkat edin. Eğer
Alias /doc/ /usr/share/doc
biçiminde kullanılmış olsaydı, bu Alias http://www.magmalinux.com/doc isteği için geçerli olmazdı. Alias tanımında /doc kısmında sona / koymadığımızda, Alias hem /doc hem de /doc/ için geçerli olur.
2.3.8 AliasMatch
Yaptığı iş Alias ile aynıdır. Takma ad için düzenli ifadeleri destekler. Örneğin:
AliasMatch ^/doc-(.*) /usr/share/doc/
http://www.magmalinux.com/doc-apache2 adresine istek gelmiş ise, bu istek tanımladığımız alias ile eşlecek ve kullanıcıya /usr/share/doc/apache2 içeriği gösterilecek (Alias tanımındaki , parantez içindeki düzenli ifade ile eşleşen metni verir).
2.3.9 Redirect
Belirlenen bir dosya (ya da dizin) istendiğinde istemciyi başka bir adrese yönlendirmeye yarar. Örneğin:
Redirect /doc http://doc.magmalinux.net/
Ana apache ayar dosyalarında, <VirtualHost>, <Directory> etiketleri içerisinde ya da .htaccess dosyasında belirtilebilir.
2.3.10 RedirectMatch
Redirect ile aynı olmasının yanında, düzenli ifadeleri destekler. Debian standart varsayılan web sayfasındaki (sites-available/default) örneğe bakalım:
RedirectMatch ^/$ /apache2-default/
2.4 Apache SSL
Apache SSL servisimiz için ilk olarak sertifika oluşturmamız gerekiyor. Eğer elinizde satın aldığınız hazır sertifika varsa bu aşamayı atlayabilirsiniz. Biz bu örneğimizde, OpenSSL yazılımıyla 10 yıl boyunca geçerli olacak bir sertifika oluşturacağız:
# openssl req -new -x509 -days 3650 -nodes -out apache.pem -keyout apache.pem
komutunu çalıştırdığımızda karşımıza sertifikamız için bir takım sorular gelecek. Bu sorulardan bizim için en önemli olanları, PassPhrase ve CommonName. PassPhrase, sertifikamız için gireceğimiz parola (PassPhrase’in Password’den farkı, daha uzun olabilmesiydi. Eski UNIX’lerde Password’ün en fazla 8 karakter olduğundan, 8 karakterden uzun parolalara PashPhrase deniyordu), CommonName ise web sitemize erişilirken girilen alan adı bilgisi olacak (Örneğin www.magmalinux.com).
Şimdi oluşan apache.pem dosyasını (ya da satın aldığımız sertifikayı) /etc/apache2/ dizinine kopyalayalım (apache.pem dosyasını /etc/apache2 dizinine kopyalamak gibi bir zorunluluk bulunmamaktadır. Biz sadece örnek olarak bu dizini seçtik. Farklı bir dizin kullanırsanız, ilerleyen kısımlardaki ayar dosyalarını kendinize göre değiştirmeniz gerekecek).
Sıra, bu SSL sertifikasının kullanılacağı web sitesini yaratma kısmına geldi. Bunun için sanal konaklar kısmında edindiğimiz bilgileri hatırlayalım. Önce sites-available dizini altında bir dosya oluşturup (örneğin www.magmalinux.com-ssl), içini aşağıdakine benzer bir biçimde dolduralım:
NameVirtualHost *:443
<VirtualHost *:443>
ServerName www.magmalinux.com
SSLEngine on
SSLCertificateFile /etc/apache2/apache.pem
DocumentRoot /srv/www/www.magmalinux.com
# ...
# ...
</VirtualHost>
Bu dosya da bizim için önemli olan SSLEngine ve SSLCertificateFile yönergeleri. Adlarından da anlaşılacağı üzere SSLEngine yönergesi, bu web sitesi için SSL’i aktif ederken, SSLCertificateFile yönergesi de sertifika dosyasının yolunu belirtir.
Son olarak ports.conf dosyamıza, Apache’ye, HTTP üzerinden SSL bağlantısı için kullanılan varsayılan 443 numaralı portu dinlemesini söylüyoruz. Örnek ports.conf dosyamız:
Listen 80
Listen 443
şeklinde olabilir. Bütün bu işlemler bittikten sonra, değişikliklerin geçerli olabilmesi için, Apache’yi yeniden başlatalım:
# /etc/init.d/apache2 restart
2.5 Dinamik İçerikli Web Sayfaları
Temelde Web sunucusu, istemciden gelen isteklere göre, sunucuda bulunan bir dosyayı istemciye gönderirken, bu dosya içerisinde hiç bir değişiklik yapmaz. Dosya içeriklerinin statik olduğu bu durumda, çeşitli kullanıcılara özel ya da çeşitli durumlara özel, dinamik içerik oluşturmak söz konusu olamaz. Bu durum Web’in kullanımı için büyük bir kısıtlamadır.
2.5.1 SSI
SSI (Server Side Include - Sunucu Taraflı İçerik) dosyaları, sunucu tarafında dinamik içerik oluşturmanın en ilkel yoludur. SSI kullanılarak bir HTML dosyasına alt ve üst bilgi, sunucudaki bir uygulamanın çıktısı, çevresel değişkenlere erişim gibi bir takım ilkel dinamik içerik oluşturulabilir. SSI dosyalarının varsayılan uzantısı .shtml dir (Tabi uygun bir yapılandırılma ile başka bir uzantı da kullanılabilir).
Apache’nin SSI desteğini açmak için öncelikle mod_include modülünü aktif edelim:
# a2enmod include
Daha sonra web sitemiz içerisinde bir dizin oluşturup, bu dizin içerisinde SSI dosyalarının işlenmesine izin verelim. Bu örnek için www.magmalinux.com web sitesini seçelim. İlk olarak SSI dizinimizi oluşturalım:
# mkdir /srv/www/vhosts/www.magmalinux.com/ssi
Şimdi sites-available/www.magmalinux.com dosyasını açıp <VirtualHost *:80> </VirtualHost> kapları arasına aşağıdakileri girelim:
<Location /ssi>
Options +Includes
</Location>
Options yönergesindeki Includes seçeneğinin, belirtilen dizin için SSI desteğini aktifleştirdiğini hatırlayınız.
Yaptığımız değişikliklerden sonra Apache’yi yeniden başlatalım:
# /etc/init.d/apache2 restart
Şimdi yazacağımız SSI dosyalarının içeriğinden kısaca bahsedelim. Bir SSI dosyasının HTML dosyasından hiç bir farkı yoktur. SSI komutları HTML yorum satırları arasına yazılır. Bir SSI komutunun yapısı şu şekildedir:
<!--#komut parametre="deger" -->
Örnek bir deneme.shtml dosyası yazıp, /srv/www/vhosts/www.magmalinux.com/ssi/ dizinine kopyalayalım:
<!--#include virtual="ust.html"-->
<br />
Orta <br />
<!--#exec cmd="ls -F" -->
<br />
<!--#include virtual="alt.html"-->
include komutu başka bir dosyayı dahil eder. exec ise .shtml dosyası içerisinden harici bir uygulama çalıştırıp, uygulamanın çıktısını bu .shtml dosyasına yazar. exec komutunun sonucu olarak, sunucu tarafında çalışan bir uygulamanın çıktısı istemciye gönderilmiş olur.
Bir başka komut olan echo belli bir çevresel değişkenin değerini almada kullanılır. Örnek kullanımı:
<!--#echo var="REMOTE_ADDR" -->
SSI dosyaları içerisinde basit if-else ifadeleri de kullanabilirsiniz. Biz bu belge de bunun ayrıntısına girmeyeceğiz. SSI hakkında daha ayrıntılı bilgi almak için, mod_include - Apache HTTP Server adresine bakınız.
2.5.2 CGI
CGI (Common Gateway Interface - Ortak Geçit Arayüzü) bize, sunucu tarafında uygulama çalıştırıp, bu uygulamanın çıktısının istemciye gönderilmesini ve istemciden bu uygulamaya bir takım verilerin aktarılmasını sağlar. Bu bize, kullanıcıya göre dinamik içerik oluşturmayı sağlar.
CGI’ın ilk günlerinde, CGI kelimesinin her geçtiği yerde Perl kelimesini görsekte; CGI’ın Perl dili ile pek bir alakası yoktur. CGI bize, istemciden gelen bir takım bilgilerin sunucu tarafındaki harici bir uygulamaya aktarılıp, bu uygulamanın ürettiği çıktının istemciye geri gönderilmesini sağlar. Sunucu tarafında çalışacak, web üzerinden gelen isteklere göre davranacak harici uygulama yazılırken, yoğunlukla Perl dili kullanıldı. Sunucu tarafında çalıştırdığımız bu harici uygulama Perl dışında herhangi bir betik dili olabileceği gibi (PHP, Python, Ruby ...), C ile yazılıp derlenmiş bir uygulama da olabilir (Zaten bir betik dilini çalıştırabiliyorsanız, bu betik dilini yorumlayacak olan uygulama makina koduna dönüştürülmüş bir uygulama olacağından; direk makina koduna dönüştürülmüş bir uygulamayı da çalıştırabilmek şaşırtıcı bir durum değil).
Günümüzde, CGI’ın tarihe gömüldüğü gibi bir yanlış anlayış vardır. CGI’ın hızı PHP ve Java dillerinde yazılan web uygulamaları ile karşılaştırılır. CGI’ın sunucu tarafında çalıştırdığı uygulama bir PHP ya da Java uygulaması da olabilir. Aslında CGI içerisinde, herhangi bir dilde yazılmış bir uygulamayı çalıştırmak ile PHP web uygulamasını çalıştırmak arasındaki tek fark, Apache sunucusunda php programlarına gelen her istek için ayrı bir php yorumlayıcısı çalıştırılmasını önleyen mod_php modülüdür. Bu sayede, aşırı istek alan bir web sunucusu her CGI isteği için ayrı bir PHP süreci başlatmayacağından, sunucunun belleği daha etkin kullanılmış olur.
Şimdi sunucuda çalışacak harici programlarımızın bulunacağı dizin için gerekli Apache ayarlarını yapalım. Bunu sağlamanın iki yolu var.
Birinci yol:
Birinci yol için www.magmalinux.com web sitemizi kullanalım. Öncelikle cgi uygulamalarının bulunacağı dizini oluşturalım:
# mkdir /srv/www/vhosts/www.magmalinux.com/cgi-bin
Dizinin ismini cgi-bin olarak belirtmek zorunda değilsiniz. Biz geleneklere bağlı kalarak bu ismi seçtik. Şimdi sites-available/www.magmalinux.com dosyamızı açıp <VirtualHost *:80> </VirtualHost> kapları arasında herhangi bir yere aşağıdakileri girelim:
ServerAlias /cgi-bin/ /srv/www/vhosts/www.magmalinux.com/cgi-bin/
ServerAlias, Alias’a benzer biçimde davranır. Farkı ise, Apache ServerAlias’ta belirtilen dizin içindekilerin hepsini çalıştırılabilir dosya olarak düşünür. Bu dizindeki herhangi bir dosyaya bir istek geldiğinde, Apache bu dosyayı çalıştırmayı dener.
İkinci yol:
İkinci yol için www.magmalinux.net sayfamızı kullanalım. İlk olarak, www.magmalinux.net sitemizin kök dizininde cgi-bin dizinimizi oluşturalım:
# mkdir /srv/www/vhosts/www.magmalinux.net/cgi-bin
Ardından, sites-available/www.magmalinux.net dosyamızda, <VirtualHost *:80> </VirtualHost> kapları arasına aşağıdakileri ekleyelim:
AddHandler cgi-script .pl .cgi .rb
<Location /cgi-bin>
Options +ExecCGI
</Location>
AddHandler yönergesi, Apache’ye .pl, .cgi ve .rb uzantılı dosyaları cgi-scripti olarak ele almasını söyler.
Şimdi seçtiğimiz bu iki yöntemi de test etmek için, bir betik oluşturup hem magmalinux.com’un cgi-bin dizinine hem de magmalinux.net’in cgi-bin dizinine atalım. Aşağıda Ruby dilinde yazılmış örnek bir betik var, deneme.rb isminde kaydedip bahsettiğimiz cgi-bin dizinlerine kopyalayın:
#!/usr/bin/ruby
print "Content-type: text/html;nn"
print "CGI deneme"
Test için tarayıcınızla http://www.magmalinux.com/cgi-bin/deneme.rb ve http://www.magmalinux.net/cgi-bin/deneme.rb sayfalarını ziyaret edin.
2.6 Çok Kullanılan Apache Modülleri
2.6.1 mod_userdir
mod_userdir, Apache’nin yüklü olduğu sunucudaki sistem kullanıcılarının, kendi ev (home) dizinlerindeki dosyaları Apache üzerinden yayınlayabilmesini sağlar.
mod_userdir modülünü aktif edelim:
# a2enmod userdir
Diyelim ki, Apache’nin yüklü sistemimizde, dogan isminde ev dizini /home/dogan olan bir kullanıcı var. Bu kullanıcının ev dizini içerisinde bir public_html dizini oluşturalım (dogan kullanıcısının ev dizininde işlem yaptığınızdan bu işlemi dogan kullanıcısı iken yapın):
$ mkdir /home/dogan/public_html
Şimdi bu dizine bir kaç dosya kopyalayıp, tarayıcımızla http://www.magmalinux.com/~dogan/ sayfasını ziyaret edelim.
mod_userdir ile ilgili ayarlama yapmak istiyorsanız (dizin için public_html yerine başka bir isim kullanmak gibi) /etc/apache2/mods-available/userdir.conf dosyasını düzenleyin. Varsayılan ayarlarıyla userdir.conf dosyası aşağıdakine benzer bir biçimdedir:
<IfModule mod_userdir.c>
UserDir public_html
UserDir disabled root
<Directory /home/*/public_html>
AllowOverride FileInfo AuthConfig Limit
Options MultiViews Indexes SymLinksIfOwnerMatch
</Directory>
</IfModule>
<IfModule> </IfModule> içerisindeki ilk satır, UserDir public_html, yayınlanmak üzere kullanıcıların ev dizinininde aranacak dizinin ismini belirtir (Bu adı değiştirdiğiniz taktirde, takip eden satırlardaki <Directory> yönergesini de uygun şekilde değiştirin). Bu satırda boşluklarla ayrılmış birden fazla dizin ya da URI belirtebilirsiniz. Apache, bir istek geldiğinde belirttiğiniz sıra ile aramaya başlayacak.
mod_userdir modülünü belirli kullanıcılar için kapatmak istiyorsanız (yukarıdaki örnekte olduğu gibi),
UserDir disabled root ahmet mehmet
şeklinde boşluklarla ayırarak belirtebilirsiniz. Ya da mod_userdir modülünü sadece belli kullanıcıların kullanabilmesini istiyorsanız:
UserDir disabled
UserDir enabled dogan enes
şeklinde kullanabilirsiniz.
2.6.2 mod_rewrite
mod_rewrite modülü, istekte bulunulan URL’yi düzenli ifadeler ile karşılaştırıp oldukça esnek yönlendirme kuralları tanımlamamızı sağlar.
mod_rewrite’ı aktif edelim:
# a2enmod rewrite
Deneylerimizi www.magmalinux.com sitesi üzerinde yapalım. Bunun için sites-available/www.magmalinux.com dosyamızı açıp, rewrite modülümüzü bu site için aktif hale getiriyoruz. Aşağıdaki satırı <VirtualHost *:80> </VirtualHost> etiketleri arasına ekleyelim:
RewriteEngine On
Test için yukarıda yazdığımız satırın altına, aşağıdaki kuralları ekleyelim:
RewriteRule ^/ping* /pong [R]
RewriteRule ^/user/(.*)$ /index.php?user=
İlk kuralımız, http://www.magmalinux.com/ping adresi isteklerini, http://www.magmalinux.com/pong adresine yönlendirecek. Sonraki [R] bayrağı, bu işlemin istemci tarafında yapılacağını belirtir. Yani istemci http://www.magmalinux.com/ping adresini istediği zaman, Apache cevap olarak bu sayfanın taşındığını (302 Moved) ve taşındığı adresi (http://www.magmalinux.com/pong) söyler. Tarayıcı da buna göre yeni adrese gider.
İkinci satırdaki örnek ise http://www.magmalinux.com/user/dogan gibi bir isteği http://www.magmalinux.com/index.php?user=dogan a dönüştürür (ikinci satırdaki , parantez içindeki düzenli ifade ile eşleşecek metin ile yer değiştirir. Birden fazla parantez ile gruplanmış düzenli ifadeniz varsa, bunlarla eşleşen metinleri, düzenli ifadedeki sıralarıyla , , ... referanslarını kullanarak elde edebilirsiniz. Ayrıntılı bilgi için, bir düzenli ifadeler kaynağına başvurun). Bu tip yönlendirmeleri kullanarak, web uygulamalarınız için çok daha temiz görünen URI’ler tanımlayabilirsiniz.
mod_rewrite’ı kullanırken logları takip etmek faydalı olabilir. mod_rewrite logları için log dosyasını ve log seviyesini aşağıdaki gibi ayarlayabiliriz (Ana ayar dosyaları ya da <VirtualHost> etiketi içerisinde):
RewriteLog "/var/log/apache2/rewrite_log"
RewriteLogLevel 3
2.7 Apache Çoklu Süreç Modülleri (Multi-Processing Module - MPM)
Apache MPM’ler, Apache’nin aynı anda birden fazla isteği sunucu tarafında nasıl gerçekleştireceği ile ilgili yöntemler sağlar. Her yeni gelen için ayrı bir süreç mi (process) ya da ayrı bir thread mi başlatılacağı kullanılan MPM’e bağlıdır.
2.7.1 MPM Prefork
Prefork MPM’i, Apache 1.3’te olduğu gibi, her gelen istek için ayrı bir süreç yaratır. Bu yüzden diğerlerine göre yavaş olsa da, bu MPM’in avantajı kararlılıktır. Her gelen isteği ayrı bir süreç cevapladığından, istekler birbirinden iyi bir şekilde yalıtılmıştır. Bu yüzden herhangi bir istekteki sorun, bir diğer isteği etkilemeyecektir. Uygulamalarında thread-safe olmayan kütüphaneler kullanan web siteleri için uygundur. Ayrıca, PHP uygulamaları yayını yapacaksanız, Prefork MPM’ini kullanmalısınız.
apache2.conf dosyasındaki Prefork MPM’inin ayarlarına göz atalım:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
StartServers: Apache’nin başlatılması sırasında oluşturulacak çocuk süreç sayısını belirler.
MinSpareServers: Herhangi bir anda gelebilecek isteklere karşı hazır, boşta bulunan minimum çocuk süreç sayısını belirler. Bu sayıdan az boşta bekleyen çocuk süreç olduğu durumda, Apache ana süreci boşta beklemesi için yeni çocuk süreçler yaratır.
MaxSpareServers: Herhangi bir anda gelebilecek isteklere karşı hazır, boşta bulunan maximum çocuk süreç sayısını belirler. Bu sayıdan fazla boşta bekleyen çocuk süreç olduğu durumda, Apache ana süreci fazla olan süreçleri öldürür.
MaxClients: Aynı anda hizmet verilecek istek sayısını belirler. Bu sayıdan fazla istek geldiğinde, bu istekler kuyruğa alınır (Kuyrukta bekletilecek maksimum istek sayısını ListenBacklog yönergesi ile ayarlayabilirsiniz).
MaxRequestsPerChild: Tek bir çocuk sürecin ömrü boyunca cevap verebileceği maksimum istek sayısını belirler. 0 değeri sınırsız anlamına gelir.
2.7.2 MPM Worker
Melez yapıya sahip bir MPM’dir. Her gelen istek için thread kullanmasının sağladığı hız ve hafızanın etkin kullanımı yanında, çoklu süreç yapısı sayesinde kararlılığını korur. Her süreç, isteklere cevap veren birden fazla threade sahiptir. Özellikle yüksek trafiğe sahip sunucularda kullanılması tavsiye edilir. Ayrıca, Debian’da varsayılan MPM’dir.
apache2.conf dosyasındaki Worker MPM’inin ayarlarına göz atalım:
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
StartServers: Apache’nin başlatılması sırasında oluşturulacak çocuk süreç sayısını belirler. Bu süreçlerden her biri ThreadsPerChild yönergesinde belirtilen kadar threade sahip olacaktır.
MaxClients: Aynı anda hizmet verilecek istek sayısını belirler. Bu sayıdan fazla istek geldiğinde, bu istekler kuyruğa alınır.
MinSpareThreads: Bütün süreçlerdeki toplam, minimum boştaki thread sayısını belirler (her sürecin sahip olması gereken boştaki minimum thread sayısını değil). Bu sayıdan az boşta bekleyen thread olduğu durumda, Apache bu sayıya ulaşana kadar yeni süreçler yaratır.
MaxSpareThreads: MinSpareThreads’e benzer şekilde, boştaki maksimum thread sayısını belirler.
ThreadsPerChild: Süreç başına yaratılacak thread sayısını belirler
Yönergeler
AllowOverride Yönergesi
AllowOverride yönergesi, <Location>, <DirectoryMatch> veya <Files> bölümlerinde değil, sadece düzenli ifade içermeyen <Directory> bölümlerinde geçerlidir.
Yönergeye değer olarak None belirtilirse .htaccess dosyaları tamamen yok sayılır. Bu durumda, sunucu dosya sisteminde rastladığı .htaccess dosyalarını okumaya dahi çalışmayacaktır. Bu yönergeye All değeri atanırsa, .htaccess bağlamında kullanılabilecek her yönergeye .htaccess dosyalarında izin verilir.
İki sebepten ötürü htaccess dosyalarına izin vermek istemeyebilirsiniz:
Birinci neden, size kaybettireceği performanstır. Apache bir dizinde .htaccess dosyası olmasa bile, bu dosyanın var olup olmadığını kontrol ederken vakit harcayacaktır ve her istek geldiğinde bu dosyanın içeriği tekrardan okunacaktır. Ayrıca Apache, .htaccess desteği verilmiş bütün üst dizinlerdeki htaccess dosyalarını kontrol edecektir (Örneğin /var/www/doc/ dizininin içindeki bir dosyaya istekte bulunulduğunu ve / dizinin bile .htaccess desteği olduğunu düşünelim. Apache sırasıyla /.htaccess, /var/.htaccess, /var/www/.htaccess, ve /var/www/doc/.htaccess dosyalarını okuyacaktır).
İkinci neden ise, .htaccess dosyası içerisinde gereğinden fazla yetki verdiğinizde (AllowOverride All gibi) oluşabilecek güvenlik sorunlarıdır.