W tym artykule zagłębimy się w to, dlaczego występuje zwiększone obciążenie serwera i omówimy różne sposoby optymalizacji procesów o dużym obciążeniu. Szczególną uwagę poświęcimy optymalizacji kodu w Apache/Nginx i MySQL, porozmawiamy o buforowaniu jako narzędziu pomocniczym, a także rozważymy możliwe zagrożenia zewnętrzne, takie jak ataki DDOS, i sposoby ich zapobiegania.
Dlaczego występuje obciążenie serwera
Przed przystąpieniem do optymalizacji serwera konieczne jest przeprowadzenie dokładnej analizy bieżącego obciążenia zasobów. Obejmuje to pomiar obciążenia procesora, użycia pamięci RAM, aktywności sieciowej i innych kluczowych parametrów. Zrozumienie dynamiki i obciążeń szczytowych pozwala na identyfikację wąskich gardeł i optymalizację alokacji zasobów, zwiększając w ten sposób stabilność i wydajność infrastruktury serwera.
W celu wstępnego rozwiązania problemu dużego obciążenia serwera zalecamy przeprowadzenie ogólna diagnostyka serwera. Jeśli to nie wystarczy, należy przeprowadzić bardziej szczegółowe badania. analiza zasobów jest konieczne. Jako narzędzie pomocnicze, eksploracja logi Linuxa Serwer może okazać się pomocny, ponieważ to właśnie tam w większości przypadków należy szukać źródła problemu.
Optymalizacja serwera Apache/Nginx
Zwiększone obciążenie serwera z powodu indeksowania
Zwiększone obciążenie spowodowane indeksowaniem na serwerze może wystąpić na przykład, gdy wyszukiwarki skanują dużą liczbę stron w witrynie. Może to prowadzić do zwiększonego wykorzystania zasobów serwera, a w konsekwencji spowolnienia działania witryny. Zidentyfikowanie przyczyny jest stosunkowo proste; należy otworzyć plik znajdujący się w:
/var/www/httpd-logs/sitename.access.log
Po zindeksowaniu przez wyszukiwarki użytkownik zobaczy wpisy o następującym charakterze:
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)"
Pierwszym rozwiązaniem, które zmniejszy obciążenie, jest użycie ustawień meta tagów „brak indeksu” oraz "nofollow" na stronach, które nie muszą być indeksowane. Drugim rozwiązaniem jest .htaccess plik, do którego należy dodać wpisy odpowiadające konkretnym wyszukiwarkom, np. w celu ukrycia ich przed Yandex i Google:
SetEnvIfNoCase User-Agent "^Yandex" search_bot
SetEnvIfNoCase User-Agent "^Googlebot" search_bot
Order Allow,Deny
Allow from all
Deny from env=search_bot
Podobnie, należy dokonać edycji w przypadku innych wyszukiwarek. Należy zauważyć, że możliwości .htaccess nie ograniczają się tylko do blokowania indeksowania. Zalecamy zapoznanie się z jego głównymi funkcjami w artykuł.
Korzystanie z ustawień buforowania
Nieprawidłowe ustawienia buforowania na serwerze mogą również prowadzić do dużego obciążenia. Aby zoptymalizować ten parametr, należy wprowadzić odpowiednie zmiany w plikach konfiguracyjnych lub .htaccessW przypadku Apache’a preferowana jest druga opcja, w przypadku Nginx – pierwsza.
Na Apache serwer, musisz otworzyć Plik .htacess plik i wstaw następujący kod:
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf|doc|docx)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>
Następnie włącz Wygasa modułu za pomocą polecenia:
sudo a2enmod expires
Następnie należy ponownie uruchomić serwer WWW:
sudo service apache2 restart
Następnie aktywuj moduł poprzez podanie następujących informacji:
ExpiresActive On
Na nginx serwera wystarczy dodać do pliku konfiguracyjnego poniższy kod:
location ~* .(jpg|jpeg|gif|png|ico|css|swf|flv|doc|docx)$ {
root /var/www/yoursite.com;
}
I wykonaj ponowne załadowanie usługi:
sudo service nginx restart
Należy pamiętać, że przy tych ustawieniach Dopuszczać oraz Odmów dyrektywy zostaną pominięte.
Korzystanie z kompresji danych
Włączanie kompresji danych za pomocą Gzip na serwerach internetowych Apache i Nginx pomaga zmniejszyć ilość danych przesyłanych pomiędzy serwerem a klientem, co poprawia wydajność i skraca czas ładowania strony internetowej.
Aby włączyć Gzip on Apache, musisz aktywować mod_deflate moduł:
sudo a2enmod deflate
Następnie uruchom ponownie serwer WWW:
sudo service apache2 restart
Na koniec dodaj poniższy blok do pliku konfiguracyjnego lub .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>
Ta konfiguracja włącza kompresję dla niektórych typów plików i wyłącza ją dla obrazów.
W przypadku nginx, konfiguracja odbywa się w http blok pliku konfiguracyjnego. Należy dodać następujący 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;
Podobny do Apache, tutaj ustawiane są parametry kompresji dla pewnych typów plików. Po wprowadzeniu zmian na dowolnym serwerze internetowym wymagane jest ponowne załadowanie usługi:
sudo service apache2 restart
Or
sudo service nginx restart
Atak DDOS na serwer
Wysokie obciążenie serwera może wystąpić w wyniku ataku DDoS. Identyfikacja obecności ataku DDoS może zostać przeprowadzona poprzez monitorowanie nagłego wzrostu ruchu, nietypowych żądań i spadków wydajności serwera. Przeglądanie dzienników pod kątem powtarzających się żądań z jednego adresu IP lub skanowanie portów może również wskazywać na możliwy atak DDoS. Istnieje wiele środków ochrony, ale omówimy tylko podstawowe.
Korzystanie z CDN (sieci dostarczania treści). CDN może służyć jako pośrednik między serwerem internetowym a użytkownikami, dystrybuując ruch i buforując zawartość w celu złagodzenia skutków ataku DDoS. CDN mogą również mieć wbudowane mechanizmy ochrony przed atakami DDoS, w tym dystrybucję obciążenia i filtrowanie ruchu.
Konfigurowanie zapór sieciowych i systemów wykrywania włamań (IDS/IPS). Zapory sieciowe można skonfigurować tak, aby filtrowały ruch na podstawie różnych kryteriów, takich jak adresy IP i porty. IDS/IPS mogą wykrywać nieprawidłowe zachowanie ruchu i blokować podejrzane połączenia. Te narzędzia mogą być skuteczne w śledzeniu i blokowaniu potencjalnie złośliwego ruchu.
Konfigurowanie serwerów internetowych Apache i Nginx w celu złagodzenia skutków ataków DDoS.
Jako rozwiązanie dla Apache'a umożliwiamy mod_evasive moduł. Aby to zrobić, usuń komentarz lub dodaj następujący wiersz w httpd.conf or apache2.conf plik konfiguracyjny:
LoadModule evasive20_module modules/mod_evasive.so
W tym samym pliku należy dodać blok ustawień:
<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>
Podobnie aktywujemy limit_prędkości moduł:
LoadModule ratelimit_module modules/mod_ratelimit.so
I dodaj konfigurację:
<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>
Konfiguracja dla nginx jest podobne do Apache, w nginx.conf pliku konfiguracyjnego należy zastosować następujące dyrektywy:
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;
...
}
}
Po wprowadzeniu zmian w każdej z usług konieczne jest ich ponowne załadowanie:
sudo systemctl restart apache2
Lub:
sudo systemctl restart nginx
Przedstawione przykłady przedstawiają jedynie podstawową konfigurację, którą można dostosować do konkretnych wymagań i charakteru ataków.
Optymalizacja zapytań MySQL
Optymalizacja zapytań do bazy danych MySQL na serwerze internetowym może być osiągnięta na różne sposoby, a jednym z nich jest prawidłowa konfiguracja pliku konfiguracyjnego. Zazwyczaj ten plik nazywa się mój.cnf or mój.ini i znajduje się w /itp/ or /etc/mysql/ katalog. Musisz go otworzyć i dokonać następujących zmian:
[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
Rozważmy również dodatkowe zalecenia, które mogą ułatwić interakcję z bazą danych serwera:
- Użyj WYJAŚNIJ polecenie przed zapytaniem SQL w celu analizy jego wykonania. Pozwala to uzyskać plan wykonania zapytania i określić, które indeksy są używane, które tabele są skanowane itd.
- Indeksy przyspieszają wyszukiwanie danych, więc odpowiednio zaprojektowane indeksy mogą znacznie poprawić wydajność zapytań. Zwróć uwagę na kolumny, które są często używane w WHERE or DOŁĄCZ warunki.
- Unikaj używania WYBIERZ *. Określ tylko te kolumny, które są naprawdę niezbędne dla zapytania, zamiast wybierać wszystkie kolumny w tabeli.
- Unikaj używania funkcji w WHERE warunki. Używanie funkcji (takich jak NIŻSZY, GÓRNY, LEWA, PRAWO) w WHERE warunki mogą sprawić, że indeksy staną się bezużyteczne. Staraj się unikać ich bezpośredniego użycia w warunkach.
- Zastosowanie INNER JOIN gdzie to możliwe, ponieważ jest to zazwyczaj bardziej wydajne. Upewnij się również, że odpowiednie kolumny do łączenia mają indeksy.
- Zastosowanie LIMIT aby ograniczyć liczbę zwracanych wierszy, jeśli potrzebujesz uzyskać tylko określoną liczbę wyników.
- Rozważ buforowanie wyników zapytań, zwłaszcza jeśli rzadko ulegają zmianom, aby zmniejszyć obciążenie serwera.
Serwer pocztowy powoduje duże obciążenie serwera
W tej sekcji przyjrzymy się, jak ustalić, że serwer pocztowy jest obciążony i jakie kroki można podjąć, aby zoptymalizować jego działanie, w tym sprawdzenie kolejki wiadomości i skonfigurowanie parametrów serwera. Zacznij od sprawdzenia kolejki wiadomości. poczta Narzędzie to może w tym pomóc, aby je aktywować, wprowadź odpowiednie polecenie w terminalu:
mailq
Spowoduje to wyświetlenie listy wiadomości w kolejce, jeśli takie istnieją. Każda wiadomość zostanie wyświetlona z jej unikalnym identyfikatorem i informacjami o statusie wysyłania. Podobny wynik można uzyskać, przeglądając dzienniki klienta poczty.
W większości przypadków wysokie obciążenie występuje w przypadku naruszenia bezpieczeństwa serwera, gdy zaczyna on wysyłać spam. Jeśli jednak po sprawdzeniu administrator jest pewien, że serwer nie został zaatakowany z zewnątrz, a użytkownicy nie zaniedbują spamu, czas przejść do optymalizacji serwera pocztowego. Oto kroki, które pomogą:
- Upewnij się, że rekordy DNS Twojej domeny są poprawnie skonfigurowane, w tym: SPF, rozszerzenie dkim, DMARC rekordy w celu usprawnienia dostarczania poczty i ochrony przed spamem. Prawidłową konfigurację parametrów można znaleźć w artykule na diagnostyka serwera pocztowego.
- Sprawdź ustawienia sieciowe, w tym konfigurację zapory sieciowej i reguły routingu, aby uniknąć blokad i przyspieszyć dostarczanie poczty.
- Skonfiguruj parametry kolejki komunikatów zgodnie z obciążeniem serwera. Może to obejmować ustawienie maksymalnego rozmiaru kolejki i limitów czasu.
- Rozważ rozwiązania, które omówiliśmy wcześniej w tym artykule. Okresowo optymalizuj bazę danych serwera poczty, aby poprawić wydajność, używaj mechanizmów buforowania, aby przyspieszyć wyszukiwanie i przetwarzanie danych, takich jak zapytania DNS.
- Jeśli serwer pocztowy nadal regularnie napotyka na duże obciążenia, należy rozważyć opcje skalowania, takie jak użycie klastra serwerów pocztowych lub rozwiązań w chmurze.
Podsumowanie
Zwiększone obciążenie serwera bezpośrednio wpływa na szybkość ładowania witryny, co ostatecznie wpływa na doświadczenie użytkownika i reputację w wyszukiwarkach. Dlatego skuteczne zarządzanie tym obciążeniem odgrywa kluczową rolę w zapewnieniu ciągłej funkcjonalności zasobu i zwiększeniu jego dostępności dla odwiedzających.