Šiame straipsnyje mes gilinsimės į tai, kodėl padidėja serverio apkrova, ir aptarsime įvairius būdus, kaip optimizuoti didelės apkrovos procesus. Ypatingas dėmesys bus skiriamas kodo optimizavimui Apache/Nginx ir MySQL, kalbėsime apie talpyklą kaip pagalbinį įrankį, taip pat apsvarstysime galimas išorines grėsmes, tokias kaip DDOS atakos, ir būdus joms užkirsti kelią.
Kodėl atsiranda serverio apkrova
Prieš pradedant serverio optimizavimą, būtina atlikti išsamią esamos išteklių apkrovos analizę. Tai apima procesoriaus apkrovos, RAM naudojimo, tinklo veiklos ir kitų pagrindinių parametrų matavimą. Dinamikos ir didžiausios apkrovos supratimas leidžia nustatyti kliūtis ir optimizuoti išteklių paskirstymą, taip padidinant serverio infrastruktūros stabilumą ir našumą.
Pradiniam didelės serverio apkrovos trikčių šalinimui rekomenduojame atlikti a bendroji serverio diagnostika. Jei to nepakanka, išsamiau išteklių analizė yra būtinas. Kaip pagalbinė priemonė, tiriant „Linux“ žurnalai serveris gali būti naudingas, nes čia dažniausiai randamas problemos šaltinis.
„Apache“ / „Nginx“ serverio optimizavimas
Padidėjusi serverio apkrova dėl indeksavimo
Padidėjusi apkrova dėl indeksavimo serveryje gali atsirasti, pavyzdžiui, kai paieškos sistemos nuskaito daug jūsų svetainės puslapių. Dėl to gali padidėti serverio išteklių naudojimas ir, atitinkamai, sulėtėti svetainės veikimas. Priežastį nustatyti gana paprasta; reikia atidaryti failą, esantį adresu:
/var/www/httpd-logs/sitename.access.log
Kai indeksuoja paieškos sistemos, vartotojas matys tokio pobūdžio įrašus:
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)"
Kaip pirmąjį sprendimą sumažinti apkrovą galite naudoti metažymų nustatymą "noindex" bei "nofollow" puslapiuose, kurių nereikia indeksuoti. Antrasis sprendimas yra .htaccess failą, kuriame reikia pridėti įrašų, atitinkančių konkrečias paieškos sistemas, pavyzdžiui, norint paslėpti nuo „Yandex“ ir „Google“:
SetEnvIfNoCase User-Agent "^Yandex" search_bot
SetEnvIfNoCase User-Agent "^Googlebot" search_bot
Order Allow,Deny
Allow from all
Deny from env=search_bot
Panašiai reikia atlikti kitų paieškos sistemų pakeitimus. Reikėtų pažymėti, kad .htaccess galimybės neapsiriboja vien indeksavimo blokavimu. Rekomenduojame išsamiau susipažinti su pagrindinėmis jo funkcijomis straipsnis.
Talpyklos nustatymų naudojimas
Neteisingi talpyklos nustatymai serveryje taip pat gali sukelti didelę apkrovą. Norint optimizuoti šį parametrą, reikia atlikti atitinkamus pakeitimus konfigūracijos failuose arba .htaccess. „Apache“ atveju pageidautina pastaroji parinktis, „Nginx“ – pirmoji.
Ant apache serverį, turite atidaryti .htacess failą ir įterpkite šį kodą:
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf|doc|docx)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>
Tada įjunkite Pasibaigia modulis naudojant komandą:
sudo a2enmod expires
Po to iš naujo paleiskite žiniatinklio serverį:
sudo service apache2 restart
Ir suaktyvinkite modulį nurodydami:
ExpiresActive On
A nginx serverio, pakanka į konfigūracijos failą įtraukti šį kodą:
location ~* .(jpg|jpeg|gif|png|ico|css|swf|flv|doc|docx)$ {
root /var/www/yoursite.com;
}
Ir atlikite paslaugos perkrovimą:
sudo service nginx restart
Atminkite, kad naudojant šiuos nustatymus Leisti bei Paneigti direktyvos bus apeinamos.
Duomenų glaudinimo naudojimas
Duomenų glaudinimo įgalinimas naudojant Gzip „Apache“ ir „Nginx“ žiniatinklio serveriuose padeda sumažinti duomenų, perduodamų tarp serverio ir kliento, kiekį, o tai pagerina našumą ir sumažina tinklalapio įkėlimo laiką.
Norėdami įgalinti Gzip on apache, turite suaktyvinti mod_deflate modulis:
sudo a2enmod deflate
Tada iš naujo paleiskite žiniatinklio serverį:
sudo service apache2 restart
Galiausiai pridėkite šį bloką prie konfigūracijos failo arba .htaccess:
<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>
Ši konfigūracija įgalina tam tikrų tipų failų glaudinimą ir išjungia vaizdams.
Jeigu nginx, konfigūracija vyksta http konfigūracijos failo blokas. Reikia pridėti šį kodą:
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;
Panašus į apache, čia nustatomi tam tikrų tipų failų glaudinimo parametrai. Pakeitus bet kurį iš žiniatinklio serverių, reikia iš naujo įkelti paslaugą:
sudo service apache2 restart
Or
sudo service nginx restart
DDOS ataka serveryje
Didelė serverio apkrova gali atsirasti dėl DDoS atakos. DDoS atakos buvimą galima nustatyti stebint staigų srauto padidėjimą, neįprastas užklausas ir serverio našumo sumažėjimą. Žurnalų peržiūra dėl pakartotinių užklausų iš vieno IP adreso arba prievado nuskaitymo taip pat gali rodyti galimą DDoS ataką. Apsaugos priemonių yra daug, tačiau aptarsime tik pagrindus.
CDN (turinio pristatymo tinklo) naudojimas. CDN gali tarnauti kaip tarpininkas tarp jūsų žiniatinklio serverio ir vartotojų, paskirstydamas srautą ir talpyklos turinį, kad sumažintų DDoS atakos poveikį. CDN taip pat gali turėti įmontuotus DDoS apsaugos mechanizmus, įskaitant apkrovos paskirstymą ir srauto filtravimą.
Ugniasienės ir įsibrovimo aptikimo sistemų (IDS/IPS) konfigūravimas. Užkardas galima sukonfigūruoti taip, kad srautas būtų filtruojamas pagal įvairius kriterijus, pvz., IP adresus ir prievadus. IDS/IPS gali aptikti neįprastą eismo elgesį ir blokuoti įtartinus ryšius. Šios priemonės gali būti veiksmingos stebint ir blokuojant potencialiai kenksmingą srautą.
„Apache“ ir „Nginx“ žiniatinklio serverių konfigūravimas, siekiant sumažinti DDoS atakų poveikį.
Kaip „Apache“ sprendimą įjungiame mod_evasive modulis. Norėdami tai padaryti, panaikinkite komentarą arba įtraukite šią eilutę httpd.conf or apache2.conf konfigūracijos failas:
LoadModule evasive20_module modules/mod_evasive.so
Tame pačiame faile turite pridėti nustatymų bloką:
<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>
Panašiai suaktyviname mod_ratelimit modulis:
LoadModule ratelimit_module modules/mod_ratelimit.so
Ir pridėkite konfigūraciją:
<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>
Konfigūracija skirta nginx yra panašus į apache. Be nginx.conf konfigūracijos failą, reikia naudoti šias direktyvas:
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;
...
}
}
Atlikus kiekvienos paslaugos pakeitimus, jas reikia įkelti iš naujo:
sudo systemctl restart apache2
arba:
sudo systemctl restart nginx
Šiuose pavyzdžiuose pateikiama tik pagrindinė konfigūracija, kurią galima toliau pritaikyti atsižvelgiant į konkrečius reikalavimus ir atakų pobūdį.
MySQL užklausų optimizavimas
MySQL duomenų bazės užklausų optimizavimas žiniatinklio serveryje gali būti pasiektas įvairiais būdais, ir vienas iš jų yra tinkama konfigūracijos failo konfigūracija. Paprastai šis failas yra pavadintas mano.cnf or mano.ini ir yra / etc / or /etc/mysql/ katalogas. Turite jį atidaryti ir atlikti šiuos pakeitimus:
[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
Taip pat apsvarstykime papildomas rekomendacijas, kurios gali palengvinti sąveiką su serverio duomenų baze:
- Naudokite AIŠKINTI komandą prieš SQL užklausą, kad būtų galima analizuoti jos vykdymą. Tai leidžia gauti užklausos vykdymo planą ir nustatyti, kurie indeksai naudojami, kurios lentelės nuskaitomos ir pan.
- Indeksai pagreitina duomenų paiešką, todėl tinkamai sukurti indeksai gali žymiai pagerinti užklausos našumą. Atkreipkite dėmesį į stulpelius, kurie dažnai naudojami KUR or PRISIJUNK sąlygos.
- Venkite naudoti SELECT *. Užuot pasirinkę visus lentelės stulpelius, nurodykite tik tuos stulpelius, kurie tikrai reikalingi jūsų užklausai.
- Venkite naudoti funkcijas KUR sąlygomis. Naudojant funkcijas (pvz ŽEMIAU, VIRŠUTINIS, LEFT, TEISĖ) in KUR dėl sąlygų indeksai gali būti nenaudingi. Stenkitės vengti tiesioginio jų naudojimo sąlygomis.
- Paskirtis VIDINIS PRISIJUNGTI kur įmanoma, nes tai paprastai yra efektyvesnė. Taip pat įsitikinkite, kad atitinkamuose sujungimo stulpeliuose yra indeksai.
- Paskirtis RIBINĖS apriboti grąžinamų eilučių skaičių, jei reikia gauti tik tam tikrą rezultatų skaičių.
- Apsvarstykite galimybę išsaugoti užklausų rezultatus, ypač jei jie retai keičiasi, kad sumažintumėte serverio apkrovą.
Pašto serveris sukuria didelę serverio apkrovą
Šiame skyriuje išnagrinėsime, kaip nustatyti, ar pašto serveris patiria didelę apkrovą ir kokių veiksmų galima imtis norint optimizuoti jo veikimą, įskaitant pranešimų eilės patikrinimą ir serverio parametrų konfigūravimą. Pradėkite nuo pranešimų eilės patikrinimo. The paštasq Tai gali padėti programa, kurią norite suaktyvinti, terminale įveskite atitinkamą komandą:
mailq
Bus rodomas eilėje esančių pranešimų sąrašas, jei tokių yra. Kiekvienas pranešimas bus rodomas su unikaliu identifikatoriumi ir informacija apie siuntimo būseną. Panašų rezultatą galima gauti peržiūrėjus pašto programos žurnalus.
Daugeliu atvejų didelė apkrova atsiranda, kai serveris pažeidžiamas, kai jis pradeda siųsti šlamštą. Tačiau jei patikrinęs administratorius įsitikinęs, kad serveris nebuvo užpultas iš išorės, o vartotojai neapleidžia šiukšlių, laikas pereiti prie pašto serverio optimizavimo. Štai žingsniai, kurie padės:
- Įsitikinkite, kad domeno DNS įrašai yra tinkamai sukonfigūruoti, įskaitant SPF, dkim plėtinysir DMARC plėtinys įrašus, kad pagerintų laiškų pristatymą ir apsaugotų nuo šiukšlių. Teisingą parametrų konfigūraciją rasite straipsnyje pašto serverio diagnostika.
- Patikrinkite tinklo nustatymus, įskaitant ugniasienės konfigūraciją ir maršruto taisykles, kad išvengtumėte blokavimų ir pagreitintumėte laiškų pristatymą.
- Konfigūruokite pranešimų eilės parametrus pagal serverio apkrovą. Tai gali apimti didžiausio eilės dydžio ir skirtojo laiko nustatymą.
- Apsvarstykite sprendimus, kuriuos aptarėme šiame straipsnyje anksčiau. Periodiškai optimizuokite pašto serverio duomenų bazę, kad pagerintumėte našumą, naudokite talpyklos mechanizmus, kad pagreitintumėte duomenų paiešką ir apdorojimą, pvz., DNS užklausas.
- Jei pašto serveris vis tiek reguliariai susiduria su didele apkrova, apsvarstykite mastelio keitimo parinktis, pvz., pašto serverių grupės arba debesies sprendimų naudojimą.
Išvada
Padidėjusi serverio apkrova daro tiesioginę įtaką svetainės įkėlimo greičiui, galiausiai paveikiant vartotojų patirtį ir reputaciją paieškos sistemose. Taigi efektyvus šios apkrovos valdymas vaidina pagrindinį vaidmenį užtikrinant nuolatinį resurso funkcionalumą ir didinant jo prieinamumą lankytojams.