Apache Web Sunucunuzun Performansını Artıracak 5 İpucu


Netcraft (diğer hizmetlerin yanı sıra web tarayıcısı kullanım istatistiklerini de sağlayan tanınmış bir İnternet şirketi) tarafından hazırlanan yakın tarihli bir rapora göre, Apache, siteler ve İnternet'e bakan bilgisayarlar arasında en yaygın kullanılan web sunucusu olmaya devam ediyor.

Ayrıca Apache, en iyi web sunucuları arasında en büyük büyümeyi yaşamaya devam ederken onu Nginx ve IIS takip ediyor. Bu nedenle, Apache kurulumlarını yönetmekten sorumlu bir sistem yöneticisiyseniz, web sunucunuzun sizin (veya müşterinizin) ihtiyaçlarına göre kapasitesinin en iyi şekilde performans göstermesini nasıl sağlayacağınızı bilmeniz gerekir.

Bu makalede Apache'nin sorunsuz bir şekilde çalışmasını ve uzak istemcilerden beklediğiniz sayıda isteği karşılayabilmesini sağlamanıza yardımcı olacak birkaç ipucunu tartışacağız.

Ancak Apache'nin kıyaslama kayıtları oluşturma amacıyla tasarlanmadığını, ancak yine de aklınıza gelebilecek hemen hemen her kullanım durumunda yüksek performans sağlama kapasitesine sahip olduğunu lütfen unutmayın.

İPUCU #1: Apache'yi her zaman en son sürümüne güncel tutun

Apache'nin en son sürümünün kurulu olmasının muhtemelen dikkate almanız gereken ilk şeylerden biri olduğunu söylemeye gerek yok. 19 Kasım 2015 itibarıyla CentOS 7 depolarında bulunan en son Apache sürümü 2.4.6 iken Debian'da dir. >2.4.10.

Ancak, yeni yayımlanan kararlı sürüme yeni eklenen bir iyileştirme veya hata düzeltmesi olabilir ve bu sürüm daha sonra kaynaktan indirilip kurulmaya hazır hale getirilebilir. Derleme ve kurulum talimatları da burada verilmektedir; yalnızca bu güncelleme yöntemini seçerseniz, önlem olarak mevcut yapılandırma dosyalarınızı/sitelerinizi/sanal ana bilgisayarlarınızı yedeklemek isteyebileceğinizi unutmayın.

Her durumda, şu anda yüklü olan sürümünüzü aşağıdaki şekilde kontrol edebilirsiniz:

httpd -v               [On RedHat/CentOS based systems]
apache2 –v             [On Debian/Ubuntu based systems] 

Genel bir kural olarak, seçtiğiniz dağıtımın paket yöneticisi tarafından sağlanan güncelleme yöntemine bağlı kalın (CentOS veya Debian için yum update httpd veya aptitude güvenli yükseltme apache2, sırasıyla) başka bir yol olmadığı sürece. En son sürüm notlarını Apache HTTP sunucusu Projesi web sitesindeki Apache Belgeleri bölümünde okuyabilirsiniz.

İPUCU #2: 2.4'ten daha eski bir Çekirdek kullanıyorsanız şimdi yükseltmeyi düşünün

Neden? 2.4 ve üzeri çekirdek sürümlerinde sendfile çekirdek sistem çağrısı varsayılan olarak etkindir. Bu da (web sunucusu-istemci iletişimi bağlamında istenen) yüksek performanslı ağ dosya aktarımlarını kolaylaştırır ve Apache'nin eşzamanlı okuma ve gönderme işlemlerini gerçekleştirerek statik içeriği daha hızlı ve daha düşük CPU kullanımıyla sunmasına olanak tanır.

Şu anda yüklü olan çekirdeğinizi aşağıdakilerle görüntüleyebilirsiniz:

uname -r

ve bunu www.kernel.org'daki en son kararlı çekirdekle (bu yazının yazıldığı sırada 4.3) karşılaştırın.

Yeni başlayanlar için uygun olmayan bir süreç olmasına rağmen çekirdeğinizi yükseltmek, Linux'un iç yapısı hakkında daha fazla bilgi edinmek için ilginç bir egzersizdir.

İPUCU #3: Durumunuza en uygun Çoklu İşleme Modülünü (MPM) seçin

Uygulamada, MPM'ler, web sunucusunu makinedeki ağ bağlantı noktalarına bağlanacak, istemcilerden gelen istekleri kabul edecek ve alt işlemleri (ve iş parçacıklarını) nasıl kullanacağınıza karar vermenize olanak tanıyarak Apache'nin modüler işlevselliğini genişletir. alternatif olarak) bu tür istekleri yerine getirmek için.

Sürüm 2.4'ten başlayarak Apache, ihtiyaçlarınıza bağlı olarak seçebileceğiniz üç farklı MPM sunmaktadır:

  1. prefork MPM, iş parçacığı oluşturmadan birden çok alt işlemi kullanır. Her işlem, her biri için ayrı iş parçacıkları oluşturmadan tek seferde bir bağlantıyı yönetir. Fazla ayrıntıya girmeden, bu MPM'yi yalnızca mod_php gibi thread-safe olmayan modülleri kullanan bir uygulamada hata ayıklama yaparken veya uygulamanızın bu modüllerle uğraşması gerekiyorsa kullanmak isteyeceğinizi söyleyebiliriz.
  2. worker MPM, her alt süreç için birden fazla iş parçacığı kullanır; burada her iş parçacığı aynı anda bir bağlantıyı yönetir. Bu, yüksek trafikli sunucular için iyi bir seçimdir çünkü önceki duruma göre daha az RAM ile daha fazla eşzamanlı bağlantının yönetilmesine olanak tanır.
  3. Son olarak, event MPM, 2.4 ve üzeri sürümler için çoğu Apache kurulumunda varsayılan MPM'dir. Alt süreç başına birden fazla iş parçacığı oluşturması açısından çalışan MPM'ye benzer ancak bir avantajı vardır: KeepAlive veya boşta bağlantılara neden olur (bu durumda kalırken) tek bir iş parçacığı tarafından işlenecek, böylece diğer iş parçacıklarına ayrılabilecek bellekte yer açılacaktır. Bu MPM, mod_php gibi iş parçacığı açısından güvenli olmayan modüllerle kullanıma uygun değildir; bunun yerine PHP-FPM gibi bir yedek kullanılması gerekir.

Apache kurulumunuz tarafından kullanılan MPM'yi kontrol etmek için şunları yapabilirsiniz:

httpd -V

Aşağıdaki resim, bu özel web sunucusunun prefork MPM'yi kullandığını göstermektedir.

Bunu değiştirmek için şunları düzenlemeniz gerekir:

/etc/httpd/conf.modules.d/00-mpm.conf          [On RedHat/CentOS based systems]
/etc/apache2/mods-available/<mpm>.load   [On Debian/Ubuntu based systems]

Burada , mpm_event, mpm_worker veya mpm_prefork olabilir.

ve istenilen modülü yükleyen satırın açıklamasını şu şekilde kaldırın:

LoadModule mpm_event_module modules/mod_mpm_event.so

Not: Etkinlik MPM'sinin Debian'da çalışmasını sağlamak için, ücretsiz olmayan paketten libapache2-mod-fastcgi paketini yüklemeniz gerekebilir. depolar.

Ek olarak, CentOS için php-fpm'ye (fcgi ve mod_fcgid ile birlikte) ihtiyacınız olacakken, Debian'da buna php5-fpm< denir. (apache2-mpm-event ile birlikte).

Son olarak web sunucusunu ve yeni yüklenen php-fpm (veya php5-fpm) hizmetini yeniden başlatın:

RedHat/CentOS'ta

systemctl restart httpd php-fpm && systemctl enable httpd php-fpm

Debian/Ubuntu'da

systemctl restart apache2 php5-fpm && systemctl enable apache2 php5-fpm

Apache'yi belirli bir MPM kullanacak şekilde ayarlayabilmenize rağmen, bu yapılandırma, daha önce belirtildiği gibi, sanal ana bilgisayar bazında ayrı ayrı geçersiz kılınabilir.

İlgili etiketleri her sanal ana bilgisayarın yapılandırma dosyasına bırakmanız yeterlidir; artık hazırsınız; ancak sanal ana bilgisayar başına yalnızca bir MPM kullandığınızdan emin olun.

Son olarak, seçtiğiniz dağıtım ne olursa olsun, php-fpm'nin FastCGI'nin uygulanmasına dayandığını lütfen unutmayın; bu nedenle ek paket kurulumlarını daha önce tavsiye ettim.

php-fpm ve bunun MPM olayıyla birlikte Apache'nin performansını nasıl artırabileceği hakkında daha fazla ayrıntı ve örnekler için resmi belgelere başvurmalısınız.

Önceki resimde gösterilen aynı kutuda varsayılan MPM'yi prefork'tan event'e değiştirdikten sonra gördüğüm şey bu:

CentOS 7'de, http ve https hizmetlerinin güvenlik duvarı aracılığıyla etkinleştirildiğinden ve ağ arayüzünün/arayüzlerinin etkin olduğundan emin olmanız gerekir. ) varsayılan bölgeye düzgün bir şekilde eklenir.

Örneğin:

firewall-cmd --zone=internal --add-interface=tun6to4 
firewall-cmd --zone=internal --add-interface=tun6to4 --permanent 
firewall-cmd --set-default-zone=internal 
firewall-cmd --add-service=http 
firewall-cmd --add-service=https 
firewall-cmd --add-service=http --permanent 
firewall-cmd --add-service=https --permanent 
firewall-cmd --reload

Bu konuyu gündeme getirmemin nedeni, yakın zamanda bulut VPS'deki varsayılan güvenlik duvarı yapılandırma ayarlarının php-fpm ve Apache'nin php dosyalarını işlemesini engellediği bir sorunla karşılaşmamdır.

Temel bir test olarak (daha karmaşık veya stresli olanları düşünebileceğinize eminim), iki CentOS'un aynı dizininde test.php adlı başka bir dosyanın varlığını kontrol eden bir php dosyası oluşturacağım. Aynı donanım özelliklerine ve yüke sahip ancak farklı MPM'ye sahip 7 sunucu. Bunlardan biri event'i, diğeri ise prefork'u kullanacak:

Bu, checkiffileexists.php adlı dosyaya kaydettiğim php kodu:

<?php
$filename = 'test.php';

if (file_exists($filename)) {
    echo "The file $filename exists";
} else {
    echo "The file $filename does not exist";
}
?>

Daha sonra Apache karşılaştırma aracını (ab) 200 istek tamamlanana kadar 200 eşzamanlı istekle çalıştıracağız:

ab -k -c 100 -n 2000 localhost/checkiffileexists.php

Testi çalıştıralım ve sonuçları karşılaştıralım. Performans istatistiklerine dikkat edin:

Gördüğünüz gibi, etkinlik içeren sunucunun performansı, bu testin her alanında prefork muadilinden oldukça üstündür.

İPUCU #4: Apache için RAM'i akıllıca ayırın

Belki de dikkate alınması gereken en kritik donanım öğesi, her Apache işlemi için ayrılan RAM miktarıdır. Bunu doğrudan kontrol edemeseniz de, MaxRequestWorkers yönergesi (daha önce Apache 2.2'de MaxClients olarak biliniyordu) aracılığıyla alt süreçlerin sayısını kısıtlayabilirsiniz. Apache'nin RAM kullanımına sınırlamalar getirecek. Yine bu değeri host başına veya sanal host bazında ayarlayabilirsiniz.

Bunu yapmak için Apache tarafından kullanılan ortalama RAM miktarını not etmeli, ardından bunu MaxRequestWorkers sayısıyla çarpmanız gerekir; bu, Apache işlemleri için ayrılacak olan bellek miktarıdır. Web sunucunuzun asla yapmasını istemeyeceğiniz şeylerden biri takas kullanmaya başlamaktır çünkü bu, performansını önemli ölçüde düşürecektir. Bu nedenle, Apache'nin RAM kullanımını her zaman karşılayabileceğiniz sınırlar içinde tutmalı ve bunun için asla takasa güvenmemelisiniz.

Örneğin, aşağıdaki blok eşzamanlı istemcilerin sayısını 30 ile sınırlayacaktır. Daha fazla istemci ana bilgisayara saldırırsa, tarayıcının yenilenmesiyle kolayca çözülebilecek bir gecikme veya anlık bir arıza yaşayabilirler. Bu istenmeyen bir durum olarak görülse de sunucu için daha sağlıklıdır ve uzun vadede siteniz için de en iyisidir.

CentOS veya Debian kullanmanıza bağlı olarak bu bloğu /etc/httpd/conf/httpd.conf veya /etc/apache2/apache2.conf içine yerleştirebilirsiniz.

Lütfen aynı prensibin tüm MPM'ler için geçerli olduğunu unutmayın. Burada event'i önceki ipucunda özetlenen konsepte devam etmek için kullanıyorum:

<IfModule mpm_event_module>
    StartServers 3
    MinSpareThreads          25
    MaxSpareThreads          75
    ThreadLimit                      64
    ThreadsPerChild          25
    MaxRequestWorkers    30
    MaxConnectionsPerChild    1000
</IfModule>

Her durumda, seçtiğiniz MPM için hangi yönergelere izin verildiğini görmek için Apache 2.4 belgelerine başvurmanız önemle tavsiye edilir.

İPUCU #5: Uygulamalarınızı tanıyın

Genel bir kural olarak, uygulamanızın çalışması için kesinlikle gerekli olmayan hiçbir Apache modülünü yüklememelisiniz. Bu, özellikle sistem yöneticisiyseniz ve geliştirmeden sorumlu başka bir ekip varsa, sunucunuzda çalışan uygulamalar hakkında en azından genel bilgi sahibi olmanızı gerektirecektir.

Şu anda yüklü olan modülleri aşağıdakilerle listeleyebilirsiniz:

httpd -M          [On RedHat/CentOS based systems]
apache2ctl -M     [On Debian/Ubuntu based systems]

CentOS'taki modülleri kaldırmak/devre dışı bırakmak için, LoadModule ile başlayan satırı (ana yapılandırma dosyasında veya içindeki yardımcı dosyada) açıklamanız gerekecektir. /etc/httpd/conf.modules.d.

Öte yandan Debian, modülleri devre dışı bırakmak için a2dismod adında bir araç sağlar ve şu şekilde kullanılır:

a2dismod module_name

Tekrar etkinleştirmek için:

a2enmod module_name

Her iki durumda da değişikliklerin etkili olması için Apache'yi yeniden başlatmayı unutmayın.

Özet

Bu makalede Apache web sunucusunu ayarlamanıza ve performansını artırmanıza yardımcı olacak 5 ipucunu inceledik. Ayrıca, güvenlik olmadan optimizasyon ve performansın anlamsız olduğunu unutmamalısınız, bu nedenle linux-console.net'daki web sunucusu performansını artırmak için mod_pagespeed kurulumuna ve Apache güçlendirme ipuçları makalesine de başvurmak isteyebilirsiniz.

Bu makalede bu konunun tüm yönlerini yeterince ele alamadığımız için, belki de topluluğun geri kalanıyla paylaşmak isteyeceğiniz başka fikirler de düşüneceksiniz. Eğer öyleyse, aşağıdaki yorum formunu kullanarak bize bildirmekten çekinmeyin.