In diesem Artikel untersuchen wir die Ursachen für erhöhte Serverlast und diskutieren verschiedene Möglichkeiten zur Optimierung hochbelasteter Prozesse. Besonderes Augenmerk wird auf die Codeoptimierung in Apache/Nginx und MySQL gelegt. Wir sprechen über Caching als Hilfstool und betrachten auch mögliche externe Bedrohungen wie DDOS-Angriffe und deren Abwehr.
Warum Serverlast auftritt
Bevor Sie mit der Serveroptimierung beginnen, ist eine gründliche Analyse der aktuellen Ressourcenauslastung erforderlich. Dazu gehört die Messung der CPU-Auslastung, der RAM-Nutzung, der Netzwerkaktivität und anderer wichtiger Parameter. Das Verständnis der Dynamik und der Spitzenlasten ermöglicht es, Engpässe zu identifizieren und die Ressourcenzuweisung zu optimieren. Dies erhöht die Stabilität und Leistung der Serverinfrastruktur.
Zur ersten Fehlerbehebung bei hoher Serverauslastung empfehlen wir die Durchführung einer allgemeine Serverdiagnose. Wenn dies nicht ausreicht, eine detailliertere Analyse der Ressourcen ist notwendig. Als Hilfsmittel dient die Erforschung der Protokolle des Linux Server kann hilfreich sein, da hier in den meisten Fällen die Ursache des Problems zu finden ist.
Optimierung des Apache/Nginx-Servers
Erhöhte Serverlast durch Indizierung
Eine erhöhte Serverlast durch die Indexierung kann beispielsweise auftreten, wenn Suchmaschinen eine große Anzahl von Seiten Ihrer Website scannen. Dies kann zu einer erhöhten Servernutzung und damit zu einer Verlangsamung der Website-Leistung führen. Die Ursache lässt sich relativ einfach ermitteln: Öffnen Sie die Datei unter:
/var/www/httpd-logs/sitename.access.log
Bei der Indexierung durch Suchmaschinen werden dem Benutzer Einträge folgender Art angezeigt:
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)"
Als erste Lösung zur Reduzierung der Belastung können Sie die Einstellung von Meta-Tags verwenden "kein Index" mit einem "nofollow" auf Seiten, die nicht indexiert werden müssen. Die zweite Lösung ist die .htaccess Datei, in der Einträge zu bestimmten Suchmaschinen hinzugefügt werden müssen, um sie beispielsweise vor Yandex und Google zu verbergen:
SetEnvIfNoCase User-Agent "^Yandex" search_bot
SetEnvIfNoCase User-Agent "^Googlebot" search_bot
Order Allow,Deny
Allow from all
Deny from env=search_bot
Ähnliche Anpassungen sind für andere Suchmaschinen erforderlich. Die Funktionen von .htaccess beschränken sich nicht nur auf die Blockierung der Indexierung. Wir empfehlen, sich mit den Hauptfunktionen im Abschnitt Artikel.
Verwenden der Caching-Einstellungen
Auch falsche Caching-Einstellungen auf dem Server können zu hoher Auslastung führen. Um diesen Parameter zu optimieren, müssen entsprechende Änderungen in den Konfigurationsdateien vorgenommen werden oder .htaccess. Im Fall von Apache ist die letztere Option vorzuziehen, bei Nginx die erstere.
Auf einem Apache Server müssen Sie den .htacess Datei und fügen Sie den folgenden Code ein:
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf|doc|docx)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>
Aktivieren Sie dann die Läuft ab Modul mit dem Befehl:
sudo a2enmod expires
Starten Sie anschließend den Webserver neu:
sudo service apache2 restart
Und aktivieren Sie das Modul durch Angabe von:
ExpiresActive On
Für ein Nginx Server reicht es aus, der Konfigurationsdatei folgenden Code hinzuzufügen:
location ~* .(jpg|jpeg|gif|png|ico|css|swf|flv|doc|docx)$ {
root /var/www/yoursite.com;
}
Und führen Sie einen Service-Neustart durch:
sudo service nginx restart
Beachten Sie, dass mit diesen Einstellungen die Erlauben mit einem Ablehnen Richtlinien werden umgangen.
Verwenden der Datenkomprimierung
Aktivieren der Datenkomprimierung mit Gzip auf Apache- und Nginx-Webservern trägt dazu bei, die zwischen Server und Client übertragene Datenmenge zu reduzieren, was die Leistung verbessert und die Ladezeit von Webseiten verkürzt.
Aktivieren Gzip on Apachemüssen Sie die aktivieren mod_deflate Modul:
sudo a2enmod deflate
Starten Sie anschließend den Webserver neu:
sudo service apache2 restart
Und schließlich fügen Sie der Konfigurationsdatei bzw. .htaccess den folgenden Block hinzu:
<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>
Diese Konfiguration aktiviert die Komprimierung für bestimmte Dateitypen und deaktiviert sie für Bilder.
Im Fall von Nginxerfolgt die Konfiguration im http Block der Konfigurationsdatei. Der folgende Code muss hinzugefügt werden:
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;
Ähnlich ApacheHier werden die Komprimierungsparameter für bestimmte Dateitypen festgelegt. Nach Änderungen an einem der Webserver ist ein Neustart des Dienstes erforderlich:
sudo service apache2 restart
Or
sudo service nginx restart
DDOS-Angriff auf den Server
Eine hohe Serverauslastung kann durch einen DDoS-Angriff entstehen. Ein DDoS-Angriff lässt sich durch die Überwachung eines plötzlichen Anstiegs des Datenverkehrs, abnormaler Anfragen und Leistungseinbrüche des Servers erkennen. Auch die Überprüfung von Protokollen auf wiederholte Anfragen von einer IP-Adresse oder Port-Scans kann auf einen möglichen DDoS-Angriff hinweisen. Es gibt viele Schutzmaßnahmen, wir werden jedoch nur die Grundlagen erläutern.
Verwendung eines CDN (Content Delivery Network)Ein CDN kann als Vermittler zwischen Ihrem Webserver und den Nutzern fungieren, den Datenverkehr verteilen und Inhalte zwischenspeichern, um die Auswirkungen eines DDoS-Angriffs zu mildern. CDNs können außerdem über integrierte DDoS-Schutzmechanismen verfügen, darunter Lastverteilung und Datenverkehrsfilterung.
Konfigurieren von Firewalls und Intrusion Detection Systemen (IDS/IPS)Firewalls können so konfiguriert werden, dass sie den Datenverkehr anhand verschiedener Kriterien wie IP-Adressen und Ports filtern. IDS/IPS können anormales Verkehrsverhalten erkennen und verdächtige Verbindungen blockieren. Diese Tools können potenziell schädlichen Datenverkehr effektiv verfolgen und blockieren.
Konfigurieren von Apache- und Nginx-Webservern, um die Auswirkungen von DDoS-Angriffen zu mildern.
Als Lösung für Apache ermöglichen wir die mod_evasive Modul. Entfernen Sie dazu die Kommentarzeichen oder fügen Sie die folgende Zeile in das httpd.conf or apache2.conf Konfigurationsdatei:
LoadModule evasive20_module modules/mod_evasive.so
In derselben Datei müssen Sie einen Einstellungsblock hinzufügen:
<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>
Ebenso aktivieren wir die mod_ratelimit Modul:
LoadModule ratelimit_module modules/mod_ratelimit.so
Und fügen Sie die Konfiguration hinzu:
<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>
Die Konfiguration für Nginx ähnelt Apache. In dem nginx.conf Konfigurationsdatei müssen die folgenden Anweisungen verwendet werden:
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;
...
}
}
Nachdem Sie Änderungen an den einzelnen Diensten vorgenommen haben, müssen diese neu geladen werden:
sudo systemctl restart apache2
Oder:
sudo systemctl restart nginx
Diese Beispiele stellen nur eine Grundkonfiguration dar, die je nach spezifischen Anforderungen und Art der Angriffe weiter angepasst werden kann.
Optimieren von MySQL-Abfragen
Die Optimierung von MySQL-Datenbankabfragen auf einem Webserver kann auf verschiedene Weise erfolgen. Eine davon ist die korrekte Konfiguration der Konfigurationsdatei. Typischerweise heißt diese Datei mein.cnf or meine.ini und befindet sich in der / Etc / or /etc/mysql/ Verzeichnis. Sie müssen es öffnen und die folgenden Änderungen vornehmen:
[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
Lassen Sie uns auch zusätzliche Empfehlungen berücksichtigen, die die Interaktion mit der Serverdatenbank erleichtern können:
- Verwenden Sie die ERKLÄREN Befehl vor einer SQL-Abfrage, um deren Ausführung zu analysieren. Dadurch erhalten Sie einen Ausführungsplan für die Abfrage und können feststellen, welche Indizes verwendet, welche Tabellen gescannt usw. werden.
- Indizes beschleunigen die Datensuche, sodass richtig gestaltete Indizes die Abfrageleistung erheblich verbessern können. Achten Sie auf Spalten, die häufig verwendet werden in WO or JOIN Gesundheitsproblemen.
- Vermeide das Benutzen SELECT *. Geben Sie nur die Spalten an, die für Ihre Abfrage wirklich erforderlich sind, anstatt alle Spalten in einer Tabelle auszuwählen.
- Vermeiden Sie die Verwendung von Funktionen in WO Bedingungen. Mithilfe von Funktionen (wie NIEDER, UPPER, LINKS, RECHTS) in WO Bedingungen können Indizes unbrauchbar machen. Vermeiden Sie deren direkte Verwendung in Bedingungen.
- Nutzen Sie INNER JOIN wo möglich, da dies in der Regel effizienter ist. Stellen Sie außerdem sicher, dass die entsprechenden Spalten zum Verknüpfen über Indizes verfügen.
- Nutzen Sie LIMIT um die Anzahl der zurückgegebenen Zeilen zu beschränken, wenn Sie nur eine bestimmte Anzahl von Ergebnissen erhalten müssen.
- Erwägen Sie das Zwischenspeichern von Abfrageergebnissen, insbesondere wenn diese sich selten ändern, um die Serverlast zu verringern.
Der Mailserver verursacht eine hohe Belastung des Servers
In diesem Abschnitt erfahren Sie, wie Sie feststellen können, ob der Mailserver stark ausgelastet ist, und welche Schritte zur Optimierung seines Betriebs erforderlich sind. Dazu gehört die Überprüfung der Nachrichtenwarteschlange und die Konfiguration der Serverparameter. Beginnen Sie mit der Überprüfung der Nachrichtenwarteschlange. Die mailq Das Dienstprogramm kann dabei helfen. Um es zu aktivieren, geben Sie den entsprechenden Befehl im Terminal ein:
mailq
Dadurch wird eine Liste der Nachrichten in der Warteschlange angezeigt, sofern vorhanden. Jede Nachricht wird mit ihrer eindeutigen Kennung und Informationen zum Sendestatus angezeigt. Ein ähnliches Ergebnis erhalten Sie durch die Überprüfung der E-Mail-Client-Protokolle.
In den meisten Fällen entsteht eine hohe Auslastung, wenn der Server kompromittiert wird und Spam versendet wird. Wenn der Administrator jedoch nach der Überprüfung sicher ist, dass der Server nicht von außen angegriffen wurde und die Benutzer den Spam nicht vernachlässigen, ist es an der Zeit, den Mailserver zu optimieren. Hier sind die Schritte, die dabei helfen:
- Stellen Sie sicher, dass die DNS-Einträge Ihrer Domäne korrekt konfiguriert sind, einschließlich SPF, DKIM und DMarc Datensätze zur Verbesserung der E-Mail-Zustellung und zum Schutz vor Spam. Die korrekte Konfiguration der Parameter finden Sie im Artikel über Mailserver-Diagnose.
- Überprüfen Sie die Netzwerkeinstellungen, einschließlich der Firewall-Konfiguration und Routing-Regeln, um Blockierungen zu vermeiden und die E-Mail-Zustellung zu beschleunigen.
- Konfigurieren Sie die Parameter der Nachrichtenwarteschlange entsprechend der Serverauslastung. Dies kann das Festlegen der maximalen Warteschlangengröße und von Timeouts umfassen.
- Berücksichtigen Sie die Lösungen, die wir zuvor in diesem Artikel besprochen haben. Optimieren Sie regelmäßig die Mailserver-Datenbank, um die Leistung zu verbessern, und nutzen Sie Caching-Mechanismen, um die Datensuche und -verarbeitung zu beschleunigen, beispielsweise DNS-Abfragen.
- Wenn der Mailserver immer noch regelmäßig stark ausgelastet ist, sollten Sie Skalierungsoptionen in Betracht ziehen, beispielsweise die Verwendung eines Mailserver-Clusters oder von Cloud-Lösungen.
Fazit
Eine erhöhte Serverlast wirkt sich direkt auf die Ladegeschwindigkeit der Website aus und beeinträchtigt letztendlich das Benutzererlebnis und die Reputation in Suchmaschinen. Daher spielt die effektive Verwaltung dieser Last eine Schlüsselrolle, um die kontinuierliche Funktionalität der Ressource sicherzustellen und ihre Zugänglichkeit für Besucher zu verbessern.