Knowledgebase Semplici istruzioni per lavorare con il servizio Profitserver
Principale Knowledgebase Riduzione del carico del server

Riduzione del carico del server


In questo articolo approfondiremo il motivo per cui si verifica un aumento del carico del server e discuteremo vari modi per ottimizzare i processi ad alto carico. Particolare attenzione sarà data all'ottimizzazione del codice in Apache/Nginx e MySQL, parleremo della memorizzazione nella cache come strumento ausiliario e prenderemo in considerazione anche possibili minacce esterne, come gli attacchi DDOS, e i modi per prevenirli.

Perché si verifica il carico del server

Prima di procedere all'ottimizzazione del server, è necessario condurre un'analisi approfondita del carico attuale sulle risorse. Ciò include la misurazione del carico della CPU, dell'utilizzo della RAM, dell'attività di rete e di altri parametri chiave. La comprensione delle dinamiche e dei carichi di picco consente di identificare i colli di bottiglia e ottimizzare l'allocazione delle risorse, aumentando così la stabilità e le prestazioni dell'infrastruttura del server.

Per la risoluzione iniziale dei problemi dovuti a carichi elevati del server, consigliamo di eseguire un diagnostica generale del serverSe questo non fosse sufficiente, una descrizione più dettagliata analisi delle risorse è necessario. Come strumento ausiliario, esplorare il log di Linux server può essere utile, poiché è lì che nella maggior parte dei casi si trova la fonte del problema.

Ottimizzazione del server Apache/Nginx

Aumento del carico del server dovuto all'indicizzazione

Un carico maggiore dovuto all'indicizzazione sul server può verificarsi, ad esempio, quando i motori di ricerca analizzano un gran numero di pagine del tuo sito. Ciò può portare a un maggiore utilizzo delle risorse del server e, di conseguenza, rallentare le prestazioni del sito. Identificare la causa è relativamente semplice; devi aprire il file che si trova in:

/var/www/httpd-logs/sitename.access.log

Quando vengono indicizzati dai motori di ricerca, l'utente vedrà voci della seguente natura:

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)"

Come prima soluzione per ridurre il carico, puoi utilizzare l'impostazione dei meta tag "senza indice" e "non seguire" sulle pagine che non hanno bisogno di essere indicizzate. La seconda soluzione è la .htaccess file, in cui è necessario aggiungere voci corrispondenti a motori di ricerca specifici, ad esempio per nascondersi da Yandex e Google:

SetEnvIfNoCase User-Agent "^Yandex" search_bot
SetEnvIfNoCase User-Agent "^Googlebot" search_bot
Order Allow,Deny
Allow from all
Deny from env=search_bot

Allo stesso modo, è necessario apportare modifiche per altri motori di ricerca. Va notato che le capacità di .htaccess non si limitano al solo blocco dell'indicizzazione. Consigliamo di acquisire maggiore familiarità con le sue caratteristiche principali in articolo.

Utilizzo delle impostazioni di memorizzazione nella cache

Anche impostazioni di caching non corrette sul server possono causare un carico elevato. Per ottimizzare questo parametro, è necessario apportare le modifiche corrispondenti nei file di configurazione o .htaccessNel caso di Apache, è preferibile quest'ultima opzione, per Nginx la prima.

Su un Apache server, è necessario aprire il .accesso file e inserisci il seguente codice:

<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf|doc|docx)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>

Quindi, abilita il Scade modulo utilizzando il comando:

sudo a2enmod expires

Dopodiché riavvia il server web:

sudo service apache2 restart

E attiva il modulo specificando:

ExpiresActive On

In un Nginx server, è sufficiente aggiungere il seguente codice al file di configurazione:

location ~* .(jpg|jpeg|gif|png|ico|css|swf|flv|doc|docx)$ {
root /var/www/yoursite.com;
}

Ed eseguire un ricaricamento del servizio:

sudo service nginx restart

Si noti che con queste impostazioni, il Consentire e Rifiuta le direttive verranno ignorate.

Utilizzo della compressione dei dati

Abilitazione della compressione dei dati tramite gzip sui server web Apache e Nginx aiuta a ridurre la quantità di dati trasmessi tra il server e il client, il che migliora le prestazioni e riduce i tempi di caricamento delle pagine web.

Abilitare gzip on Apache, devi attivare il file mod_deflate modulo:

sudo a2enmod deflate

Quindi, riavviare il server web:

sudo service apache2 restart

E infine, aggiungi il seguente blocco al file di configurazione o .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>

Questa configurazione abilita la compressione per determinati tipi di file e la disabilita per le immagini.

Nel caso di Nginx, la configurazione avviene nel http blocco del file di configurazione. È necessario aggiungere il seguente codice:

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;

Simile a Apache, qui vengono impostati i parametri di compressione per determinati tipi di file. Dopo aver apportato modifiche a uno qualsiasi dei server Web, è necessario ricaricare il servizio:

sudo service apache2 restart

Or

sudo service nginx restart

Attacco DDOS al server

Un carico elevato del server può verificarsi a seguito di un attacco DDoS. L'identificazione della presenza di un attacco DDoS può essere effettuata monitorando un improvviso aumento del traffico, richieste anomale e cali delle prestazioni del server. Anche la revisione dei log per richieste ripetute da un indirizzo IP o la scansione delle porte può indicare un possibile attacco DDoS. Esistono molte misure di protezione, ma discuteremo solo le basi.

Utilizzo di una CDN (Content Delivery Network). Una CDN può fungere da intermediario tra il tuo server web e gli utenti, distribuendo il traffico e memorizzando nella cache i contenuti per mitigare l'impatto di un attacco DDoS. Le CDN possono anche avere meccanismi di protezione DDoS integrati, tra cui la distribuzione del carico e il filtraggio del traffico.

Configurazione di firewall e sistemi di rilevamento delle intrusioni (IDS/IPS). I firewall possono essere configurati per filtrare il traffico in base a vari criteri, come indirizzi IP e porte. IDS/IPS possono rilevare comportamenti anomali del traffico e bloccare connessioni sospette. Questi strumenti possono essere efficaci nel tracciare e bloccare traffico potenzialmente dannoso.

Configurazione dei server web Apache e Nginx per mitigare l'impatto degli attacchi DDoS.

Come soluzione per Apache, abilitiamo il mod_evasive modulo. Per fare questo, rimuovere il commento o aggiungere la seguente riga nel httpd.conf or apache2.conf file di configurazione:

LoadModule evasive20_module modules/mod_evasive.so

Nello stesso file, è necessario aggiungere un blocco di impostazioni:

<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>

Allo stesso modo, attiviamo il limite di frequenza mod modulo:

LoadModule ratelimit_module modules/mod_ratelimit.so

E aggiungi la configurazione:

<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>

La configurazione per Nginx è simile Apache. Nel nginx.conf file di configurazione, è necessario utilizzare le seguenti direttive:

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;

        ...
    }
}

Dopo aver apportato modifiche a ciascuno dei servizi, è necessario ricaricarli:

sudo systemctl restart apache2

Oppure:

sudo systemctl restart nginx

Questi esempi forniscono solo una configurazione di base, che può essere ulteriormente adattata a seconda delle esigenze specifiche e della natura degli attacchi.

Ottimizzazione delle query MySQL

L'ottimizzazione delle query del database MySQL su un server web può essere ottenuta in vari modi, e uno di questi è la corretta configurazione del file di configurazione. In genere, questo file è denominato mio.cnf or mio.ini e si trova in /eccetera/ or /ecc/mysql/ directory. Devi aprirla e apportare le seguenti modifiche:

[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

Consideriamo anche altri consigli che possono facilitare l'interazione con il database del server:

  1. Usa il SPIEGARE comando prima di una query SQL per analizzarne l'esecuzione. Ciò consente di ottenere un piano di esecuzione per la query e di determinare quali indici vengono utilizzati, quali tabelle vengono scansionate, ecc.
  2. Gli indici velocizzano la ricerca dei dati, quindi indici progettati correttamente possono migliorare significativamente le prestazioni delle query. Prestare attenzione alle colonne che vengono utilizzate di frequente in DOVE or ISCRIVITI condizioni.
  3. Evitare di utilizzare SELECT *Specifica solo le colonne realmente necessarie per la tua query, anziché selezionare tutte le colonne in una tabella.
  4. Evitare di utilizzare funzioni in DOVE condizioni. Utilizzando funzioni (come INFERIORE, UPPER, SINISTRA, DESTRA) in DOVE le condizioni possono rendere gli indici inutili. Cerca di evitare il loro uso diretto nelle condizioni.
  5. Usa il INNER JOIN dove possibile, poiché solitamente è più efficiente. Inoltre, assicurati che le colonne corrispondenti per l'unione abbiano indici.
  6. Usa il LIMITE per limitare il numero di righe restituite se è necessario ottenere solo un certo numero di risultati.
  7. Per ridurre il carico del server, si consiglia di memorizzare nella cache i risultati delle query, soprattutto se cambiano raramente.

Il server di posta crea un carico elevato sul server

In questa sezione, esploreremo come determinare se il server di posta sta subendo un carico elevato e quali misure possono essere adottate per ottimizzarne il funzionamento, tra cui il controllo della coda dei messaggi e la configurazione dei parametri del server. Inizia con il controllo della coda dei messaggi. posta q utility può aiutare in questo, per attivarla, inserisci il comando corrispondente nel terminale:

mailq

Questo visualizzerà un elenco di messaggi nella coda, se presenti. Ogni messaggio verrà visualizzato con il suo identificativo univoco e informazioni sullo stato di invio. Un risultato simile può essere ottenuto esaminando i log del client di posta.

Nella maggior parte dei casi, si verifica un carico elevato in caso di compromissione del server quando inizia a inviare spam. Tuttavia, se dopo aver verificato l'amministratore è sicuro che il server non è stato attaccato dall'esterno e che gli utenti non stanno trascurando lo spam, è il momento di passare all'ottimizzazione del server di posta. Ecco i passaggi che ti aiuteranno:

  1. Assicurati che i record DNS del tuo dominio siano configurati correttamente, inclusi SPF, DKIMe DMARC record per migliorare la consegna della posta e proteggere dallo spam. La corretta configurazione dei parametri può essere trovata nell'articolo su diagnostica del server di posta.
  2. Controllare le impostazioni di rete, tra cui la configurazione del firewall e le regole di routing, per evitare blocchi e velocizzare la consegna della posta.
  3. Configura i parametri della coda dei messaggi in base al carico del server. Questo può includere l'impostazione della dimensione massima della coda e dei timeout.
  4. Considerate le soluzioni di cui abbiamo parlato in questo articolo in precedenza. Ottimizzate periodicamente il database del server di posta per migliorare le prestazioni, usate meccanismi di caching per velocizzare la ricerca e l'elaborazione dei dati, come le query DNS.
  5. Se il server di posta continua a riscontrare regolarmente un carico elevato, è possibile valutare opzioni di ridimensionamento, come l'utilizzo di un cluster di server di posta o soluzioni cloud.

Conclusione

L'aumento del carico del server influisce direttamente sulla velocità di caricamento del sito Web, incidendo in ultima analisi sull'esperienza utente e sulla reputazione nei motori di ricerca. Pertanto, la gestione efficace di questo carico svolge un ruolo chiave nel garantire la funzionalità continua della risorsa e nell'aumentarne l'accessibilità per i visitatori.

❮ Articolo precedente Diagnostica del carico del server
Articolo successivo ❯ Certbot: installazione del certificato Let's Encrypt

Chiedici informazioni su VPS

Siamo sempre pronti a rispondere alle vostre domande a qualsiasi ora del giorno e della notte.