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 di carico elevato del server, si consiglia di eseguire una diagnostica generale del server . Se questa non è sufficiente, è necessaria un'analisi più dettagliata delle risorse . Come strumento ausiliario, può essere utile esaminare i log del server Linux, poiché nella maggior parte dei casi è lì che si trova la causa 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, è possibile utilizzare i meta tag "noindex" e "nofollow" sulle pagine che non necessitano di essere indicizzate. La seconda soluzione è il file .htaccess , in cui è necessario aggiungere le voci corrispondenti ai singoli motori di ricerca, ad esempio per nascondere i contenuti 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

Analogamente, è necessario apportare modifiche anche per altri motori di ricerca. Va notato che le funzionalità di .htaccess non si limitano al solo blocco dell'indicizzazione. Consigliamo di approfondire le sue caratteristiche principali nell'articolo.

Utilizzo delle impostazioni di memorizzazione nella cache

Impostazioni di caching errate sul server possono anche causare un carico elevato. Per ottimizzare questo parametro, è necessario apportare le modifiche appropriate ai file di configurazione o al file .htaccess . Nel caso di Apache, è preferibile quest'ultima opzione, per Nginx la prima.

Su un server Apache , è necessario aprire il file .htaccess e inserire 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 modulo Scadenza utilizzando il comando:

sudo a2enmod expires

Dopodiché riavvia il server web:

sudo service apache2 restart

E attiva il modulo specificando:

ExpiresActive On

Su un server Nginx , è 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, le direttive Allow e Deny verranno ignorate.

Utilizzo della compressione dei dati

L'attivazione della compressione dati tramite Gzip sui server web Apache e Nginx contribuisce a ridurre la quantità di dati trasmessi tra server e client, migliorando le prestazioni e riducendo i tempi di caricamento delle pagine web.

Per abilitare Gzip su Apache , è necessario attivare il modulo mod_deflate :

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 blocco http 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;

Analogamente ad Apache , anche qui vengono impostati i parametri di compressione per determinati tipi di file. Dopo aver apportato modifiche a uno qualsiasi dei server web, è necessario riavviare 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 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 disporre di 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 diversi criteri, come indirizzi IP e porte. I sistemi IDS/IPS sono in grado di rilevare comportamenti di traffico anomali e bloccare connessioni sospette. Questi strumenti possono essere efficaci nel tracciare e bloccare il traffico potenzialmente dannoso.

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

Come soluzione per Apache, abilitiamo il modulo mod_evasive . Per farlo, decommenta o aggiungi la seguente riga al file di configurazione httpd.conf o apache2.conf :

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>

Analogamente, attiviamo il modulo mod_ratelimit :

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 di Nginx è simile a quella di Apache . Nel file di configurazione nginx.conf , è 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 consiste nella corretta configurazione del file di configurazione. In genere, questo file si chiama my.cnf o my.ini e si trova nella directory /etc/ o /etc/mysql/ . È necessario aprirlo ed effettuare 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 è sottoposto a 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. Iniziamo controllando la coda dei messaggi. L' utility mailq può essere d'aiuto in questo; per attivarla, immettere 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 Certbot: installazione del certificato Let's Encrypt
Articolo successivo ❯ Diagnostica del carico del server

Chiedici informazioni su VPS

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