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.

Kaynaklar

Yorumunuzu Ekleyin


Yükleniyor...
Yükleniyor...