Apache2 Limit auf Zugriffe ...

RootDS

Registered User
Hallo!

Ich habe einen 1&1 Root-Server mit einem Debian Etch. Ich betreibe den Server überwiegend als Webserver. Nun habe ich hin und wieder das Problem, dass (z.B. nach einem Fernsehbericht) die Zugriffe auf eine Website enorm ansteigen und der Server extrem langsam wird und die Webseiten nur sehr sehr langsam - wenn überhaupt - ausliefert. Als Webserver läuft ein Apache2 (apache-mpm-prefork 2.2.3). Nun würde ich gerne erreichen das nach einer Anzahl x-Besucher der Server keine weiteren Zugriffe annimmt bzw. auf eine Seite umleitet "Der Server ist zur Zeit überlastet, bitte versuchen Sie es später wieder.".

Gibt es eine Möglichkeit sowas im Apache einzustellen? Gibt es Erfahrungswerte ab wann ein Webserver träge wird bzw. ganz in die Knie geht?
 
Moin moin,

Habs jetzt mal aus Eigeninteresse nachgeschaut:
Code:
<IfModule prefork.c>
StartServers         1
MinSpareServers      1
MaxSpareServers      2
MaxClients           15
MaxRequestsPerChild  1000
</IfModule>

"MaxClients 15" & MaxRequestsPerChild 1000 Sind hier dein Anlaufpunkt ;)

Hoffe das war jetzt nicht am Thema vorbei.

MfG

ReVoLt
 
Danke für die schnelle Antwort. Hab dazu auch nochmal in der Apache2-Doku nachgeschlagen.
mpm_common - Apache HTTP Server
mpm_common - Apache HTTP Server

Gibt es Erfahrungswerte auf was man die Parameter MaxClients & MaxRequestsPerChild einstellen sollte, damit der Server nicht ganz in die Knie geht? Was passiert, wenn das Limit erreicht ist? Darüber konnte ich leider auch in der Doku nichts finden. Gibt es da eine Möglichkeit eigene "Fehlermeldungen" zu hinterlegen, so wie bei den 40x-Fehlermeldungen?
 
Wenn MaxServer erreicht ist werden die Request in einer Queue gehalten und an den nächsten freien Server gereicht.

huschi.
 
wieviele Anfragen Apache handhaben kann ist rein vom RAM anhängig!

Zuerst ermittelt man wieviel RAM für Apache u. MySQL zur Verfügung stehen. Linux, Plesk, qmail, bind, Dr. Web, Spamassassin ect. verbrauchen ja alle schonmal RAM.

Anhaltswert ist ~ 250 MB, d.h. hat man 1 GB RAM stehen Apache u. MySQL noch ~ 750 MB RAM zur Verfügung.

Nun ermittelt man wieviel RAM ein prefork httpd2 Prozess benötigt. Bei Seiten die MySQL nutzen sind das ~ 12 - 15 MB RAM. Jeder httpd2 Prozess (Task) kann eine Server - Client Verbindung handhaben (Besucher).

Für MySQL reservieren wir mal ~ 50 MB, bleiben für Apache und seinen httpd3 Prozessen 700 MB übrig.

700 MB : 15 MB = 46 httpd2 Prozesse (Tasks)

Nun schauen wir uns die httpd.conf von Apache an:
Code:
<IfModule prefork.c>
StartServers       5
MinSpareServers    5 [COLOR="Red"]httpd Prozesse[/COLOR]
MaxSpareServers    10
ServerLimit       46
MaxClients        41 [COLOR="Red"]httpd Prozesse[/COLOR]
MaxRequestsPerChild  8000
<IfModule>

Apache startet beim Start 5 Prozesse (StartServers) und forkt dann bis maximal 46 Prozesse (ServerLimit). Mindestens 5 Prozesse werden nicht beschäftigt und maximal 10. Für Requests stehen maximal 41 Prozesse (httpd2) zur Verfügung. Apache bedient hier 41 Besucher gleichzeitig!

Jeder Prozess wird eleminiert sobald er 8000 Aufgaben erledigt hat. Apache forkt dann neue Prozesse nach (= Selbstbereinigung).

Code:
Timeout 30
KeepAlive On
MaxKeepAliveRequests 150
KeepAliveTimeout 2

HostnameLookups off
Webseiten bestehen ja nicht nur aus einer html Datei sondern auch aus Bildern ect. Jede Datei, jedes Script verursacht einen Requests. KeepAlive On bedeutet, der httpd2 Prozess hält die Verbindung solange offen bis maximal 150 Requests bearbeitet wurden. 2 Sekunden nach dem letzen Requests wird die Verbindung beendet.

Beispiel:

Eine Webseite hat eine HTML Datei und 10 Bilder. Macht zusammen 11 Requets. Der Besucher bekommt die Seite sehr schnell angezeit. Klickt er innerhalb von 2 Sekunden nicht auf einen Link, beendet Apache die Verbindung und der httpd2 Prozess wird für den nächsten Besucher frei.

Anleitung zur Optimierung mit Beispielkonfiguration

MySQL

50 MB haben wir reserviert. Nun müssen wir die Buffers + Caches ect. so klein machen, daß bei max_clients = 41 die 50 MB RAM nicht überschritten werden. Zur Kontrolle verwenden wir das Tuning-Primer Script.
 
Last edited by a moderator:
Back
Top