Web Sunucularında Performans Testleri ve Yükseltme Rehberi

Web Sunucularında Performans Testleri ve Yükseltme Rehberi

Apache, Nginx, Open Litespeed

Kişisel kullanıcılar veya kurumlar firmalar son zamanlarda hazır hosting kullanmak yerine kendilerine ait yönetilebilir sunucuları tercih etmekteler. Yönetilecek olan sunucuların ihtiyaca göre bütçeleri şekillenmekte. Kimi kurumsal firmalar yüksek ücretler ayırırken kimi kişisel kullanıcılarda çok düşük ücretler ayırmakta. Bu durumda her iki tercih içinde kaliteli performans alma gerekliliği ortaya çıkıyor.Bu durumlar tam performans alma konusunda hazırladığım yazıya geçelim;

  • Apache Üzerinde Yük Testi ve Performans Yükseltme

Öncelikle Apache üzerine performans testini yapmak üzere farklı bir sunucu üzerine Apache’nin kendi sunduğu ab (Apache Benchmark) yazılımını kuralım.

  • Ubuntu ve Debian alt yapısında,

Apache2 web sunucusu yazılımınız kuruluysa yanına ‘apache2-utils‘ eklenti paketini kurmanız gerekmekte kurulumunu bilmeyenler için root kullanıcısı üzerinde çalışanlar bunu yazmalı

apt-get install apache2-utils

Yine bu sistemler üzerinde root haklarına sahip kullanıcı üzerinde kurulum yapacaksanız bunu yazmalısınız.

sudo apt-get install apache2-utils

  • RHEL, Centos ve Fedora alt yapısında,

yum install -y httpd-tools

yazarak kurulumu gerçekleştirebilirisiniz.

 

Kurulumlar tamamlandıktan sonra isterseniz detaylı kullanımı için man ab yine isterseniz basit kullanımları için ab yazarak kullanım bilgilerine erişebilirsiniz. Sizler için resim olarak basit kullanımları ekledim.

Performans testi yapmadan önce test yapacağımız sunucuda ki herhangi bir sitenin farklı lokasyonlar üzerinden testini Host-Tracker üzerinden yapalım.

Testi başlattıktan sonucumuzu bir kenara alalım.

Değerleri belli olan web sitemizin şimdi performans testine bakalım. Teste başlamadan önce yazacağımız komutların parametre olarak ne anlama geldiğini belirteyim;

  • -c 100 -> komutu 100 farklı kullanıcının aynı anda girdiğini düşünebilirsiniz. bu değeri sunucu kapasitesine göre test ederek yazabilirsiniz. Örneğin 512mb ram, 1 çekirdek işlemciye sahip Digitalocean sanal sunucusu üzerinde maksimum 1000 çalışabiliyor.
  • -n 30000 -> komutu toplamda 30.000 paket yollansın anlamına gelmekte. 30.000 test için orta seviyeli paket sayısıdır. Test erken biterse Ctrl+c ile durdurmak üzere paket limitini 1.000.000’a çıkartabilirsiniz.

Testi başlatacağımız sunucu üzerinden şu komutu verip kimine göre saldırı kimisine görede performans testini başlatalım.

ab -c 1000 -n 30000 http://web.siteniz/

Test başlar başlamaz tekrar web sitemizin uptime değerlerini tekrar yeni test başlatıp bakalım.

Bu uptime sitesi cevap süresine bakıyor. Ama normal olarak siteye erişmeye çalıştığımızda en azından 0.5mbit Akk’ye girmiş ADSL alt yapısıyla vmware sanallaştırmasını kullandığım sanal sunucu da hiç bir optimizasyon yapılmamış web sunucuna verdiğimiz yavaşlatma ortada.

Programın mantığını anlatıp Apache kullanıcıları için optimize etmede kullanılabilecek yöntemleri Centos 7 / RHEL ve Fedora için dosyası ile;

/etc/httpd/conf/httpd.conf

Debian ve Ubuntu tabanında;

/etc/apache2/apache2.conf

dosyası üzerinden düzenleyerek optimizasyona başlayalım. MaxKeepAliveRequests değerini 0 yani limitsiz olan değerden önerilen değer olan 250-750 arası değer (tercihinize göre) yazabilirsiniz. Örnek olarak 500 yazıyor ve kaydediyoruz. KeepAlive sunucunun, sunucu başına birden fazla istekte bulunmasına izin verip vermediğini ayarlar. Herhangi bir istemcinin sunucu kaynaklarını çok fazla tüketmesini önlemek için kullanılabilir.

MaxKeepAliveRequests 500

Bu şekilde boş-çöp paketler için limit koymuş olduk. Bunun ardından Kaynak Kullanım ve Konfigürasyon ayarlarını yapalım. Bunu anlık kullanıcı gereği duymadan yapmanız optimizasyonu sağlayacak ve gelecek saldırıları büyük ölçüde azaltacaktır. Yine httpd.conf dosyasını düzenleyelim.

Apache MPM (Multi-Processing Module) [Çoklu-İşleme Modülü] güncel Apache üzerinde kurulu geldiğinden sadece ayarlarını yapmamız gerekiyor. Ayarlara geçelim.

<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 3000
</IfModule>

StartServers: Bu yönerge, başlangıçta yaratılan alt sunucu işlemlerinin sayısını belirler. Yüksek yüklü bir sunucuda bu numarayı artırmanızın iyi bir fikir olduğundan, sunucu çok sayıda bağlantıyı kullanmaya hazırdır. Düşük yüklü sunucuda 3-5 idealdir.
MinSpareServers: Bu yönerge, minimum boş sunucu servisi sayısını belirler. Bu değer, yüksek yüklü sunucular için ayarlanmalıdır. Unutmayın, çok fazla boşta kalan işlemler sunucu üzerinde olumsuz bir etki yaratacaktır.
MaxSpareServers: Bu yönergeyle, azalan alt sunucu işlemi sayısını belirler. MaxSpareServers tarafından tanımlandıklarından daha fazla boşta olan alt sunucu işlemi olduğunda boşta olan süreç öldürülür. MinSpareServers’in 2 kat değeri gayet idealdir.
MaxClients: Bu yönerge, Apache’nin işleyebileceği eşzamanlı isteklerin sayısını belirler. Bu sınıra ulaşıldığında, diğer bağlantı denemeleri sıraya alınır. Böylece saldırı durumlarında Apache ye yönelik saldırganların devre dışı bırakmalarının önüne geçmişte oluyoruz.
MaxClients sayısı = (Toplam RAM bellek – Apache işlemi hariç diğer işlemler için kullanılan RAM bellek) / (Tek bir Apache işlemi tarafından kullanılan bellek)
MaxRequestsPerChild: Bu yönerge, bir alt işlemin sonlanmadan önce ne kadar istekte çalışacağını belirler. Limit ulaşıldığında, eş zamanlı işlem durdurulacak.
Not: Bu değer 0 ise, işlem asla durdurulmayacaktır.

 

İşlemleri tamamladıktan sonra Apache’yi yeniden başlatalım. Centos 7 için;

service httpd restart

Şimdi ise mod_pagespeed eklentisini kuralım. Yük durumunda kullanıcılar yavaşlıkla karşılaşmasın. Anlatımlarımı 64 bit’e göre anlatacağım. 32 bit kullanıcıları Buradan 32 bit linklerine ulaşabilir sonraki adımlar 32 bit’e göre tamamlayabilir.

Centos, Fedora ve RHEL kullanıcıları bu komutları;

cd /tmp

rpm -Uvh https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_x86_64.rpm

Ubuntu/Debian kullanıcıları

cd /tmp

wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_amd64.deb

dpkg -i mod-pagespeed-stable_current_amd64.deb

yazarak mod_pagespeed eklentisi kurmuş olduk. Otomatik olarak Apache ayarlarına eklendi ve hazır. phpinfo() ya bakarak eklentiyi görebilirsiniz. Bilmeyenler ise yeni bir php dosyası oluşturup şunları yazabilir.

<?php

phpinfo();

?>

Ve Apache Benchmark yazılımı çalıştırıp anlık site ulaşılabilirlik raporuna tekrar bakınız 🙂

  • Nginx ve Litespeed Tabanında Yük Testi ve Önerileri

Apache için anlatımları okuyup buraya devam ediyorsanız sıkıntı yok 🙂 Devam edelim. Eğer değilse önce Apache için anlatımıma göz atabilirsiniz. Yük testine başlamadan önce ulaşılabilirlik / uptime raporunuz hazırsa benchmark uygulamamıza geçelim. rpm ve deb yapısı farketmeden bu komutları yazarak yük testi uygulamamızı indirelim. gcc derleyici yazılımının kurulu olduğuna emin olduktan sonra kuruluma geçebilirsiniz aksi halde kurulmayacaktır.

wget https://github.com/wg/wrk/archive/master.zip

unzip master.zip

rm -rf master.zip

cd wrk-master

make

komutlarıyla kurulumu tamamladık. Şimdi gelelim Nginx ve Litespeed için yük testine. Yük testini çalıştırmadan önce komutların anlamlarını yazalım.

-t100 ek komutu, 12 tane thread, thread sayısını yani aynı anda yapılacak işlemin sayısı. Sunucu özelliklerine göre 512mb ram tek çekirdek için 50, 1gb tek çekirdek sunucunuz için 100 idealdir.

-c800 ek komutu, 800 tane her thread üzerinde ki bağlantı sayısı, Sunucunun özelliklerine göre 512mb için 400, 1gb için 800, üstü için ise 1000 idealdir.

-d45s , -d30m , -d1h ek komutu -d45s komutunda 45 saniye olarak belirtiyoruz. Bu sizin tercihinize bağlıdır, -d30m 30 dakika olarak tercihinize göre ayarlayabilirsiniz ve -d1h ile de 1 saat olarak tercihe göre değişiklik yapabilirsiniz.

En son komutlarımızı yazdıktan sonra bulunduğumuz wrk-master klasörü içersin de şu komutumuzu çalıştıralım.

wrk -t100 -c800 -d1m http://performanstest.furkansandal.com/index.php

ile, performanstest.furkansandal.com web sitesine yük/saldırı testimizi başlatmış olduk. Sunucu durumlarınızı üst kısımda Apache için anlattığım gibi host-tracker üzerinden takip edebilirsiniz. Sonuçlarınızı gördüyseniz gelin geçelim Nginx üzerinde optimizasyon çalışmalarına.

Çekirdek sayımızı öğrenelim, kenarda dursun.

grep processor /proc/cpuinfo | wc -l

Ana amacımız sunucumuzun crash olmaması. Bu durum için bağlantı limiti koymamız gerekiyor. Düzenleyeceğimiz dosyayı bulamazsanız find komutu ile sunucunuzun / dizinin de aratma yapabilirisiniz.

nano /etc/nginx/nginx.conf

düzenlemeye alalım ve altta verdiğim düzenlemeleri değiştirelim. Değiştirmeden belirteyim ki worker_processess değeri çekirdek sayınızdır. Sizin değerinizden düşükse çekirdek sayınızı ekleyin. Fazla eklerseniz nginx bug’a girip çökecektir. worker_connections ise saniyede gelecek maksimum bağlantı sayısıdır. Hitli bir web siteniz yoksa saniyelik bağlantı değerini 50 de tutabilirsiniz.

worker_processes 1;

worker_connections 50;

Aynı dosya içersin de GZIP Sıkıştırma yı da aktifleştirip ayalarını yapalım. İdeal ayarlardan eklediğim gibidir.

gzip on;

gzip_comp_level 2;

gzip_min_length 1000;

gzip_proxied expired no-cache no-store private auth;

gzip_types text/plain application/x-javascript text/xml text/css application/xml;

Statik dosyaların önbellekleme ayarlarını yapalım. Tercihinize göre | eklemek şartıyla eklemek istediğiniz türleri ekleyebilirsiniz. Önerim kendi yazdığımdır.

location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {

expires 365d;

}

Loglamayı kapatmak. En fazla yoran işlemlerden biri access_log dosyasına logların kaydedilmesidir. Saldırı alıyorsanız kapatmanıza gerek yok, almam alsamda no problem diyorsanız kapatalım.

access_log off;

Nginx’ide yeniden başlattıktan sonra Mission Completed.

service nginx restart

Gelelim Litespeed‘e;

Litespeed kullanacaksanız öncelikle Apache kurmanızı ve Apache için belirlediğimiz ayaları yapmanızı öneriyorum ve ona göre anlatacağım. Apache optimizasyonlarını tamamladıktan sonra, Litespeed kurulumuna PHP7 ile kurulumu gerçekleştirelim. PHP7, 5 e göre %20 daha hızlı çalışmakta.

  • Litespeed yönetim paneli üzerinden, Plugins sekmesinden PHP Opcode Cache yükleyip aktifleştirelim.
  • LSWS Web Admin > Actions > Real-Time Stats > External Application adımlarına girerek “In Use”, “Idle”, ve “WaitQ” yu işaretleyelim. Eğer WaitQ değeri 0 dan yüksekse PHP suEXEC Max Conn değerini yükseltmeniz gerekebilir. Onuda LSWS Admin Console > Server > General > Using Apache Configuration File > PHP suEXEC üzerinden arttırabilirsiniz.  100 idealdir bu değer içinde.

Litespeed performans’a yönelik olduğundan çok fazla optimize edilemeyebilir ama maksimum bağlantı değerlerini limitlemek sunucumuzun erişim kesilmesini engelleyecektir. Bu işlemleri yaptıktan sonra sunucunuza tekrar benchmark testi yapıp sonuçlarınızı görebilirsiniz 🙂

Bunlara alternatif olarak sunucunuza HTTP/2 desteği ile gelen kullanıcılarınıza da hız konusunda büyük katkı sağlayabilirsiniz 🙂

Sosyal Medyada Paylaş

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir