Суть проблемы на самом деле хром. Эта вещь дает сбой только в Chromium из того, что я вижу.
Проблема с Nginx заключается в реализации http2_push_preload
.
Что ищет Nginx, так это заголовок с Link: </resource>; as=type; rel=preload
. Он читает его и передает файлы через pu sh, к сожалению, когда браузер (на самом деле я проверял только Chrome) получает документ с заголовком Link
, а также с конфликтом Pu sh, что приводит к значительному замедлению и загружает ресурсы, которые были замечены при анализе документа.
# This results in HTTP/2 Server Push and the requests get duplicated due to the `Link` headers that were passed along
location / {
proxy_pass http://localhost:3000;
http2_push_preload on;
}
# This results in Resource Hints getting triggered in the browser.
location / {
proxy_pass http://localhost:3000;
}
# This results in a regular HTTP/2 (no push)
location / {
proxy_pass http://localhost:3000;
http2_push_preload on;
proxy_hide_header link;
}
# This result in a valid HTTP/2 Server Push (proper)
location / {
proxy_pass http://localhost:3000;
http2_push /commons.4e96503c89eea0476d3e.module.js;
http2_push /index.module.js;
http2_push /_app.module.js;
http2_push /webpack-0b10894b69bf5a718e01.module.js;
http2_push /main-3c17cb16bbbc3efc4bb5.module.js;
}
Кажется, Nginx пока не работает с этой функцией ...
Если бы я только мог удалить Link
заголовки и использование http2_push_preload
...
В любом случае, я заставил его работать с использованием H2O H2O, что позволило мне удалить заголовки при сохранении сервера HTTP / 2 Pu sh
// h2o.conf
[...]
proxy.reverse.url: "http://host.docker.internal:3000/"
header.unset: "Link"
Работает нормально с H2O: Надеюсь Nginx исправляет способ работы http2_push_preload
и обеспечивает больший контроль.
Вдоль стороны, я думаю, что Хром должен решить проблему в любом случае, вместо того, чтобы загружать в 2 раза больше байтов.