Bu kılavuzda, sanal sunucuda yüksek yüklenmenin başlıca nedenlerini ve bunları nasıl giderebileceğimizi inceleyeceğiz.
Örneğin, sunucuda barındırılan bir siteyi açarken ciddi gecikmeler, konsolda komutların yavaş çalışması gibi durumlar gözlemlenebilir.
1. Yükü Kontrol Edelim
Örneğin, 6 CPU çekirdeği varsa maksimum yük LA (Load Average) değeri 6 olmalıdır. (1, bir çekirdeğin %100 kullanımını ifade eder).
Bu göstergeleri kontrol etmek için örneğimizde şu komutu kullanıyoruz:
top
Ekran görüntüsünde, bu göstergenin önemli ölçüde aşıldığını, yani sanal makine üzerinde çok yüksek bir yük olduğunu görüyoruz.
Bu durumda, sunucunun yavaş çalışmasının nedeni aşırı yüklenmedir. Örneğimizde, bu yükü oluşturan işlemleri, yani "R" (Run - aktif işlemler) durumundaki işlemleri de görüyoruz.
COMMAND bölümünde, en fazla kaynağı kullanan komutu görebiliriz. Örneğimizde bu, php komutlarıdır.
Ayrıca Tasks parametresine de dikkat edin, bu sanal makinedeki toplam işlem sayısını gösterir - 752 işlem, bunlardan 40'ı aktif durumdadır.
Günlük 700 benzersiz ziyaretçi ve aylık yaklaşık 21.000 ziyaretçi alan bir sitenin benzer bir sunucu yapılandırmasında normal çalışma yükü: LA - 0,41, Tasks - 51 (2 running) şeklindedir.
Bu durumda, sunucunun flood veya dos saldırısına maruz kaldığı ya da spam göndermek için komutlar çalıştırıldığı veya sunucunun bir kaynağa saldırı düzenlemek amacıyla (kötü niyetli kişiler tarafından proxy olarak kullanılarak) çalıştırıldığı açıktır.
2. Çözüm
Yüksek yük altında konsolda çalışmak çoğu zaman zordur. Bu durumda web servislerini durduralım:
service nginx stop
service apache2 stop
Bazı durumlarda, bu komutlar uzun sürebilir; bu durumda işlemi zorla sonlandırmak daha iyidir.
Aktif işlem pid'lerini inceleyin ve şu komutu kullanarak sonlandırın (burada pid, işlem kimliğidir):
kill -9 pid
Eğer top komutu geç açılıyor veya yavaş çalışıyorsa, ps aux komutunu kullanarak işlem adına göre filtre uygulayabilirsiniz:
ps aux | grep nginx
Bu işlemleri sonlandırdıktan sonra yük normale dönmelidir; ardından aynı isteklerin olup olmadığını görmek ve skripte giden yolu öğrenmek için access log dosyasını inceleyebilirsiniz. Örneğin, tail komutu ve grep filtresi kullanarak:
tail -f /var/log/nginx/access.log
Dikkat! Log dosyasının yol ve adı sizde farklı olabilir.
Daha sonra zararlı scriptleri kaldırın, bunların oluşturulma tarihi ana dosyalardan farklı olacaktır. Bunu mc dosya yöneticisini kullanarak görebilirsiniz.
2.1 Yüksek Yük Oluşturan Scripti Alternatif Yöntemle Bulma
Eğer sunucu komutlarınıza gecikmeli de olsa yanıt veriyorsa, script dosya adını aşağıdaki komutu kullanarak öğrenebilirsiniz (burada pid, php işleminin kimliğidir):
lsof -p pid
Zararlı dosyaları kaldırdıktan sonra sunucunun yükü azalacaktır.
Zararlı dosyaların varlığı dos veya ddos saldırıları durumunda şart değildir. Bu durumda korunma önlemleri almanız gerekir, daha fazla bilgi için şuraya göz atabilirsiniz: Flood Saldırılarına Karşı Web Sunucusu Koruma
Bu durum, sunucuda popüler CMS'lerin kullanıldığı ve güncellenmediği durumlarda daha olasıdır.