B
bEbeQ
Misafir
Evet arkadaşlar apacheniz cok yavaş ise aşagıdaki uygulayın % 70 gibi performans artışı görürsünüz.İlk başta bende inanmıyordum uyguladım ve mükemmel sonuç aldım
Sembolik bağlarla (symbolic links) ilgili ayarlar
Apache, kullanıcı tarafından istenen bir dizin ya da dosyayı işlerken, bir sembolik bağ olup olmadığını inceleyebilir. Apache'nin varsayılan ayarlarında Option FollowSymLinks vardır. Güvenliği düşünen sistem yöneticileri bunu genellikle Option None ya da Option SymLinksIfOwnerMatch yapmaktadır. Ancak bu hızı düşürmektedir. En yüksek performans Option FollowSymLinks yönergesiyle alınmaktadır.
Option SymLinksIfOwnerMatch durumu
Apache bu yönergeyle, normale göre istenen dizinin/dosyanın bir sembolik bağ olup olmadığını kontrol etmek zorundadır. İstenen dizinin derinliğine göre en üst dizinden (/) başlayarak, bu işlem alt dizinlere kadar tek tek yapılmaktadr. Örneğin, istenen belge /usr/local/apache/htdocs/dizin/dosya.html'se, Apache şu dizin/dosyaların hepsinin bir sembolik bağ olmadığını kontrol eder:
(/ asla kontrol edilmez, çünkü / her zaman gerçek bir dizindir)
/usr
/usr/local
/usr/local/apache
/usr/local/apache/htdocs
/usr/local/apache/htdocs/dizin
/usr/local/apache/htdocs/dizin/dosya.html
Burada önemli olan şudur, /usr/local/apache/htdocs fiziksel (gerçek) bir dizin olsa da Apache bunu kontrol etmek zorundadır. Ayrıca yapılan iki işlem de, dosyanın/dizinin gerçek sahibini almak, sembolik bağın sahibini almak ve bunları karşılaştırmak. Örneğin, webauthor kullanıcısı şu komutla:
$ln -s /usr/local/apache/htdocs/gizli_dizin /etc
şeklinde bir komutla bir sembolik bağ yaratmışsa, /usr/local/apache/htdocs/gizli_dizin'in sahibi (webuser) ve /etc'nin sahibi (root) sistem çağrıları aracılığıyla alınır ve karşılaştırılır. Bu tip dizinlerin sık çağrılması durumunda tepki süresi düşecektir. Ayrıca, bu karşılaştırma işleminin sonuçları önbelleklenmez, dolayısıyla bu kontroller her çağrıda tekrar tekrar yapılır.
Alternatif çözüm
Güvenlikten fazla taviz verilmeden gidilecek daha iyi bir çözüm, dosyaların kök dizini dışında sembolik bağ kontrolünü açıp, kök dizinin altında kapatmak olabilir.
DocumentRoot /webroot/docs
...
<Directory />
Options FollowSymLinks
</Directory>
<Directory /webroot/docs>
Options -FollowSymLinks +SymLinksIfOwnerMatch
</Directory>
Bu şekilde, dosyaların kök dizini altında, sembolik bağı veren kişiyle bağ verilen dosya/dizinin sahibi aynı kişi değilse, Apache o dosyayı/dizini istemciye göndermeyecektir, ve güvenlik de nispeten artmış olacaktır.
Çocuk sunucularla ilgili ayarlar
Apache, tepki süresini arttırmak amacıyla, bir miktar çocuk sunucuyu (child server, fork edilen sunucular) önceden açar ve boşta bekletir. Diğer sunucuların meşgul olması ve yeni bir istemcinin bağlanması durumunda bu sunuculardan bir tanesi gelen isteği karşılar. Ani yüklenmelerin (transient peak) olduğu bir sunucuda, boşta bekleyen sunucuların fazlaca olması tavsiye edilir. Apache'de varsayılan şu iki yönerge vardır:
MinSpareServers 5
MaxSpareServers 10
Bu sayıları aşağıdaki gibi 32 ve 48 şeklinde değiştirmeniz, bir anda 32 istemcinin birden sunucudan dosya istemesi halinde, anında tepki verilebilmesini sağlar:
MinSpareServers 32
MinSpareServers 48
Yine de hatırlatmak gerekir, açılan her çocuk sunucu bellek kullanımını arttırır. Bu sayıyı çok arttırmanız durumunda Web sunucunun kullandığı bellek, fiziksel belleği aşacağı için sunucu diske swap yapmaya başlar ki bu da performansı düşürür. Dolayısıyla doğru ayarları bulana kadar, bir miktar deneme/yanılma yapmanız gerekebilir.
Bir başka ayar da, çocuk sunucuların ölmeden önce kaç isteğe cevap vereceği ayarıdır. Apache'nin varsayılan ayarı:
MaxRequestsPerChild 10000
şeklindedir. Bu sayıyı çok düşürmeniz halinde (ör. 50-100), sunucular sürekli olarak öldürülüp tekrar başlatılacaktır, ki bu da sunucunun tepki süresini düşürür. Çok yüksek olması durumunda (ör. 100,000 ya da sınırsız için kullanılan 0) ise, çocuk sunucuların bellek akıtma (memory leaking) problemi varsa (ör. Solaris'de vardır), bellek kullanımı artacaktır ve sunucunun performansı yine düşecektir. Bu tip bir probleminiz varsa ve sunucunuza gelen trafik sürekli yüksek değilse, bu sayıyı 500-1000'e kadar düşürebilirsiniz.
.htaccess'le ilgili ayarlar
Apache'nin bir özelliği de, bazı dizinlerde bulunabilen .htaccess dosyaları aracılığıyla kullanıcılardan isim/şifre isteyebilmesi ya da IP numaralarını kontrol ederek erişimi kısıtlayabilmesidir. Bazı sistem yöneticileri bu dosyaları kullanabilmek için şu şekilde bir tanımlama yapabilirler:
DocumentRoot /webroot/docs/
...
<Directory /webroot/docs/>
AllowOverride AuthConfig
</Directory>
Ancak sembolik bağlarda çıkan durum burada da vardır. Apache bu dizinin altındaki her dizinde (her seferinde bir alta inerek) bir .htaccess dosyasının olup olmadığını kontrol etmek zorunda kalır ve bu da performansı düşürür. Bunun yerine sadece gerekli dizinlerde bu ayar açılarak sunucunun diğer dizinlerde bir kontrol işlemi yapması engellenebilir, ve bu da performansı arttırır. Örneğin, şu şekilde bir tanımlama kullanılabilir:
DocumentRoot /webroot/docs/
...
<Directory /webroot/docs>
AllowOverride None
</Directory>
<Directory /webroot/docs/guvenli_dizin>
AllowOverride AuthConfig>
</Directory>
Kayıt dosyalarıyla ilgili ayarlar
Apache, sunucuya bağlanan kullanıcıların isteklerinin detaylı bir kaydını tutabilir. Birçok sistem yöneticisi de varsayılanları kullandığı için genelde şu ikisinden biri tercih edilir:
CustomLog /usr/local/apache/logs/access_log common
CustomLog /usr/local/apache/logs/access_log combined
Eğer Apache'nin tepki süresini hızlandırmak istiyorsanız, kayıtları kapatın! Bu birçok sistem yöneticisine mide spazmı bile geçirtebilecek bir öneridir, ancak Apache gelen her istek için bu dosyaları açmakta ve gerekli değişkenleri hesaplayıp dosyaya eklemektedir. Bir Web sunucusunda performans genel olarak, dosyaları işleme süresinin düşüklüğü ve diske ne kadar az erişim yaptığıyla belirlenir. Hiç kayıt tutulmaması ve dosyaların önbelleklenmesi gibi tekniklerle, sunucu minimum seviyede disk erişimi yapacağından tepki süresi çok artacaktır.
Burada kapılınabilecek yanlış bir hüküm, kayıt dosyalarına yazılan verilerin miktarının düşürülmesinin performansı arttıracağıdır. Bu kısmen doğrudur, ancak yine de fiziksel disk erişimi her durumda yavaş olduğundan performansı çok arttırmayacaktır.
Sembolik bağlarla (symbolic links) ilgili ayarlar
Apache, kullanıcı tarafından istenen bir dizin ya da dosyayı işlerken, bir sembolik bağ olup olmadığını inceleyebilir. Apache'nin varsayılan ayarlarında Option FollowSymLinks vardır. Güvenliği düşünen sistem yöneticileri bunu genellikle Option None ya da Option SymLinksIfOwnerMatch yapmaktadır. Ancak bu hızı düşürmektedir. En yüksek performans Option FollowSymLinks yönergesiyle alınmaktadır.
Option SymLinksIfOwnerMatch durumu
Apache bu yönergeyle, normale göre istenen dizinin/dosyanın bir sembolik bağ olup olmadığını kontrol etmek zorundadır. İstenen dizinin derinliğine göre en üst dizinden (/) başlayarak, bu işlem alt dizinlere kadar tek tek yapılmaktadr. Örneğin, istenen belge /usr/local/apache/htdocs/dizin/dosya.html'se, Apache şu dizin/dosyaların hepsinin bir sembolik bağ olmadığını kontrol eder:
(/ asla kontrol edilmez, çünkü / her zaman gerçek bir dizindir)
/usr
/usr/local
/usr/local/apache
/usr/local/apache/htdocs
/usr/local/apache/htdocs/dizin
/usr/local/apache/htdocs/dizin/dosya.html
Burada önemli olan şudur, /usr/local/apache/htdocs fiziksel (gerçek) bir dizin olsa da Apache bunu kontrol etmek zorundadır. Ayrıca yapılan iki işlem de, dosyanın/dizinin gerçek sahibini almak, sembolik bağın sahibini almak ve bunları karşılaştırmak. Örneğin, webauthor kullanıcısı şu komutla:
$ln -s /usr/local/apache/htdocs/gizli_dizin /etc
şeklinde bir komutla bir sembolik bağ yaratmışsa, /usr/local/apache/htdocs/gizli_dizin'in sahibi (webuser) ve /etc'nin sahibi (root) sistem çağrıları aracılığıyla alınır ve karşılaştırılır. Bu tip dizinlerin sık çağrılması durumunda tepki süresi düşecektir. Ayrıca, bu karşılaştırma işleminin sonuçları önbelleklenmez, dolayısıyla bu kontroller her çağrıda tekrar tekrar yapılır.
Alternatif çözüm
Güvenlikten fazla taviz verilmeden gidilecek daha iyi bir çözüm, dosyaların kök dizini dışında sembolik bağ kontrolünü açıp, kök dizinin altında kapatmak olabilir.
DocumentRoot /webroot/docs
...
<Directory />
Options FollowSymLinks
</Directory>
<Directory /webroot/docs>
Options -FollowSymLinks +SymLinksIfOwnerMatch
</Directory>
Bu şekilde, dosyaların kök dizini altında, sembolik bağı veren kişiyle bağ verilen dosya/dizinin sahibi aynı kişi değilse, Apache o dosyayı/dizini istemciye göndermeyecektir, ve güvenlik de nispeten artmış olacaktır.
Çocuk sunucularla ilgili ayarlar
Apache, tepki süresini arttırmak amacıyla, bir miktar çocuk sunucuyu (child server, fork edilen sunucular) önceden açar ve boşta bekletir. Diğer sunucuların meşgul olması ve yeni bir istemcinin bağlanması durumunda bu sunuculardan bir tanesi gelen isteği karşılar. Ani yüklenmelerin (transient peak) olduğu bir sunucuda, boşta bekleyen sunucuların fazlaca olması tavsiye edilir. Apache'de varsayılan şu iki yönerge vardır:
MinSpareServers 5
MaxSpareServers 10
Bu sayıları aşağıdaki gibi 32 ve 48 şeklinde değiştirmeniz, bir anda 32 istemcinin birden sunucudan dosya istemesi halinde, anında tepki verilebilmesini sağlar:
MinSpareServers 32
MinSpareServers 48
Yine de hatırlatmak gerekir, açılan her çocuk sunucu bellek kullanımını arttırır. Bu sayıyı çok arttırmanız durumunda Web sunucunun kullandığı bellek, fiziksel belleği aşacağı için sunucu diske swap yapmaya başlar ki bu da performansı düşürür. Dolayısıyla doğru ayarları bulana kadar, bir miktar deneme/yanılma yapmanız gerekebilir.
Bir başka ayar da, çocuk sunucuların ölmeden önce kaç isteğe cevap vereceği ayarıdır. Apache'nin varsayılan ayarı:
MaxRequestsPerChild 10000
şeklindedir. Bu sayıyı çok düşürmeniz halinde (ör. 50-100), sunucular sürekli olarak öldürülüp tekrar başlatılacaktır, ki bu da sunucunun tepki süresini düşürür. Çok yüksek olması durumunda (ör. 100,000 ya da sınırsız için kullanılan 0) ise, çocuk sunucuların bellek akıtma (memory leaking) problemi varsa (ör. Solaris'de vardır), bellek kullanımı artacaktır ve sunucunun performansı yine düşecektir. Bu tip bir probleminiz varsa ve sunucunuza gelen trafik sürekli yüksek değilse, bu sayıyı 500-1000'e kadar düşürebilirsiniz.
.htaccess'le ilgili ayarlar
Apache'nin bir özelliği de, bazı dizinlerde bulunabilen .htaccess dosyaları aracılığıyla kullanıcılardan isim/şifre isteyebilmesi ya da IP numaralarını kontrol ederek erişimi kısıtlayabilmesidir. Bazı sistem yöneticileri bu dosyaları kullanabilmek için şu şekilde bir tanımlama yapabilirler:
DocumentRoot /webroot/docs/
...
<Directory /webroot/docs/>
AllowOverride AuthConfig
</Directory>
Ancak sembolik bağlarda çıkan durum burada da vardır. Apache bu dizinin altındaki her dizinde (her seferinde bir alta inerek) bir .htaccess dosyasının olup olmadığını kontrol etmek zorunda kalır ve bu da performansı düşürür. Bunun yerine sadece gerekli dizinlerde bu ayar açılarak sunucunun diğer dizinlerde bir kontrol işlemi yapması engellenebilir, ve bu da performansı arttırır. Örneğin, şu şekilde bir tanımlama kullanılabilir:
DocumentRoot /webroot/docs/
...
<Directory /webroot/docs>
AllowOverride None
</Directory>
<Directory /webroot/docs/guvenli_dizin>
AllowOverride AuthConfig>
</Directory>
Kayıt dosyalarıyla ilgili ayarlar
Apache, sunucuya bağlanan kullanıcıların isteklerinin detaylı bir kaydını tutabilir. Birçok sistem yöneticisi de varsayılanları kullandığı için genelde şu ikisinden biri tercih edilir:
CustomLog /usr/local/apache/logs/access_log common
CustomLog /usr/local/apache/logs/access_log combined
Eğer Apache'nin tepki süresini hızlandırmak istiyorsanız, kayıtları kapatın! Bu birçok sistem yöneticisine mide spazmı bile geçirtebilecek bir öneridir, ancak Apache gelen her istek için bu dosyaları açmakta ve gerekli değişkenleri hesaplayıp dosyaya eklemektedir. Bir Web sunucusunda performans genel olarak, dosyaları işleme süresinin düşüklüğü ve diske ne kadar az erişim yaptığıyla belirlenir. Hiç kayıt tutulmaması ve dosyaların önbelleklenmesi gibi tekniklerle, sunucu minimum seviyede disk erişimi yapacağından tepki süresi çok artacaktır.
Burada kapılınabilecek yanlış bir hüküm, kayıt dosyalarına yazılan verilerin miktarının düşürülmesinin performansı arttıracağıdır. Bu kısmen doğrudur, ancak yine de fiziksel disk erişimi her durumda yavaş olduğundan performansı çok arttırmayacaktır.