Después de un año de desarrollo, se ha publicado una nueva rama estable del servidor HTTP de alto rendimiento y proxy multiprotocolo nginx 1.30.0, que incorpora cambios acumulados en la rama principal 1.29.x. En adelante, todos los cambios en la rama estable 1.30 se centrarán en la corrección de errores graves y vulnerabilidades. Pronto se formará la rama principal nginx 1.31, donde se continuará el desarrollo de nuevas funcionalidades. Se recomienda a los usuarios regulares, que no necesitan asegurar la compatibilidad con módulos de terceros, que utilicen la rama principal, basada en la que se lanzan productos comerciales Nginx Plus cada tres meses. El código de nginx está escrito en C y se distribuye bajo la licencia BSD.
Según el informe de febrero de la empresa Netcraft, nginx está a cargo de aproximadamente 321 millones de sitios (245 millones hace un año, 243 millones hace dos años, 289 millones hace tres años). Nginx se utiliza en el 16.08% de todos los sitios activos (17.89% hace un año, 18.15% hace dos años, 18.94% hace tres años), lo que lo posiciona en segundo lugar en popularidad en esta categoría (la cuota de Apache es del 13.27% (16.03% hace un año, 20.09% hace dos años, 20.52% hace tres años), Cloudflare – 20.62% (17.81%, 14.12%, 11.32%), Google – 10.65% (9.89%, 10.41%, 9.89%).
Al considerar todos los sitios, nginx mantiene el liderazgo con una participación del 22.65% del mercado (20.48% hace un año, 22.31% hace dos años, 25.94% hace tres años), mientras que la participación de Apache es del 12.19% (16.03%, 20.17%, 20.58%), Cloudflare – 15.27% (12.87%, 11.24%, 10.17%), OpenResty (una plataforma basada en nginx y LuaJIT) – 8.01% (9.36%, 7.93%, 7.94%).
Entre el millón de sitios más visitados en el mundo, nginx ocupa el segundo lugar con una participación del 19.85% (20.37% hace un año, 20.63% hace dos años, 21.37% hace tres años). Cloudflare ocupa el primer lugar con el 26.84% (22.32%, 22.59%, 21.62%). La cuota de Apache httpd es del 15.84% (17.95%, 20.09%, 21.18%). 
Según los datos de W3Techs, nginx se utiliza en el 32.8% de los sitios del millón más visitados (en abril del año pasado era del 33.8%, hace dos años era del 34.3%). La cuota de Apache ha disminuido de 26.3% a 23.9% en un año, la cuota de Microsoft IIS ha bajado de 4% a 3.4%, y la cuota de Caddy ha disminuido de 0.3% a 0.2%. La participación de Node.js ha aumentado de 4.4% a 6.0%, y la de LiteSpeed ha subido de 14.6% a 15.2%.
Las mejoras más destacadas añadidas en el proceso de formación de la rama principal 1.29.x:
- Se ha añadido soporte para la extensión TLS ECH (Encrypted ClientHello), que continúa el desarrollo de la extensión ESNI (Encrypted Server Name Indication) y se utiliza para cifrar la información sobre los parámetros de las sesiones TLS, como el nombre de dominio solicitado. La diferencia clave entre ECH y ESNI es que en ECH, en lugar de cifrar a nivel de campos individuales, se cifra todo el mensaje TLS ClientHello, lo que ayuda a bloquear filtraciones a través de campos que no cubre ESNI, como el campo PSK (Pre-Shared Key). La utilización de ECH se activa mediante la especificación en la directiva "ssl_ech_file" del archivo de configuración ECHConfig en formato PEM. El soporte está disponible al utilizar versiones de OpenSSL con ECH.
- Se ha añadido soporte para el protocolo Multipath TCP (MPTCP), que permite la entrega de paquetes a través de múltiples rutas de forma simultánea mediante diferentes interfaces de red. Para activarlo, se ha añadido el parámetro "multipath" en la directiva "listen".
- Se ha añadido la posibilidad de vincular sesiones de clientes a los mismos servidores dentro de un grupo. Disponibles tres métodos: "cookie" - transmisión de datos sobre la selección a través de la Cookie especificada; "route" - el servidor proxy asigna una ruta al cliente al recibir la primera solicitud; "learn" - nginx analiza las respuestas del servidor upstream y recuerda las sesiones iniciadas por el servidor. Para configurar la vinculación, se ha añadido la directiva "sticky" en el bloque "upstream" del módulo "http", y se han añadido los parámetros "route" y "drain" en la directiva "server". servidor Se ha añadido la directiva "early_hints" y se ha implementado el soporte para el código HTTP 103 en las respuestas de los backends proxy y gRPC. El código 103 permite informar al cliente sobre el contenido de ciertos encabezados HTTP inmediatamente después de la solicitud, sin esperar a que el servidor complete todas las operaciones relacionadas con la solicitud y comience a entregar el contenido. De esta manera, se pueden proporcionar sugerencias sobre elementos relacionados con la página que se puede cargar previamente (por ejemplo, se pueden presentar enlaces a los CSS y JavaScript utilizados en la página). Al recibir información sobre estos recursos, el navegador comenzará a cargarlos sin esperar a que se complete la entrega de la página principal, lo que ayuda a reducir el tiempo total de procesamiento de la solicitud.
- Se ha añadido la directiva "early_hints" y se ha implementado el soporte para el código HTTP 103 en las respuestas de los proxies y gRPC. El código 103 permite informar al cliente sobre el contenido de ciertos encabezados HTTP inmediatamente después de la solicitud, sin esperar a que el servidor ejecute todas las operaciones relacionadas con la solicitud y comience a entregar el contenido. De esta manera, se pueden proporcionar consejos sobre elementos relacionados con la página que se pueden cargar previamente (por ejemplo, pueden incluirse enlaces a los CSS y JavaScript utilizados en la página). Al recibir información sobre estos recursos, el navegador comenzará a cargarlos sin esperar a que finalice la entrega de la página principal, lo que permite reducir el tiempo total de procesamiento de la solicitud.
- Se han añadido las directivas add_header_inherit y add_trailer_inherit, que permiten modificar las reglas de herencia de los valores especificados en las directivas add_header y add_trailer. El parámetro «off» desactiva la herencia de valores, y el parámetro «merge» activa la adición de valores desde el nivel anterior a los valores en el nivel actual.
- Se ha añadido la directiva «ssl_certificate_compression» para gestionar la compresión. de certificados TLS.
- Se ha añadido la directiva max_headers, que limita el número máximo de encabezados HTTP en una solicitud. Si se supera el límite, se devuelve un error 400 (Bad Request). Esta funcionalidad ha sido trasladada de FreeNginx.
- Se han añadido las variables $request_port y $is_request_port. La primera variable contiene el número de puerto del componente URI o del encabezado «Host», y la segunda contiene «:», si la variable $request_port no está vacía.
- Se han añadido las variables $ssl_sigalg y $ssl_client_sigalg, que contienen el nombre del algoritmo de firma digital para la conexión TLS.
- Se ha añadido el parámetro «volatile» a la directiva «geo», que desactiva la caché de la variable. Se permite usar máscaras en la directiva «include», especificada dentro del bloque «geo».
- La directiva «keepalive» está habilitada por defecto en el bloque «upstream». Se ha añadido el parámetro «local» a la directiva «keepalive», que se utiliza en el bloque «upstream». Cuando se especifica este parámetro, en lugar de compartir una sola conexión con el servidor upstream común mencionado en diferentes bloques de location y server, se mantiene una conexión separada para cada bloque hacia el upstream.
- Cuando se utiliza en modo proxy, por defecto se establece la versión del protocolo HTTP/1.1 con el modo keep-alive habilitado (en el módulo ngx_http_proxy_module, el soporte para keep-alive está habilitado por defecto y se establece el valor «1.1» en la directiva «proxy_http_version», y se interrumpe el envío del encabezado «Connection» por defecto).
- Se ha añadido soporte para el protocolo HTTP/2 en el módulo ngx_http_proxy, lo que permite utilizar HTTP/2 al comunicarse con los backend.
- Se ha proporcionado la posibilidad de cargar claves criptográficas desde tokens de hardware, usando la biblioteca OpenSSL como proveedor.
- Se ha añadido soporte para el modo 0-RTT en la implementación del protocolo QUIC, disponible en sistemas con OpenSSL 3.5.1 y versiones más recientes.
- Se ha añadido la posibilidad de compilar con la biblioteca criptográfica AWS-LC, desarrollada por Amazon.
- Por defecto, la compresión de certificados TLSv1.3 está desactivada.
- Se ha garantizado la compatibilidad con la biblioteca OpenSSL 4.0.
Adicionalmente, se puede mencionar la publicación del lanzamiento del proyecto FreeNginx 1.30.0, que desarrolla un fork de Nginx. El desarrollo del fork está a cargo de Maksim Dunin, uno de los desarrolladores clave de Nginx. FreeNginx se posiciona como un proyecto no lucrativo que asegura el desarrollo de la base de código de Nginx sin intervención corporativa. El código de FreeNginx continúa distribuyéndose bajo la licencia BSD. Entre los cambios en la rama FreeNginx 1.30: se ha añadido soporte para la extensión TLS ECH (Encrypted Client Hello); se ha mejorado el manejo de la directiva limit_rate; se han añadido las directivas send_min_rate y client_body_min_rate; se ha implementado la posibilidad de limitar el número de conexiones y la intensidad de las solicitudes en el proxy de correo; se ha añadido soporte para la base de datos GeoIP2 en el módulo GeoIP; se ha reforzado la protección del módulo XSLT.
Fuente: opennet.ru
