Artículo del tipo «notas al margen».
TL:DR:
http2_max_field_size 8k; # ¡todos se salvarán!En uno de los proyectos, después de cambiar cierta lógica interna del backend, comencé a observar un extraño response_code en los registros, a saber — 0. En los registros, se ve algo así:
{
"timestamp": "2020-01-17T08:41:51+00:00",
"remote_addr": "zzz.zzz.zzz.zzz",
"request_time": 0,
"upstream_response_time": "",
"upstream_header_time": "",
"http_accept_language": "-language",
"response_status": 0,
"request": "",
"host": "example.com",
"upstream_addr": "",
"http_referrer": "",
"request_length": 5854,
"bytes_sent": 0,
"http_user_agent": ""
}
Leer la documentación y buscar en Google sobre este tema no resultó en nada — ya que se afirma que tal comportamiento ocurre cuando el cliente cerró la conexión sin enviar los encabezados. Y además, había diversas exóticas con el tamaño del búfer para wsgi_, que en nuestro caso no servían para nada.
En general, decidimos que el problema no era un problema, dado que con nuestros volúmenes no es crítico en absoluto.
Exactamente hasta el momento en que me plantearon el siguiente problema: en algunos casos, los enlaces se abren sin problemas por http, pero se niegan a funcionar completamente por https, arrojando algo maravilloso: Connection #0 to host example.com left intact
curl: (52) Respuesta vacía del servidor
En los registros, solo logré rastrear esta cosa por IP — no había petición, ni ningún otro dato, como se puede ver en el ejemplo anterior — nada. Solo el infame estado 0, pero yo sé que ¡no interrumpí la solicitud! Comencé a investigar qué podría salir mal. Y resultó ser muy simple:
listen 443 ssl http2 backlog=8192;
Así que, si se utiliza http2 para conexiones ssl, simplemente configurar los búferes de solicitud no es suficiente, hay que configurarlos también en ngx_http_v2_module, y específicamente:
Sintaxis: http2_max_field_size tamaño;
Valor predeterminado: http2_max_field_size 4k;
Contexto: http, server
Limita el tamaño máximo del encabezado de la solicitud, comprimido mediante HPACK. El límite se aplica igual tanto al nombre como al valor. Si se aplica la codificación de Huffman, el tamaño real de las cadenas desempaquetadas del nombre y el valor puede ser mayor. El límite predeterminado es adecuado para la mayoría de las solicitudes.
En resumen, eso es todo. ¿Y todo por qué? Porque la longitud del enlace era grande — más de esos 4k.
Al configurarlo, por ejemplo, a 8kb (o lo que asegure que será suficiente) — resolvemos el problema.
Eso es todo.
Fuente: habr.com
