Nach einem Jahr der Entwicklung wurde der neue stabile Zweig des leistungsstarken HTTP-Servers und Multi-Protokoll-Proxy-Servers nginx 1.30.0 veröffentlicht, der Änderungen enthalten hat, die im Hauptzweig 1.29.x gesammelt wurden. In Zukunft werden alle Änderungen im stabilen Zweig 1.30 darauf abzielen, schwerwiegende Fehler und Sicherheitsanfälligkeiten zu beheben. Bald wird der Hauptzweig nginx 1.31 gebildet, in dem die Entwicklung neuer Möglichkeiten fortgesetzt wird. Für normale Benutzer, die keine Kompatibilität mit Drittmodulen gewährleisten müssen, wird empfohlen, den Hauptzweig zu verwenden, auf dessen Basis alle drei Monate Versionen des kommerziellen Produkts Nginx Plus veröffentlicht werden. Der Code von nginx ist in C geschrieben und wird unter der BSD-Lizenz verbreitet.
Laut dem Februar-Bericht von Netcraft laufen etwa 321 Millionen Websites mit nginx (vor einem Jahr 245 Millionen, vor zwei Jahren - 243 Millionen, vor drei Jahren 289 Millionen). Nginx wird auf 16.08 % aller aktiven Websites verwendet (vor einem Jahr 17.89 %, vor zwei Jahren 18.15 %, vor drei Jahren 18.94 %), was dem zweiten Platz in dieser Kategorie entspricht (der Anteil von Apache beträgt 13.27 % (vor einem Jahr 16.03 %, vor zwei Jahren 20.09 %, vor drei Jahren 20.52 %), Cloudflare - 20.62 % (17.81 %, 14.12 %, 11.32 %), Google - 10.65 % (9.89 %, 10.41 %, 9.89 %).
Bei Betrachtung aller Websites behält nginx die Führungsposition und hat 22.65 % des Marktes (vor einem Jahr 20.48 %, vor zwei Jahren - 22.31 %, vor drei Jahren - 25.94 %), während der Anteil von Apache 12.19 % beträgt (16.03 %, 20.17 %, 20.58 %), Cloudflare - 15.27 % (12.87 %, 11.24 %, 10.17 %), OpenResty (Plattform auf Basis von nginx und LuaJIT) - 8.01 % (9.36 %, 7.93 %, 7.94 %).
Unter den eine Million meistbesuchten Websites der Welt belegt nginx den zweiten Platz mit einem Anteil von 19.85 % (vor einem Jahr 20.37 %, vor zwei Jahren 20.63 %, vor drei Jahren 21.37 %). An erster Stelle steht Cloudflare - 26.84 % (22.32 %, 22.59 %, 21.62 %). Der Anteil von Apache httpd beträgt 15.84 % (17.95 %, 20.09 %, 21.18 %). 
Laut W3Techs wird nginx auf 32.8 % der Websites unter einer Million meistbesuchten verwendet (im April letzten Jahres lag dieser Wert bei 33.8 %, im Jahr davor bei 34.3 %). Der Anteil von Apache ist im Jahresvergleich von 26.3 % auf 23.9 % gesunken, der Anteil von Microsoft IIS ist von 4 % auf 3.4 % gesunken, und der Anteil von Caddy von 0.3 % auf 0.2 %. Der Anteil von Node.js ist von 4.4 % auf 6.0 % gestiegen, und der Anteil von LiteSpeed von 14.6 % auf 15.2 %.
Die auffälligsten Verbesserungen, die im Prozess der Bildung des Hauptzweigs 1.29.x hinzugefügt wurden:
- Die Unterstützung für die TLS-Erweiterung ECH (Encrypted ClientHello) wurde hinzugefügt, die die Entwicklung der ESNI-Erweiterung (Encrypted Server Name Indication) fortsetzt und zur Verschlüsselung von Informationen über TLS-Sitzungseinstellungen wie den angeforderten Domainnamen verwendet wird. Der Hauptunterschied zwischen ECH und ESNI besteht darin, dass bei ECH anstelle der Verschlüsselung auf der Ebene einzelner Felder die gesamte TLS-Nachricht ClientHello verschlüsselt wird, was das Auslaufen von Informationen über Felder, die nicht von ESNI erfasst werden, z. B. das PSK-Feld (Pre-Shared Key), verhindert. Die Verwendung von ECH wird durch die Angabe der Direktive „ssl_ech_file“ in der ECHConfig-Konfigurationsdatei im PEM-Format aktiviert. Die Unterstützung ist bei der Verwendung von OpenSSL-Bauten mit ECH verfügbar.
- Die Unterstützung des Multipath TCP (MPTCP)-Protokolls wurde hinzugefügt, das die gleichzeitige Lieferung von Paketen über mehrere Routen und verschiedene Netzwerkschnittstellen ermöglicht. Um dies zu aktivieren, wurde der Parameter „multipath“ zur Direktive „listen“ hinzugefügt.
- Die Möglichkeit wurde hinzugefügt, Client-Sitzungen an dieselben Server in einer Gruppe zu binden. Es stehen drei Methoden zur Verfügung: „cookie“ — Übermittlung der Informationen über das gewählte Server über das angegebene Cookie; „route“ — der Proxy-Server weist dem Client bei der ersten Anfrage eine Route zu; „learn“ — nginx analysiert die Antworten vom Upstream-Server und merkt sich die vom Server begonnenen Sitzungen. Für die Konfiguration der Bindung wurde die Direktive „sticky“ im „upstream“-Block des „http“-Moduls hinzugefügt, und in die Direktive „server“ wurden die Parameter „route“ und „drain“ hinzugefügt.
- Die Direktive „early_hints“ wurde hinzugefügt und die Unterstützung für den HTTP-Code 103 in den Antworten von Proxy- und gRPC-Backends wurde implementiert. Code 103 ermöglicht es, den Client sofort nach der Anfrage über den Inhalt gewisser HTTP-Header zu informieren, ohne auf die Ausführung aller mit der Anfrage verbundenen Vorgänge des Servers zu warten, bis der Inhalt bereitgestellt werden kann. Auf ähnliche Weise können Hinweise zu den mit der bereitgestellten Seite verbundenen Elementen gegeben werden, die im Voraus geladen werden können (z. B. können Links zu den auf der Seite verwendeten CSS- und JavaScript-Dateien angegeben werden). Nachdem der Browser Informationen über solche Ressourcen erhalten hat, beginnt er mit deren Laden, ohne auf den Abschluss der Bereitstellung der Hauptseite zu warten, wodurch die Gesamtverarbeitungszeit der Anfrage verkürzt wird.
- Die Direktiven add_header_inherit und add_trailer_inherit wurden hinzugefügt, die es ermöglichen, die Regeln für die Vererbung der in den Direktiven add_header und add_trailer angegebenen Werte zu ändern. Der Parameter „off“ hebt die Vererbung der Werte auf, während der Parameter „merge“ das Hinzufügen von Werten von der vorherigen Ebene zu den Werten der aktuellen Ebene aktiviert.
- Die Direktive „ssl_certificate_compression“ wurde hinzugefügt, um die Kompression zu steuern. TLS-Zertifikate.
- Die Direktive max_headers wurde hinzugefügt, die die maximale Anzahl von HTTP-Headern in einer Anfrage begrenzt. Bei Überschreitung des Limits wird ein Fehler 400 (Bad Request) zurückgegeben. Diese Möglichkeit wurde aus FreeNginx übernommen.
- Die Variablen $request_port und $is_request_port wurden hinzugefügt. Die erste Variable enthält die Portnummer aus der URI oder dem Header „Host“, während die zweite „:“ enthält, wenn die Variable $request_port nicht leer ist.
- Die Variablen $ssl_sigalg und $ssl_client_sigalg wurden hinzugefügt, die den Namen des Signaturalgorithmus für die TLS-Verbindung enthalten.
- Der Direktive „geo“ wurde der Parameter „volatile“ hinzugefügt, der das Caching der Variablen deaktiviert. Es ist erlaubt, Masken in der Direktive „include“, die innerhalb des Blocks „geo“ angegeben ist, zu verwenden.
- Im Block „upstream“ ist standardmäßig die Direktive „keepalive“ aktiviert. In die Direktive „keepalive“, die im Block „upstream“ verwendet wird, wurde der Parameter „local“ hinzugefügt. Wenn dieser Parameter angegeben wird, wird anstelle der gemeinsamen Nutzung einer Verbindung zu dem gemeinsamen upstream-Server, der in verschiedenen Blocks location und server erwähnt wird, für jeden Block eine separate Verbindung zum upstream unterstützt.
- Im Proxy-Modus ist standardmäßig die HTTP-Protokollversion HTTP/1.1 mit aktivierter Keep-Alive-Funktion eingestellt (im Modul ngx_http_proxy_module ist die Unterstützung für Keep-Alive standardmäßig aktiviert und der Wert „1.1“ ist in der Direktive „proxy_http_version“ eingestellt, und das Senden des Headers „Connection“ wird standardmäßig eingestellt).
- Im Modul ngx_http_proxy wurde die Unterstützung für das HTTP/2-Protokoll hinzugefügt, wodurch HTTP/2 beim Zugriff auf Backends verwendet werden kann.
- Es besteht die Möglichkeit, kryptografische Schlüssel aus Hardware-Token zu laden, wobei die OpenSSL-Bibliothek als Anbieter verwendet wird.
- In die Implementierung des QUIC-Protokolls wurde die Unterstützung für den 0-RTT-Modus aufgenommen, der auf Systemen mit OpenSSL 3.5.1 und neueren Versionen verfügbar ist.
- Die Möglichkeit zur Erstellung mit der von Amazon entwickelten kryptografischen Bibliothek AWS-LC wurde hinzugefügt.
- Die Kompression von TLSv1.3-Zertifikaten ist standardmäßig deaktiviert.
- Die Kompatibilität mit der OpenSSL 4.0-Bibliothek wurde sichergestellt.
Zusätzlich sei auf die Veröffentlichung der Version FreeNginx 1.30.0 hingewiesen, die ein Fork von Nginx entwickelt. Die Entwicklung des Fork wird von Maxim Dunin, einem der Schlüsselentwickler von Nginx, geleitet. FreeNginx positioniert sich als gemeinnütziges Projekt, das die Entwicklung des Nginx-Codebasisses ohne corporate interfering sicherstellt. Der Code von FreeNginx wird weiterhin unter der BSD-Lizenz angeboten. Zu den Änderungen im Branch FreeNginx 1.30 gehören: Unterstützung für die TLS-Erweiterung ECH (Encrypted Client Hello); verbesserte Verarbeitung der Direktive limit_rate; hinzugefügte Direktiven send_min_rate und client_body_min_rate; Implementierung einer Möglichkeit zur Begrenzung der Anzahl der Verbindungen und der Intensität der Anfragen im Mail-Proxy; Unterstützung für die GeoIP2-Datenbank im GeoIP-Modul; verbesserte Sicherheit des XSLT-Moduls.
Quelle: opennet.ru
