Unterschied Apache vs Nginx - Nginx überholt Apache

Ich habe für den Betrieb meiner Webseiten lange Zeit Apache als Webserver verwendet und später in Docker immer wieder mal Nginx. Der alternative Webserver Nginx erfreut sich zunehmender Beliebtheit und löst in jüngster Vergangenheit Apache als Webserver in vielen Bereichen mehr und mehr ab. Ein Grund dafür ist dessen Performance: Der etwas jüngere, aber dennoch längst erwachsene Nginx punktet an dieser Stelle. Für Apache habe ich bei meinen Setups .htaccess-Dateien für das direkte Steuern von Ordnern verwendet: Nginx interpretiert diese aber nicht, entsprechend muss beim Umstieg eine alternative Konfiguration erstellt werden. Für gängige Anforderungen kein Problem, bei speziellen Setups, zum Beispiel anhand eines Cookies verschiedene Pfade zu verwenden, wurde es dann knifflig, dies konnte ich dann nur mit einem unschönen Workaround umsetzen.  

Webserver Marktanteil

Zuerst mal ein Überblick über die Verbreitung der einzelnen Webserver. Glaubt man w3techs.com, hat Nginx Apache im Mai 2021 mit einem hauchdünnen Vorsprung übertroffen:

Webserver Marktanteil in %
Nginx 33.9%
Apache 33.5%
Cloudflare Server 18.5%
LiteSpeed 8.8%
Microsoft-IIS 6.9%
LiteSpeed 1,032
Cloudflare Server 877
Nginx 418
Quelle: w3techs.com; Liste zuletzt aktualisiert: 18.05.2021

Apache - HTTPd

Den Apache HTTP Server gibt es bereits seit 1995, aktuell in der Version: 2.4.46 (gefunden: 08.08.2020)

Durch die .htaccess-Datei können bestimmte Eigenschaften des Webservers auf Ordnerebene konfiguriert werden. Als Beispiel benötigt ein Betreiber einer Webseite rein einen Ordnerzugriff per FTP. Dank der .htaccess Datei können alle relevanten Servereinstellungen, wie Ordnerumleitungen, PHP-Settings etc. über die Datei im Webverzeichniss gesteuert werden: Ideal für ein Webhosting mehrerer unterschiedlicher Seiten und Betreiber auf einem Server. Aus diesem Grund ist Apache bei Shared Hostern immer noch sehr beliebt.

Vorteile

  • Dank der .htaccess-Dateien kann der Zugriff auf bestimmte Ordner gesteuert werden. Die Konfiguration kann dabei direkt in dem jeweiligen Ordner hinterlegt werden.
  • Module im laufenden Betrieb laden
  • flexible Konfiguration und im Vergleich zu nginx mehr Möglichkeiten: speziell für Shared Hoster.

Nginx

Der deutlich jüngere Nginx wurde erstmals im Jahre 2004 veröffentlicht und befindet sich aktuell in der Version  1.19.10 (gefunden: 14.04.2021) . Nginx kann nicht nur als Webserver, sondern auch als Reverse oder Email-Proxy eingesetzt werden. Unter anderem beschleunigt das Ignorieren der .htaccess-Datei den Zugriff: Apache muss bei jedem Aufruf die .htaccess-Dateien aller möglichen Ordner suchen und falls vorhanden, lesen und interpretieren; Nginx hingegen verwendet eine zentrale Konfiguration, die sich nach dem Starten im RAM befindet. 

Vorteile

  • Geschwindigkeit, speziell bei statischen Files und hohen Zugriffszahlen ist Nginx meist schneller als Apache

Konfig-Beispiele im Vergleich: Apache vs Nginx

Wie bereits erwähnt kann die Konfiguration von Apache über die .htaccess-Datei erfolgen. Nginx hingegen verwendet eine Konfig-Datei außerhalb des Web-Ordners: nginx.conf.

Header Cache Control

Sowohl Apache, als auch Nginx können bestimmten Dateitypen einen Cache Header hinzuzufügen.

Apache

<FilesMatch "\.(ico|pdf|jpg|png|gif|jpeg|js|css)$">
 Header set Cache-Control "max-age=172800, public, must-revalidate"
</FilesMatch>

Nginx

http {
    ...
    server {
     ...
        location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico)$ {
            expires 7d;
            add_header Cache-Control "public, no-transform";
        }

GZIP Compression

Um Bandbreite zu sparen, kann die Seite komprimiert ausgeliefert werden.

Apache

<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
</IfModule> 

Nginx

http {
    ...
    gzip  on;
    gzip_vary on;
    gzip_min_length 10240;
    gzip_proxied any;
    gzip_comp_level 1;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

Redirect to www.

Nicht www. Seiten können wie folgt auf eine www. Seite umgeleitet werden:

Apache

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

Nginx

server {
    listen       80;
    server_name  domain.tld;
    return       301 $scheme://www.domain.tld$request_uri;
}

server {
    listen       80;
    server_name  www.domain.tld;
    ...
}

Basic Authentication 

Nginx

    server {
...
        auth_basic           "please enter a Username and Password";
        auth_basic_user_file /var/www/.htpasswd;

Cookies - Cache

Apache

In Apache können Cookies einfach über eine RewriteCondition abgerufen werden:

RewriteCond %{HTTP_COOKIE} cookiename=cookievalue; [NC] 

Als Beispiel prüfen folgende Regeln, ob ein Cookie gesetzt ist und ein Cache-File existiert und verwendet dieses für den Aufruf:

            RewriteCond %{HTTP_COOKIE} cache=no; [NC] 
            RewriteCond %{DOCUMENT_ROOT}/page-cache/pc__index__pc.html -f
            RewriteRule .? page-cache/pc__index__pc.html [L]

Nginx - Cookies und if

Um Pfade abhängig von einem Cookie zu steuern, bin ich bei Nginx etwas an die Grenzen gestoßen. In Nginx können Cookies zwar in einer IF-Abfrage verwendet werden, die IF-Abfrage verhält sich aber nicht so wie ich mir das erwartet hätte, daher konnte ich die Abfrage nur über den Umwege einer Variable und Named Location anwenden:

http {
        #set variables for Cache...
        set $shouldusecache4root @usecache4root;

        #if Cookie
        if ($http_cookie ~* "cache=no(?:;|$)") {
            set $shouldusecache4root @nocache4root;
        }

        #hack locations...
        location = / {
            try_files /dev/null $shouldusecache4root;
        }

        #use named location from hacked location...
        location @nocache4root {
            try_files $uri /index.php?$is_args$args;
        }
        
...

siehe auch: serverfault.com/questions/908086/nginx-directly-send-from-location-to-another-named-location/965779#965779 und www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

Wer an dieser Stelle eine besser Lösung weiß, bitte gerne in den Kommentaren ...

Fazit

Beide Webserver, sowohl Nginx, als auch Apache sind mit einer OpenSource-Lizenz versehen, bieten zahlreiche Features und in etwa die gleiche Sicherheit. In der Praxis spielt es für die meisten Anforderungen keine Rolle welcher der beiden Webserver verwendet wird. Apache hat seine Stärken beim Einsatz in einer Shared-Hosting-Umgebung, Nginx beim Bereitstellen von statischen Inhalten für hochfrequentierte Seiten. Um die Performance einer Seite zu messen, siehe auch Webseite Stresstest - Performance messen Anfragen/Sekunde.

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!



Fragen / Kommentare


Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Außerdem geben wir Informationen zu Ihrer Nutzung unserer Website an unsere Partner für soziale Medien, Werbung und Analysen weiter. Details anzeigen.