Neste artigo, analizaremos por que se produce o aumento da carga do servidor e discutiremos varias formas de optimizar os procesos de alta carga. Prestarase especial atención á optimización do código en Apache/Nginx e MySQL, falaremos do caché como ferramenta auxiliar, e tamén consideraremos posibles ameazas externas, como ataques DDOS, e formas de evitalas.
Por que se produce a carga do servidor
Antes de proceder á optimización do servidor, é necesario realizar unha análise exhaustiva da carga actual dos recursos. Isto inclúe medir a carga da CPU, o uso da RAM, a actividade da rede e outros parámetros clave. Comprender a dinámica e os picos de carga permite identificar os pescozos de botella e optimizar a asignación de recursos, aumentando así a estabilidade e o rendemento da infraestrutura do servidor.
Para a resolución inicial de problemas de alta carga do servidor, recomendamos realizar un diagnóstico xeral do servidor . Se isto non é suficiente, é necesaria unha análise máis detallada dos recursos . Como ferramenta auxiliar, pode ser útil explorar os rexistros do servidor Linux, xa que é onde se atopa a orixe do problema na maioría dos casos.
Optimización do servidor Apache/Nginx
Aumento da carga do servidor debido á indexación
O aumento da carga debido á indexación no servidor pode ocorrer, por exemplo, cando os motores de busca escanean un gran número de páxinas do teu sitio. Isto pode levar a un maior uso dos recursos do servidor e, en consecuencia, ralentizar o rendemento do sitio. Identificar a causa é relativamente sinxelo; cómpre abrir o ficheiro situado en:
/var/www/httpd-logs/sitename.access.log
Cando o indexen os buscadores, o usuario verá entradas da seguinte natureza:
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)"
Como primeira solución para reducir a carga, podes usar a configuración das metaetiquetas "noindex" e "nofollow" en páxinas que non precisan ser indexadas. A segunda solución é o ficheiro .htaccess , onde se deben engadir entradas correspondentes a motores de busca específicos, por exemplo, para ocultalas de 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
Do mesmo xeito, cómpre facer edicións para outros motores de busca. Cómpre sinalar que as capacidades de .htaccess non se limitan só a bloquear a indexación. Recomendamos familiarizarse máis coas súas principais características no artigo.
Usando a configuración de caché
Unha configuración de caché incorrecta no servidor tamén pode levar a unha carga elevada. Para optimizar este parámetro, é necesario facer os cambios correspondentes nos ficheiros de configuración ou en .htaccess . No caso de Apache, é preferible a última opción, para Nginx, a primeira.
Nun servidor Apache , debes abrir o ficheiro .htacess e inserir o seguinte código:
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf|doc|docx)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>
A continuación, activa o módulo Expires usando o comando:
sudo a2enmod expires
Despois diso, reinicie o servidor web:
sudo service apache2 restart
E activa o módulo especificando:
ExpiresActive On
Nun servidor Nginx , abonda con engadir o seguinte código ao ficheiro de configuración:
location ~* .(jpg|jpeg|gif|png|ico|css|swf|flv|doc|docx)$ {
root /var/www/yoursite.com;
}
E realiza unha recarga do servizo:
sudo service nginx restart
Ten en conta que con esta configuración, as directivas Permitir e Denegar serán omitidas.
Usando compresión de datos
Activar a compresión de datos mediante Gzip nos servidores web Apache e Nginx axuda a reducir a cantidade de datos transmitidos entre o servidor e o cliente, o que mellora o rendemento e reduce o tempo de carga da páxina web.
Para activar Gzip en Apache , necesitas activar o módulo mod_deflate :
sudo a2enmod deflate
A continuación, reinicie o servidor web:
sudo service apache2 restart
E, finalmente, engade o seguinte bloque ao ficheiro de configuración ou .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>
Esta configuración permite a compresión para certos tipos de ficheiros e desactívaa para as imaxes.
No caso de Nginx , a configuración ocorre no bloque http do ficheiro de configuración. É necesario engadir o seguinte código:
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;
Do mesmo xeito que en Apache , aquí establécense os parámetros de compresión para certos tipos de ficheiros. Despois de facer cambios en calquera dos servidores web, é necesario recargar o servizo:
sudo service apache2 restart
Or
sudo service nginx restart
Ataque DDOS ao servidor
A alta carga do servidor pode ocorrer como resultado dun ataque DDoS. A identificación da presenza dun ataque DDoS pódese facer mediante o seguimento dun aumento repentino de tráfico, solicitudes anormais e caídas de rendemento do servidor. A revisión dos rexistros de solicitudes repetidas desde un enderezo IP ou a exploración de portos tamén pode indicar un posible ataque DDoS. Hai moitas medidas de protección, pero só comentaremos as bases.
Usando unha CDN (Rede de Distribución de Contidos) . Unha CDN pode servir como intermediaria entre o teu servidor web e os usuarios, distribuíndo o tráfico e almacenando contido na caché para mitigar o impacto dun ataque DDoS. As CDN tamén poden ter mecanismos de protección DDoS integrados, incluíndo a distribución da carga e o filtrado do tráfico.
Configuración de cortafuegos e sistemas de detección de intrusións (IDS/IPS) . Os cortafuegos pódense configurar para filtrar o tráfico segundo varios criterios, como enderezos IP e portos. Os IDS/IPS poden detectar un comportamento anormal do tráfico e bloquear conexións sospeitosas. Estas ferramentas poden ser eficaces para rastrexar e bloquear o tráfico potencialmente malicioso.
Configurando servidores web Apache e Nginx para mitigar o impacto dos ataques DDoS.
Como solución para Apache, activamos o módulo mod_evasive . Para iso, descomenta ou engade a seguinte liña no ficheiro de configuración httpd.conf ou apache2.conf :
LoadModule evasive20_module modules/mod_evasive.so
No mesmo ficheiro, cómpre engadir un bloque de configuración:
<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>
Do mesmo xeito, activamos o módulo mod_ratelimit :
LoadModule ratelimit_module modules/mod_ratelimit.so
E engade a configuración:
<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>
A configuración para Nginx é similar á de Apache . No ficheiro de configuración nginx.conf , cómpre empregar as seguintes directivas:
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;
...
}
}
Despois de facer cambios en cada un dos servizos, hai que volver cargalos:
sudo systemctl restart apache2
Ou:
sudo systemctl restart nginx
Estes exemplos proporcionan só unha configuración básica, que se pode adaptar aínda máis dependendo dos requisitos específicos e da natureza dos ataques.
Optimización de consultas MySQL
A optimización das consultas da base de datos MySQL nun servidor web pódese conseguir de varias maneiras, e unha delas é a configuración axeitada do ficheiro de configuración. Normalmente, este ficheiro chámase my.cnf ou my.ini e está situado no directorio /etc/ ou /etc/mysql/ . Debe abrilo e facer os seguintes cambios:
[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
Consideremos tamén recomendacións adicionais que poden facilitar a interacción coa base de datos do servidor:
- Utilizar a EXPLICAR comando antes dunha consulta SQL para analizar a súa execución. Isto permítelle obter un plan de execución para a consulta e determinar que índices se utilizan, que táboas se analizan, etc.
- Os índices aceleran a busca de datos, polo que os índices deseñados correctamente poden mellorar significativamente o rendemento das consultas. Preste atención ás columnas que se usan con frecuencia ONDE or Rexístrese se condicións.
- Evite usar SELECCIONAR *. Especifique só as columnas que sexan realmente necesarias para a súa consulta, en lugar de seleccionar todas as columnas dunha táboa.
- Evite usar funcións en ONDE condicións. Usando funcións (como BAIXO, SUPERIOR, Esquerda, DEREITO) en ONDE as condicións poden facer que os índices sexan inútiles. Intente evitar o seu uso directo en condicións.
- Usar ENTRADA INTERIOR sempre que sexa posible, xa que adoita ser máis eficiente. Ademais, asegúrese de que as columnas correspondentes para unir teñan índices.
- Usar LÍMITE para restrinxir o número de filas devoltas se precisa obter só un determinado número de resultados.
- Considere almacenar na caché os resultados das consultas, especialmente se raramente cambian, para reducir a carga do servidor.
O servidor de correo crea alta carga no servidor
Nesta sección, exploraremos como determinar que o servidor de correo está a experimentar unha carga elevada e que pasos se poden tomar para optimizar o seu funcionamento, incluíndo a comprobación da cola de mensaxes e a configuración dos parámetros do servidor. Comeza comprobando a cola de mensaxes. A utilidade mailq pode axudar con isto; para activala, introduce o comando correspondente no terminal:
mailq
Isto amosará unha lista de mensaxes na cola, se as hai. Cada mensaxe mostrarase co seu identificador único e información sobre o estado de envío. Pódese obter un resultado semellante revisando os rexistros do cliente de correo.
Na maioría dos casos, a alta carga prodúcese no caso de comprometer o servidor cando comeza a enviar correo lixo. Non obstante, se despois de comprobar o administrador confía en que o servidor non foi atacado desde fóra e os usuarios non descoidan o spam, é hora de pasar á optimización do servidor de correo. Estes son os pasos que axudarán:
- Asegúrate de que os rexistros DNS do teu dominio estean configurados correctamente, incluíndo SPF, DKIMe DMARC rexistros para mellorar a entrega de correo e protexerse contra o spam. A configuración correcta dos parámetros pódese atopar no artigo sobre diagnóstico do servidor de correo.
- Comprobe a configuración da rede, incluída a configuración do firewall e as regras de enrutamento, para evitar bloqueos e acelerar a entrega de correo.
- Configure os parámetros da cola de mensaxes segundo a carga do servidor. Isto pode incluír establecer o tamaño máximo da cola e os tempos de espera.
- Considere as solucións que comentamos anteriormente neste artigo. Optimice periodicamente a base de datos do servidor de correo para mellorar o rendemento, use mecanismos de caché para acelerar a busca e procesamento de datos, como consultas DNS.
- Se o servidor de correo aínda ten unha carga elevada con regularidade, considere opcións de escalado, como usar un clúster de servidores de correo ou solucións na nube.
Conclusión
O aumento da carga do servidor afecta directamente á velocidade de carga do sitio web, afectando finalmente a experiencia do usuario e a reputación nos motores de busca. Así, a xestión eficaz desta carga xoga un papel fundamental para garantir a funcionalidade continua do recurso e aumentar a súa accesibilidade para os visitantes.