Как я изначально предполагал, вы сталкиваетесь с этим случаем:
https://mailman.nginx.org/pipermail/nginx-devel/2021-May/014066.html
В последнем присланном логе все указанные файлы были успешно загружены
в рамках одного quic-соединения, после чего прошел 30-секундный keepalive_timeout,
и angie закрыл соединение close фреймом с соответствующим кодом ошибки.
conns/746.754.log:2024/04/05 23:02:38 [debug] 17028#17028: *754 http3 request line: "GET /emoji/269b.svg HTTP/3.0"
...
conns/746.754.log:2024/04/05 23:02:38 [debug] 17028#17028: *754 http3 output header: ":status: 200"
...
Потом всё это отсылается клиенту, он подвтерждает все quic фреймы:
2024/04/05 23:02:39 [debug] 17028#17028: *746 quic frame tx app:1731 PING
2024/04/05 23:02:39 [debug] 17028#17028: *746 quic frame rx app:235 ACK n:2 delay:2 1731 1729-1727 1725-1604
И в конце закрытие:
2024/04/05 23:03:08 [debug] 17028#17028: *746 quic close handler
2024/04/05 23:03:08 [debug] 17028#17028: *746 quic close initiated rc:0 c:00006C7AA8DB2820
2024/04/05 23:03:08 [debug] 17028#17028: *746 quic close immediate term:0 drain:0 app error:256 "keepalive timeout"
2024/04/05 23:03:08 [debug] 17028#17028: *746 quic sendto app packet max:1446 min:0
2024/04/05 23:03:08 [debug] 17028#17028: *746 quic frame tx app:1734 CONNECTION_CLOSE_APP err:256 keepalive timeout
Случайность появления ошибки в том, что в quic значение keepalive timeout используется в качестве idle timeout, и словить срабатывание именно keepalive timeout с посылкой соответствующего фрейма довольно сложно.
При повторном подключении к известному серверу, chrome умеет слать запросы в режиме early data, поэтому это влияет на тайминг, равно как и использование другой ssl-библиотеки.
В nginx код в данном месте аналогичный, и это дело случая, что там это случается в вашем случае реже.
(патч, который я выше предлагал - валиден, он чинит случай, когда соединение в случае early data может иногд закрываться раньше, чем нужно из-за того, что не снимается один таймер).
Когда-то давно, значение keepalive_requests было маленькое по-умолчанию, и вам приходилось его поднимать. Потом оно было увеличено до 100, и эта настройка более не влияет.
Сейчас вы натыкатесь на keepalive_timeout. Попробуйте подобрать какое-нибудь значение, с которым будет лучше, чем сейчас. Но вообще это проблема хрома.