Bu yazıda biz artan server yükünün niyə baş verdiyini araşdıracağıq və yüksək yükləmə proseslərini optimallaşdırmağın müxtəlif yollarını müzakirə edəcəyik. Apache/Nginx və MySQL-də kodun optimallaşdırılmasına xüsusi diqqət yetiriləcək, biz köməkçi vasitə kimi keşləmə haqqında danışacağıq, həmçinin DDOS hücumları kimi mümkün xarici təhlükələri və onların qarşısının alınması yollarını nəzərdən keçirəcəyik.
Niyə Server Yükləməsi Baş verir
Serverin optimallaşdırılmasına keçməzdən əvvəl resurslara cari yükün hərtərəfli təhlilini aparmaq lazımdır. Buraya CPU yükünün, RAM istifadəsinin, şəbəkə fəaliyyətinin və digər əsas parametrlərin ölçülməsi daxildir. Dinamikanı və pik yükləri başa düşmək darboğazları müəyyən etməyə və resursların bölüşdürülməsini optimallaşdırmağa, beləliklə də server infrastrukturunun sabitliyini və performansını artırmağa imkan verir.
Yüksək server yüklənməsinin ilkin problemlərini həll etmək üçün ümumi server diaqnostikası aparmağı tövsiyə edirik . Bu kifayət deyilsə, resursların daha ətraflı təhlili lazımdır. Köməkçi bir vasitə olaraq, Linux serverinin qeydlərini araşdırmaq faydalı ola bilər, çünki əksər hallarda problemin mənbəyi burada tapılır.
Apache/Nginx Serverinin optimallaşdırılması
İndeksləmə səbəbindən artan server yükü
Serverdə indeksləşdirmə səbəbindən artan yük, məsələn, axtarış motorları saytınızdakı çox sayda səhifəni skan edərkən baş verə bilər. Bu, server resurslarından istifadənin artmasına və nəticədə saytın fəaliyyətinin ləngiməsinə səbəb ola bilər. Səbəbi müəyyən etmək nisbətən sadədir; ünvanda yerləşən faylı açmalısınız:
/var/www/httpd-logs/sitename.access.log
Axtarış motorları tərəfindən indeksləşdirildikdə istifadəçi aşağıdakı xarakterli girişləri görəcək:
11.22.33.44 - - [Date and Time] "GET /your-page-path HTTP/1.1" 200 1234 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Yükü azaltmaq üçün ilk həll yolu olaraq, indekslənməsinə ehtiyac olmayan səhifələrdə "noindex" və "nofollow" meta etiketlərinin təyin edilməsindən istifadə edə bilərsiniz. İkinci həll yolu , məsələn, Yandex və Google-dan gizlənmək üçün müəyyən axtarış motorlarına uyğun girişlərin əlavə edilməsi lazım olan .htaccess faylıdır:
SetEnvIfNoCase User-Agent "^Yandex" search_bot
SetEnvIfNoCase User-Agent "^Googlebot" search_bot
Order Allow,Deny
Allow from all
Deny from env=search_bot
Eynilə, digər axtarış motorları üçün də redaktələrin edilməsi lazımdır. Qeyd etmək lazımdır ki, .htaccess-in imkanları yalnız indeksləşdirməni bloklamaqla məhdudlaşmır. Məqalədə onun əsas xüsusiyyətləri ilə daha yaxından tanış olmağı tövsiyə edirik.
Keşləmə Parametrlərindən istifadə
Serverdə səhv keşləmə parametrləri də yüksək yüklənməyə səbəb ola bilər. Bu parametri optimallaşdırmaq üçün konfiqurasiya fayllarında və ya .htaccess faylında müvafiq dəyişikliklər edilməlidir . Apache vəziyyətində sonuncu seçim, Nginx üçün isə birinci seçim üstünlük təşkil edir.
Apache serverində .htacess faylını açmalı və aşağıdakı kodu daxil etməlisiniz :
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf|doc|docx)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>
Daha sonra, əmrdən istifadə edərək Expires modulunu aktivləşdirin :
sudo a2enmod expires
Bundan sonra veb serveri yenidən başladın:
sudo service apache2 restart
Və göstərərək modulu aktivləşdirin:
ExpiresActive On
Nginx serverində konfiqurasiya faylına aşağıdakı kodu əlavə etmək kifayətdir:
location ~* .(jpg|jpeg|gif|png|ico|css|swf|flv|doc|docx)$ {
root /var/www/yoursite.com;
}
Və xidmətin yenidən yüklənməsini həyata keçirin:
sudo service nginx restart
Qeyd edək ki, bu parametrlərlə Allow və Deny direktivləri keçiləcək.
Məlumatların sıxılmasından istifadə
Apache və Nginx veb serverlərində Gzip istifadə edərək məlumatların sıxılmasını aktivləşdirmək, server və klient arasında ötürülən məlumatların miqdarını azaltmağa kömək edir ki, bu da performansı artırır və veb səhifənin yüklənmə müddətini azaldır.
Apache -də Gzip-i aktivləşdirmək üçün mod_deflate modulunu aktivləşdirməlisiniz :
sudo a2enmod deflate
Sonra veb serveri yenidən başladın:
sudo service apache2 restart
Və nəhayət, konfiqurasiya faylına və ya .htaccess-ə aşağıdakı bloku əlavə edin:
<IfModule mod_deflate.c>
# Configure compression for specified file types
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/json
# If the browser matches the specified pattern, apply compression only to text/html files
BrowserMatch ^Mozilla/4 gzip-only-text/html
# If the browser matches the specified version patterns of Mozilla 4.0.6, 4.0.7, 4.0.8, disable compression
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# If the browser is MSIE (Internet Explorer), disable compression for all files except text/html
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# If the request contains the specified pattern (extensions of image files), disable compression
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
</IfModule>
Bu konfiqurasiya müəyyən fayl növləri üçün sıxılma imkanı verir və şəkillər üçün onu söndürür.
Nginx vəziyyətində , konfiqurasiya konfiqurasiya faylının http blokunda baş verir. Aşağıdakı kodu əlavə etmək lazımdır:
gzip on;
gzip_disable "msie6";
# Adds the Vary header, indicating that the response may change depending on the Accept-Encoding header value
gzip_vary on;
# Enables compression for any proxy servers
gzip_proxied any;
# Sets the compression level. A value of 6 provides a good balance between compression efficiency and resource use
gzip_comp_level 6;
# Sets the size of the buffer for compressed data (16 buffers of 8 kilobytes each)
gzip_buffers 16 8k;
# Specifies that data compression should be used only for HTTP version 1.1 and higher
gzip_http_version 1.1;
# Sets the file types that can be compressed
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
Apache-də olduğu kimi , burada müəyyən fayl növləri üçün sıxılma parametrləri təyin olunur. Veb serverlərdən hər hansı birində dəyişiklik etdikdən sonra xidmətin yenidən yüklənməsi tələb olunur:
sudo service apache2 restart
Or
sudo service nginx restart
Serverə DDOS hücumu
DDoS hücumu nəticəsində yüksək server yüklənməsi baş verə bilər. DDoS hücumunun mövcudluğunu müəyyən etmək trafikin qəfil artımını, anormal sorğuları və server performansının düşməsini izləməklə edilə bilər. Bir IP ünvanından təkrar sorğular üçün qeydlərin nəzərdən keçirilməsi və ya portun skan edilməsi də mümkün DDoS hücumunu göstərə bilər. Bir çox qorunma tədbirləri var, lakin biz yalnız əsasları müzakirə edəcəyik.
CDN-dən (Məzmun Çatdırılma Şəbəkəsi) istifadə . CDN, veb serveriniz və istifadəçiləriniz arasında vasitəçi kimi xidmət edə bilər, trafik paylayır və DDoS hücumunun təsirini azaltmaq üçün məzmunu keşləyə bilər. CDN-lərdə həmçinin yük paylanması və trafik filtrasiyası da daxil olmaqla daxili DDoS qoruma mexanizmləri ola bilər.
Firewall və müdaxilə aşkarlama sistemlərinin (IDS/IPS) konfiqurasiyası . Firewall-lar IP ünvanları və portlar kimi müxtəlif meyarlara əsasən trafikin süzgəcdən keçirilməsi üçün konfiqurasiya edilə bilər. IDS/IPS qeyri-adi trafik davranışını aşkarlaya və şübhəli əlaqələri bloklaya bilər. Bu alətlər potensial zərərli trafikin izlənməsi və bloklanmasında təsirli ola bilər.
DDoS hücumlarının təsirini azaltmaq üçün Apache və Nginx veb serverlərinin konfiqurasiyası.
Apache üçün həll yolu olaraq, mod_evasive modulunu aktivləşdiririk . Bunu etmək üçün şərhi silin və ya httpd.conf və ya apache2.conf konfiqurasiya faylına aşağıdakı sətri əlavə edin :
LoadModule evasive20_module modules/mod_evasive.so
Eyni faylda parametrlər bloku əlavə etməlisiniz:
<IfModule mod_evasive20.c>
# Hash table size for storing request information
DOSHashTableSize 3097
# Number of requests to one page before activating protection
DOSPageCount 2
DOSPageInterval 1
# Number of requests to all pages before activating protection
DOSSiteCount 50
DOSSiteInterval 1
# Blocking period in seconds for IP addresses
DOSBlockingPeriod 10
</IfModule>
Eynilə, mod_ratelimit modulunu aktivləşdiririk :
LoadModule ratelimit_module modules/mod_ratelimit.so
Və konfiqurasiya əlavə edin:
<IfModule mod_ratelimit.c>
# Setting the output filter for rate limiting (Rate Limit)
SetOutputFilter RATE_LIMIT
# Beginning of the settings block for the location "/login"
<Location "/login">
# Setting the environment variable rate-limit with a value of 1
SetEnv rate-limit 1
# Ending of the settings block for the location "/login"
</Location>
</IfModule>
Nginx üçün konfiqurasiya Apache- yə bənzəyir . nginx.conf konfiqurasiya faylında aşağıdakı direktivlərdən istifadə etmək lazımdır:
http {
...
# Defining a zone for connection limits
limit_conn_zone $binary_remote_addr zone=addr:10m;
# Defining a zone for request limits
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
server {
...
# Configuring connection limits
limit_conn addr 10;
# Configuring request limits
limit_req zone=req_zone burst=5;
...
}
}
Xidmətlərin hər birinə dəyişiklik etdikdən sonra onları yenidən yükləmək lazımdır:
sudo systemctl restart apache2
Və ya:
sudo systemctl restart nginx
Bu nümunələr yalnız xüsusi tələblərdən və hücumların xarakterindən asılı olaraq daha da uyğunlaşdırıla bilən əsas konfiqurasiyanı təmin edir.
MySQL sorğularının optimallaşdırılması
Veb serverdə MySQL verilənlər bazası sorğularını optimallaşdırmaq müxtəlif yollarla həyata keçirilə bilər və bunlardan biri konfiqurasiya faylının düzgün konfiqurasiyasıdır. Adətən, bu fayl my.cnf və ya my.ini adlanır və /etc/ və ya /etc/mysql/ qovluğunda yerləşir . Onu açmalı və aşağıdakı dəyişiklikləri etməlisiniz:
[mysqld]
# Location of the file for recording slow queries. Be sure to replace it with your path
log-slow-queries = /var/log/mariadb/slow_queries.log
# Threshold time for considering slow queries (in seconds)
long_query_time = 5
# Enabling recording of queries that do not use indexes
log-queries-not-using-indexes = 1
# Disabling query caching
query_cache_size = 0
query_cache_type = 0
query_cache_limit = 1M
# Size of temporary tables
tmp_table_size = 16M
max_heap_table_size = 16M
# Size of the thread cache
thread_cache_size = 16
# Disabling name resolving
skip-name-resolve = 1
# Size of the InnoDB buffer pool. Set to 50-70% of available RAM
innodb_buffer_pool_size = 800M
# Size of the InnoDB log file
innodb_log_file_size = 200M
Server verilənlər bazası ilə qarşılıqlı əlaqəni asanlaşdıra biləcək əlavə tövsiyələri də nəzərdən keçirək:
- Istifadə edin İZAHI icrasını təhlil etmək üçün SQL sorğusundan əvvəl əmr. Bu, sorğu üçün icra planını əldə etməyə və hansı indekslərin istifadə olunduğunu, hansı cədvəllərin skan edildiyini və s.
- İndekslər məlumat axtarışını sürətləndirir, buna görə də düzgün tərtib edilmiş indekslər sorğu performansını əhəmiyyətli dərəcədə yaxşılaşdıra bilər. Tez-tez istifadə olunan sütunlara diqqət yetirin HARADA or OL şərtlər.
- Istifadə etməkdən çəkinin SEÇİM *. Cədvəldəki bütün sütunları seçmək əvəzinə, yalnız sorğunuz üçün həqiqətən zəruri olan sütunları göstərin.
- Funksiyalardan istifadə etməkdən çəkinin HARADA şərtlər. Funksiyalardan istifadə (məsələn YÜKSƏK, UPPER, LEFT, SAĞ) HARADA şərtlər indeksləri yararsız edə bilər. Şərtlərdə onların birbaşa istifadəsindən qaçınmağa çalışın.
- istifadə İNTER JOIN adətən daha səmərəli olduğu üçün mümkün olan yerlərdə. Həmçinin, qoşulmaq üçün müvafiq sütunların indeksləri olduğundan əmin olun.
- istifadə LIMIT yalnız müəyyən sayda nəticə əldə etmək lazımdırsa, geri qaytarılan sıraların sayını məhdudlaşdırmaq.
- Server yükünü azaltmaq üçün sorğu nəticələrini, xüsusən nadir hallarda dəyişirsə, keşləməni nəzərdən keçirin.
Poçt serveri serverdə yüksək yük yaradır
Bu bölmədə poçt serverinin yüksək yükləndiyini necə müəyyən edəcəyimizi və mesaj növbəsinin yoxlanılması və server parametrlərinin konfiqurasiyası da daxil olmaqla, onun işini optimallaşdırmaq üçün hansı addımların atıla biləcəyini araşdıracağıq. Mesaj növbəsinin yoxlanılması ilə başlayın. mailq yardım proqramı bu işdə kömək edə bilər, onu aktivləşdirmək üçün terminalda müvafiq əmri daxil edin:
mailq
Bu, əgər varsa, növbədəki mesajların siyahısını göstərəcək. Hər bir mesaj özünəməxsus identifikatoru və göndərmə statusu haqqında məlumatla göstəriləcək. Oxşar nəticə poçt müştəri qeydlərini nəzərdən keçirməklə əldə edilə bilər.
Əksər hallarda, server spam göndərməyə başlayanda kompromis halında yüksək yüklənmə baş verir. Bununla belə, inzibatçı yoxladıqdan sonra serverin kənardan hücuma məruz qalmadığına əmindirsə və istifadəçilər spama laqeyd yanaşmırlarsa, poçt serverinin optimallaşdırılmasına keçməyin vaxtıdır. Budur kömək edəcək addımlar:
- Domeninizin DNS qeydlərinin düzgün konfiqurasiya edildiyinə əmin olun, o cümlədən SPF, dkim uzantısıvə DMARC uzadılması poçt çatdırılmasını yaxşılaşdırmaq və spamdan qorumaq üçün qeydlər. Parametrlərin düzgün konfiqurasiyası haqqında məqalədə tapa bilərsiniz poçt serverinin diaqnostikası.
- Blokların qarşısını almaq və poçtun çatdırılmasını sürətləndirmək üçün şəbəkə parametrlərini, o cümlədən firewall konfiqurasiyası və marşrutlaşdırma qaydalarını yoxlayın.
- Server yükünə uyğun olaraq mesaj növbəsi parametrlərini konfiqurasiya edin. Buraya maksimum növbə ölçüsünü və vaxtaşımlarını təyin etmək daxil ola bilər.
- Daha əvvəl bu məqalədə müzakirə etdiyimiz həll yollarını nəzərdən keçirin. Performansı artırmaq üçün poçt serveri verilənlər bazasını vaxtaşırı optimallaşdırın, DNS sorğuları kimi məlumatların axtarışını və işlənməsini sürətləndirmək üçün keşləmə mexanizmlərindən istifadə edin.
- Əgər poçt serveri hələ də müntəzəm olaraq yüksək yüklə qarşılaşırsa, poçt serverləri çoxluğu və ya bulud həllərindən istifadə kimi miqyaslandırma seçimlərini nəzərdən keçirin.
Nəticə
Artan server yükü veb saytın yükləmə sürətinə birbaşa təsir edir, nəticədə istifadəçi təcrübəsinə və axtarış motorlarında nüfuzuna təsir göstərir. Beləliklə, bu yükün effektiv idarə edilməsi resursun davamlı funksionallığının təmin edilməsində və ziyarətçilər üçün əlçatanlığının artırılmasında əsas rol oynayır.