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.8%
Apache
28.7%
Cloudflare Server
22.7%
LiteSpeed
14.0%
Microsoft-IIS
4.4%
Apache - HTTPd
Den Apache HTTP Server gibt es bereits seit 1995, aktuell in der Version: 2.4.62 (gefunden: 18.07.2024).
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.27.3 (gefunden: 27.11.2024). 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.
{{percentage}} % positiv