[ Seminar Linux und Apache ] ... [ Inhaltsübersicht ] ... [ Funktionsweise ]
Bis zu Version 1.3 ist die dem Webserver zu Grunde liegende Architektur weitgehend gleich geblieben.
Laufzeitverhalten:
Bis zur Apache Version 1.2.x unterstützte der Webserver nur die verschiedenen
Unix-Betriebssysteme. Unter Unix ist es im Gegensatz zu Windows möglich
Prozesse zu kopieren.
(man 2 fork
:
fork creates a child process that differs from the parent process only in its
PID and PPID, and in the fact that resource utilizations are set to 0. File
locks and pending signals are not inherited.)
Apache arbeitete als sogenannter Preforking-Server: der gestartete Prozess legt zu Beginn eine in der Konfigurationsdatei angegebene Anzahl von Kopien seiner selbst an, die auf eingehende Anragen warten. Falls mehr http-Anfragen eingehen als die vorhandene Prozessanzahl beantworten kann, werden rechtzeitig weitere Kopien des Ursprungsprozesses angelegt.
Apache wurde in der Version 1.3 auf die Windows-Plattform portiert.
Unter Windows ist das Kopieren laufender Prozesse jedoch nicht möglich.
Man kann lediglich komplett neue Prozesse erzeugen, was aber bedeuten würde,
jedes mal die gesamte Startphase von Apache inklusive der Verarbeitung der Konfigurationsdirektiven
zu durlaufen.
Da dies zu ineffizient wäre, wurde für dieses Betriebssystem ein anderes
Laufzeitverhalten implementiert.
Unter Windows gibt es zwei Apache-Prozesse. Einer ist für die Beantwortung
der HTTP-Anfragen zuständig. Der andere überwacht diesen Prozess,
um ihn neu zu starten, falls er abstürzen sollte. Innerhalb des Arbeitsprozesses,
der die Anfragen beantwortet, laufen mehrere Threads. Je nach Beanspruchung
des Servers werden Threads angelegt oder wieder aus dem Speicher entfernt. So
wie die Prozesse bei der Unix-Version Prozesse geforkt und gekillt werden.
Um diese beiden Laufzeitverhalten (Threads/Prozesse) zu realisieren mussten
im Apache-Quelltext die Teile, die für das Erzeugen der Kind-Prozesse verantwortlich
waren, umgeschrieben werden.
Im Code wurde durch "#ifdef
"-Anweisungen zwischen den
beiden Versionen unterschieden.
Dadurch wurde der Code schwierig zu pflegen und es würde noch unübersichtlicher,
wenn man weitere Laufzeitverhalten implementieren wollte..
Ziel war es Apache leichter portierbar zu machen.
Dieses Ziel wird dadurch erreicht, dass sämtlicher plattformspezifischer
Code sauber getrennt vom restlichen Apache-Code in den Sourcen des APR
und der MPMs zu finden ist. Durch diese Kapselung ist es
für die Apache-Entwickler leichter geworden, plattformspezifische Änderungen
und Optimierungen vorzunehmen.
Für die Version 1.0 des APR ist das primäre Ziel, alle Funktionen,
die zur Realisierung von Apache 2.0 benötigt werden, zur Verfügung
zu stellen. Es ist allerdings geplant, danach das APR auch unabhängig von
Apache als Basis für plattformunabhängiges Programmieren weiterzuentwickeln
und interessierten Programmierern zur Verfügung zu stellen.
Threads sind unter den UNIXen weniger recourcen-intensiv als Prozesse. Das
bedeutet, im Vergleich zu 1.3, wo nur Prozesse benutzt wurden, dass die Skalierbarkeit
bei Verwendung von Threads zunimmt.
Andererseit ist die Sicherheit bei mehreren Prozessen größer, da
bei fehlerhaften Modulen, die einen Prozeß zum abstürzen bringen,
nur wenige Verbindungen verloren gehen.
MinSpareServers
und MaxSpareServers
legen fest, wie viele Kindprozesse mindestens und maximal auf Vorrat bereitgehalten
werden sollen. Sinkt die Anzahl der freien Prozesse unter die Anzahl MinSpareServers
,
werden neue erzeugt, steigt sie über die Anzahl MaxSpareServers
werden Prozesse aus dem Speicher entfernt. Vorteil bei dynamisch generierten Seiten.
MinSpareThreads
und MaxSpareThreads
geben an, wie viele Threads unbeschäftigt sein dürfen, bevor neue Prozesse
erstellt oder aus dem Speicher entfernt werden. Dieses MPM arbeitet also sowohl
mit mehreren Prozessen als auch mit Threads - das gab es bei Apache 1.3 nicht.NumServers
, die der
darin zu Beginn enthaltenen Threads StartThreads
. Wie sich die Anzahl
der Threads bei unterschiedlicher Last anpassen soll, legen wieder MinSpareThreads
und MaxSpareThreads
fest.ChildPerUserID
, die besagt, wie viele
Prozesse unter einer bestimmten Benutzerkennung laufen sollen. Mit der Anweisung
AssignUserID
innerhalb des <VirtualHost>-Kontextes wird den
entsprechenden Prozessen die Benutzerkennung zugewiesen.Es exitieren MPMs für Windows, OS2 und BeOS.
Unter Windows wird das gleich Laufzeitverhalten wie bei 1.3 implementiert.
[ Seminar Linux und Apache ] ... [ Inhaltsübersicht ] ... [ Funktionsweise ]