Einführung in Apache und Nginx
Webserver und Protokolle sind so konzipiert, dass sie es Benutzern ermöglichen, Webseiten anzuzeigen. Sie senden eine Anfrage zur Anzeige eines Dokuments, die vom Server akzeptiert wird. Der Host stellt dann im Wesentlichen das Dokument oder die Informationen für den Betrachter bereit. Der Webserver spielt eine zentrale Rolle dabei, dass Sie Webseiten in Ihrem Browser anzeigen und aufrufen können.

Webserver zur Erleichterung der Kommunikation zwischen Client- und Anwendungsservern
Es gibt viele Webserver, die Sie für diesen Zweck verwenden können. Zu den beliebtesten gehören Nginx und Apache. Tatsächlich hosten diese Server die meisten der derzeit im Internet verfügbaren Websites.
Apache und Nginx sind sich in vielerlei Hinsicht sehr ähnlich. Zunächst einmal sind beide Webserver Open-Source. Das bedeutet, dass jeder auf der Welt sie absolut kostenlos nutzen kann. Es gibt jedoch viele Funktionen, die für jeden der Server einzigartig sind. Diese besonderen Eigenschaften machen sie für verschiedene Anwendungen und Zwecke bestens geeignet.
Um Ihnen dabei zu helfen, zu entscheiden, welcher Webserver für Sie überlegen oder ideal ist, werden wir Nginx und Apache vergleichen. Der Vergleich wird anhand einer Reihe wesentlicher Parameter durchgeführt, die für Benutzer der Webserver entscheidend sind. Lassen Sie uns beginnen!
Grundlegender Überblick
Wir beginnen mit einem allgemeinen Überblick über die beiden Webserver. Sowohl Apache als auch Nginx haben sich in der Community einen hervorragenden Ruf erarbeitet. Sie werden für ihre Leistung gelobt und von mehreren namhaften Organisationen auf der ganzen Welt eingesetzt.
Apache
Apache kam 1995 heraus. Robert McCool entwickelte diesen HTTP-Server unter der Apache Software Foundation, daher der Name. Seit seiner Veröffentlichung nutzen Hunderttausende von Menschen auf der ganzen Welt Apache.
Seine schiere Beliebtheit führt dazu, dass viele Softwareprogramme und Quellen von Drittanbietern häufig damit zusammenarbeiten. Wenn Sie also nach einem guten Support-Netzwerk mit vielen Integrationen suchen, ist Apache genau das Richtige für Sie. Apache wird von vielen Menschen auch deshalb bevorzugt, weil es dynamischer und flexibler ist. Es bietet zudem ein breiteres Spektrum an Sprachen, die es interpretieren kann.
Nginx
Nginx ist ein relativ neuerer Webserver, der 2004 auf den Markt kam. Er ist das Ergebnis der Bemühungen von Igor Syosev, ein Problem zu lösen, das heute als C10K-Problem bekannt ist. Dieses Problem trat auf, als es für Server schwierig wurde, große Mengen an Datenverkehr zu bewältigen. Als immer mehr Menschen das Internet nutzten, wurden die Website-Server überlastet. Die Unfähigkeit dieser Server, mehrere tausend Verbindungen gleichzeitig zu verarbeiten, führte dazu, dass die Websites abstürzten und ausfielen.
Nginx wurde veröffentlicht, um dieses Problem zu lösen. Aus diesem Grund ist seine Architektur unglaublich leichtgewichtig konzipiert und kann mit begrenzten Ressourcen und Hardware arbeiten. Obwohl es am besten für die Arbeit mit statischen Inhalten geeignet ist, kann es auch in Software integriert werden, die dynamische Inhalte angemessen verarbeiten kann.
Fähigkeiten zur Verarbeitung von Datenverkehr
Da wir nun eine grundlegende Vorstellung von den einzelnen Servern haben, können wir näher ins Detail gehen. Das erste Merkmal, mit dem wir beginnen, sind die Fähigkeiten zur Verarbeitung des Datenverkehrs der einzelnen Server. Dies ist einer der Hauptpunkte, der diese beiden Plattformen voneinander unterscheidet. Ihre Architekturen arbeiten nach unterschiedlichen Prinzipien, wenn es darum geht, mehrere Verbindungen gleichzeitig zu verarbeiten.
Apache
Apache verwendet etwas namens MPM – Multi-Processing-Module. Administratoren verwenden eine Vielzahl von MPMs, um die Architektur zur Verbindungsverarbeitung zu manipulieren und zu modifizieren. Ein Teil der Attraität des Apache-Webservers ist die Flexibilität, die seine Architektur bietet. Eine solche modulbasierte Infrastruktur, die die Verarbeitung in einzelne Threads und Thread-Gruppen aufteilt, erleichtert die Skalierung und Anpassung an verschiedene Arten von Verbindungen.
Werfen wir einen Blick auf einige der einzelnen Module, die in Apache verwendet werden:
- mpm_prefork
Das erste ist mpm_prefork. Dies ist ein Verarbeitungsmodul, das für die Bearbeitung der eingehenden Anfragen von Besuchern zuständig ist. Es erstellt einen Thread oder ein Child, um zu jedem beliebigen Zeitpunkt eine Verbindung zu verarbeiten. Das bedeutet, dass mpm_prefork in seiner Funktion ziemlich effizient ist, wenn die Anzahl der Anfragen geringer ist als die Anzahl der Prozesse.
Anfragen werden schnell verarbeitet, da ein separates Child jede einzelne individuell verarbeitet. Dies bedeutet aber auch, dass es die Dinge erheblich verlangsamen kann, wenn die Anzahl der Anfragen die Anzahl der Prozesse übersteigt. Als Folge davon verbraucht der Schritt der Anfrageverarbeitung viel RAM.
- mpm_worker
Wie wir bereits wissen, ist ein Thread für eine Verbindung verantwortlich. Dieses Modul geht einen Schritt weiter und ermöglicht es Ihnen, mehrere Threads gleichzeitig zu verwalten. Dies ist ein weitaus skalierbareres Modul im Vergleich zu mpm_prefork, das ab einem bestimmten Schwellenwert an seine Grenzen stößt. Neue Verbindungen können sich sofort mit einem Thread verbinden, anstatt warten zu müssen.
- mpm_event
Mpm_event ist für die Aufrechterhaltung der Keep-Alive-Verbindungen verantwortlich. Der Hauptzweck dieses Moduls besteht darin, zu verhindern, dass das System durch Keep-Alive-Anfragen überlastet wird. Dies geschieht, indem es einer Verbindung einen Thread zuweist, selbst wenn keine aktive Anfrage vorliegt. Der Thread bleibt so lange dediziert, wie die Verbindung aktiv ist. Eingehende Anfragen werden an unbelegte Threads übergeben.
Nginx
Im Gegensatz zu Apache wurde Nginx für einen sehr spezifischen Zweck entwickelt. Wir kannten bereits die Probleme, die bei Verbindungen und Skalierbarkeit auf dieser Ebene auftraten. Aus diesem Grund verwendet es einen Algorithmus, der asynchron und nicht-blockierend ist. Es weist nicht für jede Verbindung einzelne Threads zu. Stattdessen erzeugt Nginx zahlreiche Worker-Prozesse, die in der Lage sind, Tausende von Verbindungen gleichzeitig zu verarbeiten.
Das Funktionsprinzip hinter der Architektur von Nginx ist der Fast-Looping-Mechanismus. Dieser Algorithmus verarbeitet und überwacht kontinuierlich Ereignisse. Das bedeutet, dass die Prozesse ereignisgesteuert sind und jeder Worker-Prozess nur für seine eigenen Verbindungen zuständig ist. Alle Verbindungen eines Worker-Prozesses befinden sich in einem Event-Loop. Hier koexistieren sie und werden asynchron zu den anderen Verbindungen dieses bestimmten Workers verarbeitet.
Der Hauptvorteil einer solchen Architektur besteht darin, dass sie eine hohe Skalierbarkeit ermöglicht. Dies ist insbesondere dann von Bedeutung, wenn Sie über begrenzte Ressourcen verfügen oder mit minimaler Hardware arbeiten möchten. Selbst bei hohem Datenverkehr sind die Auswirkungen auf die RAM-Nutzung gering. Das liegt daran, dass Sie nicht für jede Verbindung eigene Threads erzeugen.
Umgang mit statischen und dynamischen Inhalten
Ein weiterer Parameter, den wir zum Vergleich der beiden Webserver heranziehen können, ist die Art und Weise, wie sie statische und dynamische Inhalte.
Apache
Apache verwendet eine dateibasierte Methode zur Verarbeitung statischer Inhalte. Sein MPM-Verarbeitungssystem ermöglicht es ihm, mit dieser konventionellen Methode zu arbeiten.
Wenn es um die Verarbeitung dynamischer Inhalte geht, kann Apache dies ohne die Hilfe externer Komponenten tun. Sie können die dynamischen Prozessoren durch Laden eines Moduls aktivieren. Dieses Modul verarbeitet den Inhalt, indem es die Sprache analysiert und dann den entsprechenden Prozessor in den Worker einbettet.
Der Hauptvorteil, keine externen Komponenten zur Verarbeitung dynamischer Inhalte verwenden zu müssen, zeigt sich bei der Konfiguration und Koordination. Es ist viel einfacher, nur interne Komponenten miteinander abzustimmen.
Nginx
Der größte Unterschied in der Art und Weise, wie Apache und Nginx Inhalte verarbeiten, besteht darin, dass Nginx schlichtweg nicht in der Lage ist, dynamische Inhalte intern zu verarbeiten. Es muss mit einer externen Komponente gekoppelt werden, um Anfragen nach dynamischen Inhalten zu verarbeiten. Das bedeutet, dass Sie Ihren Nginx-Server in Verbindung mit einem externen Prozessor verwenden müssen. Die Komponente empfängt die Anfrage nach PHP/dynamischen Inhalten, verarbeitet sie und sendet sie dann an den Server zurück.
Da die Informationen zwischen den beiden Komponenten weitergeleitet werden müssen, müssen Sie die Kommunikation zwischen ihnen koordinieren. Sie müssen festlegen, wie viele Verbindungen Sie zulassen möchten, und das Protokoll konfigurieren. Sie müssen ein Protokoll verwenden, das von Nginx gelesen und verstanden werden kann, wie unter anderem HTTP, FastCGI, SCGI, uWSGI oder memcache.
Andererseits kommt Nginx sehr gut mit der Verarbeitung von statischen Inhalten zurecht. Es benötigt dafür Hilfe von externen Quellen. Es wird den Interpreter auch nur dann aktivieren, wenn es ihn benötigt. Dies ist einer der Vorteile der Verwendung von Nginx. Der Interpreter ist nicht in den Prozess eingebettet. Das bedeutet, dass er nur für die Verarbeitung von dynamischen Inhalten vorhanden ist.
Inhaltsverzeichnisse: Dezentrale vs. zentrale Konfiguration
Jeder Webserver hat sein eigenes Inhaltsverzeichnis. Einer der kritischsten Parameter zur Beurteilung von Apache und Nginx ist, ob sie eine Konfiguration auf Verzeichnisebene zulassen oder nicht.
Apache
Es gibt bestimmte versteckte Dateien in Inhaltsverzeichnissen, die Direktiven enthalten. Dies sind die .htaccess-Dateien. Bei Apache können Sie diese Direktiven auf Verzeichnisbasis interpretieren. Wenn Sie also eine Anfrage senden, prüft Apache den Pfad zur Datei, um eine .htaccess-Datei zu finden. Wenn dies der Fall ist, interpretiert und wendet es die darin enthaltenen Direktiven sofort an. Apache startet den Server nicht neu, um diese Direktiven zu implementieren.
Der oben definierte Prozess ermöglicht eine dezentrale Konfiguration der Verzeichnisse im Webserver. Eine dezentrale Konfiguration ist nützlich für URL-Rewrites, die Implementierung von Zugriffsbeschränkungen, die Bestätigung von Autorisierungen und das Festlegen von Caching-Richtlinien.
Einer der Vorteile der .htaccess-Datei besteht darin, dass der Benutzer, der über keine Authentifizierung verfügt, zumindest einige Aspekte des Inhalts, den er in seinem Browser anzeigt, steuern und ändern kann. Aus diesem Grund wird Apache häufig von Shared-Hosting-Anbietern verwendet. Die Dienstanbieter haben autorisierten Zugriff auf die zentrale Konfiguration. Die Kunden können die Kontrolle über bestimmte Verzeichnisse ausüben, ohne Zugriff auf die Hauptkonfiguration zu haben.
Wenn Sie möchten, können Sie die .htaccess-Interpretation in Apache deaktivieren.
Nginx
Im Gegensatz zu Apache arbeitet Nginx nicht mit .htaccess-Dateien. Dies macht es vergleichsweise weniger flexibel. Nginx bringt jedoch stattdessen eine Reihe von Verbesserungen in seinem Konfigurationsstil mit sich. Zunächst einmal ist es in der Lage, Anfragen viel schneller zu verarbeiten als Apache. Das liegt daran, dass es nicht nach jeder .htaccess-Datei sucht, sie liest, interpretiert und dann implementiert, die es auf seinem Pfad findet. Anstatt jedes übergeordnete Verzeichnis zu durchsuchen, führt Nginx nur eine Verzeichnissuche für eine Anfrage durch.
Zudem hat Nginx einen großen Sicherheitsvorteil gegenüber Apache. Im Gegensatz zu Apache übergibt Nginx keinen Teil der Konfiguration der Inhaltsverzeichnisse an einzelne Benutzer. Während Sie vielleicht strenge Sicherheitsmaßnahmen einhalten, wer sagt, dass die einzelnen Benutzer dazu auch in der Lage sind? Mit Nginx behalten Sie die Kontrolle über den Sicherheitsstatus und die Konfiguration des gesamten Verzeichnisnetzwerks.
Anfrage-Interpretation
Eine weitere Möglichkeit, zwischen den beiden Servern zu unterscheiden, ist die Art und Weise, wie sie Anfragen interpretieren.
Apache
Wenn der Server eine Anfrage empfängt, interpretiert er sie und verbindet sie dann mit den relevanten Systemressourcen. Er interpretiert die Anfrage entweder als physische Ressource im Dateisystem oder als eine URI Location.
Bei der Interpretation als physische Ressource verwendet er die <Directory>- oder <Files> Blöcke. Dies ist die Standard-Interpretationsmethode für den Server. Er nimmt das Stammverzeichnis des Dokuments. Dann folgt er dem Host und der Portnummer in der Anfrage, um die entsprechende Datei im Dokumentenbaum zu finden.
Die URI-Location hingegen erfordert eine abstrakte Auswertung. Daher verwendet Apache die <Location>-Blöcke für abstrakte Ressourcen, anstatt mit dem Dateisystem zu arbeiten.
Es gibt neben URIs eine Reihe weiterer Alternativen zur Verwendung des standardmäßigen dateibasierten Systems. Beispielsweise können Sie die Alias-Direktive verwenden, um einen alternativen Speicherort für die Zuordnung zu finden. Sie können auch Ausdrucksvarianten nutzen, um die Dateisystemkonfiguration flexibler zu gestalten.
Nginx
Während Apache als Webserver konzipiert wurde, übernimmt Nginx eine Doppelrolle sowohl als Web- als auch als Proxy-Server. Aus diesem Grund arbeitet Nginx lieber mit URIs, anstatt sich am Dateisystem zu orientieren. Diese Vorliebe lässt sich daran erkennen, dass es in Nginx keine Möglichkeit gibt, eine Konfiguration für ein Dateisystemverzeichnis anzugeben. Es kann jedoch bei Bedarf in das Dateisystem übersetzt werden.
Server und Location sind die Konfigurationsblöcke, die in Nginx hauptsächlich verwendet werden. Ersterer interpretiert den angeforderten Host. Letzterer gleicht die URI-Teile nach dem Host und dem Port ab. Infolgedessen interpretiert der Server die Anfrage als URI-Speicherort und nicht als tatsächliche Datei auf dem System.
Aufgrund seines URI-basierten Interpretationssystems ist Nginx in der Lage, seine Rolle als Webserver, Proxy-Server und Mail-Server zu erfüllen. Da es sich bei der Interpretation der Anfrage nicht auf das Dateisystem bezieht, ist es verständlich, warum es auch keine .htaccess-Dateien implementiert.
Modulsysteme
Obwohl sowohl Apache als auch Nginx Modulsysteme zur Erweiterung unterstützen, gibt es wesentliche Unterschiede in ihrer internen Funktionsweise.
Apache
Mit Apache können Sie Module während des Serverbetriebs dynamisch laden und entladen. Der Kern bleibt im Zentrum der Prozesse, und die Module dienen zur Erweiterung der Funktionalität. Sie können diese ankoppelbaren Module verwenden, um eine Vielzahl von Aufgaben zu erledigen. Mit der umfangreichen Bibliothek von Apache sind die Möglichkeiten praktisch unbegrenzt.
Tatsächlich können Sie sogar die Funktion des Serverkerns ändern, indem Sie Module wie mod_php verwenden. Wie bereits erwähnt, ermöglicht Ihnen dieses Modul, einen PHP-Interpreter in die einzelnen Worker-Prozesse einzubetten. Dies ist nützlich, wenn Sie dynamische Inhalte verarbeiten müssen.
Aber das ist noch nicht alles. Sie können auch Module hinzufügen, um Funktionen wie Client-Authentifizierung, Server-Härtung, Caching, URL-Rewriting, Proxies, Ratenbegrenzung, Komprimierung sowie Verschlüsselung zu aktivieren.
Nginx
Das Modulsystem von Nginx unterscheidet sich insofern, als dass Sie die Module nicht dynamisch in den Hauptserver laden können. Stattdessen müssen sie gesammelt und auf der Kernsoftware kompiliert werden. Dies lässt in Bezug auf Flexibilität und Benutzerfreundlichkeit zu wünschen übrig. Während die Distributionspakete einige gängige Module enthalten, müssen Sie den Server für andere Module selbst erstellen. Daher müssen Sie wissen, wie Sie Ihre kompilierte Software außerhalb des traditionellen Paketsystems verwalten.
Unabhängig davon liegt der Vorteil dieses nicht standardmäßigen Modulsystems darin, dass es Ihnen ein hohes Maß an Spezifität bietet. Sie können Ihre Module anpassen, indem Sie nur die Funktionen integrieren, die Sie benötigen. Dadurch können Sie nicht benötigte Komponenten weglassen und sich gleichzeitig vor Sicherheitsrisiken schützen. Gleichzeitig können Sie mit Nginx-Modulen dieselben Aufgaben wie mit Apache erledigen. Dazu gehören URL-Rewriting, Protokollierung, Authentifizierung und so weiter.
Ökosystem und Support
Integrationen und Software-Support sind bei Webservern sehr wichtig. Als Nächstes werden wir die Kompatibilität und den Support untersuchen, die für Apache und Nginx verfügbar sind.
Apache
Apache ist eine ältere und populärere Plattform. Daher ist es verständlich, dass sie im Vergleich zu Nginx über eine größere Auswahl an unterstützenden Tools und Software verfügt. Es steht Ihnen eine Fülle von Dokumentationen von Drittanbietern zur Verfügung, um den Kernserver zu unterstützen. Darüber hinaus können Sie ihn auch mit anderer Software kombinieren, um bestimmte Aufgaben zu erfüllen. Sie können diese Tools entweder Ihrem Projekt oder Ihrem Paket hinzufügen. Sie lassen sich problemlos innerhalb des Apache-Ökosystems bootstrappen.
Nginx
Obwohl Nginx in dieser Hinsicht hinter Apache zurückbleibt, tut es sicherlich sein Bestes, um aufzuholen. Immer mehr Menschen entscheiden sich für Nginx, da sie dessen volles Potenzial erkennen. Die Unterstützung für die Plattform wächst parallel zu ihrem organischen Wachstum als nützlicher, schnell verarbeitender Webserver.
Eine der größten Hürden bei der Unterstützung, die Nginx überwinden musste, war das Finden von Dokumentationen in englischer Sprache. Dies liegt daran, dass ein Großteil von Nginx ursprünglich in russischer Sprache verfasst wurde, einschließlich der meisten Dokumentationen. Da sich der Server jedoch verbreitet hat und bekannter geworden ist, stehen mittlerweile zahlreiche Ressourcen von Drittanbietern in der universellen Sprache zur Verfügung.
Eine kollaborative Lösung?
Jetzt haben Sie ein viel besseres Verständnis für die wesentlichen Komponenten und die Funktionsweise von Apache und Nginx. Obwohl sie sich stark voneinander unterscheiden, nutzen einige Anwender diese Tatsache, um das Beste aus beiden Welten zu kombinieren. Das ist richtig – es ist möglich, Apache und Nginx zusammen zu verwenden.
Klassischerweise neigen Benutzer dazu, Nginx als Reverse-Proxy einzusetzen und ihn vor Apache zu platzieren. Dies ermöglicht es Ihnen, die mangelnde Geschwindigkeit von Apache bei der Bearbeitung und Verarbeitung von Anfragen auszugleichen. Nginx nimmt alle Anfragen entgegen und verarbeitet sie mit maximaler Geschwindigkeit. Zudem ermöglicht es Ihnen, eine große Anzahl von Anfragen gleichzeitig schnell zu bearbeiten, ohne viele Ressourcen investieren zu müssen.
Ein weiteres Feature von Nginx, das sich Nutzer zunutze machen, ist die Fähigkeit, statische Inhalte effizient zu verarbeiten. Um die Tatsache auszugleichen, dass Nginx eine externe Komponente zur Verarbeitung dynamischer Inhalte benötigt, können wir PHP- und andere relevante Anfragen über einen Proxy an Apache weiterleiten. Apache rendert die Anfrage in eine Webseite und sendet sie an Nginx zurück, damit dieser sie an den Client ausliefern kann.
Hier sind einige Ressourcen, die Sie auf unserem Blog finden können, um mit beiden Webservern zu beginnen:
Apache
- Installation des Apache-Servers auf Ubuntu 18.04: Eine Anleitung
- Einrichten von virtuellen Apache-Hosts auf Ubuntu 20.04
- So installieren Sie den Linux, Apache, MySQL, PHP (LAMP) Stack auf CentOS 7
- Absicherung von Apache mit Let’s Encrypt auf Ubuntu 18.04
Nginx
- Installation von Nginx auf Ubuntu 18.04
- Automatisierung der Verlängerung von LetsEncrypt-SSL-Zertifikaten für Nginx
- So sichern Sie Nginx mit Let’s Encrypt auf Ubuntu 20.04
- So installieren Sie den LEMP-Stack (Linux, Nginx, MySQL PHP) auf Ubuntu 20.04
Fazit
Letzten Endes haben sowohl Apache als auch Nginx ihre Stärken und Schwächen. Es gibt keine festen Regeln oder Empfehlungen dafür, welchen Server Sie für Ihr Projekt verwenden sollten. Sie selbst können am besten beurteilen, was für Ihre Anwendung auf der Grundlage Ihrer individuellen Anforderungen am besten geeignet ist.
Sie müssen herausfinden, bei welchen Aspekten und Funktionen Sie keine Kompromisse eingehen können, und entsprechend auswählen. Wenn die Entscheidung schwerfällt, können Sie jederzeit beide Server zusammen in einer maßgeschneiderten Lösung einsetzen.
Viel Spaß beim Computing!
Kommentare
Noch keine Kommentare. Schreiben Sie den ersten.