Включить HTTP2 Server Push Nginx

#nginx #http2 #nghttp2

#nginx #http2 #nghttp2

Вопрос:

Я установил nginx с поддержкой HTTP2. Мой nginx находится за системой балансировки нагрузки приложений, и завершение работы SSL происходит только в LB.

Сначала я включил HTTP2_PUSH, как показано ниже:

 http2_push_preload on;
location /mx {
       http2_push https://example.com/css/style.css;
       http2_push https://example.com/js/main.js
}
  

Но это не сработало. На сетевой вкладке отладчика моего браузера отображался инициатор «index», и nghttp также ничего не показывал.

Другой подход, который я попробовал, это:

 http2_push_preload on;
    location /mx {
           add_header Link "<https://example.com/css/style.css>; rel=preload; as=style,<http2_push https://example.com/js/main.js>; rel=preload; as=script";
    }
  

Следующий подход изменил инициатор с index на other на вкладке сеть, но инструмент nghttp по-прежнему подтверждает, что принудительный запуск сервера не происходит.

Ответ №1:

Насколько я понимаю, AWS Application Load Balancer — это балансировщик нагрузки 7-го уровня (HTTP) и поддерживает HTTP / 2 только во внешнем интерфейсе, а не в серверной части Nginx.

Вы можете проверить это, добавив $server_protocol в свой Nginx log_format :

 log_format my_log_format '$remote_addr - $remote_user [$time_local] $server_protocol "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /usr/local/nginx/nginx-access.log my_log_format;
  

Я бы предположил, что трафик поступает как HTTP / 1.1.

Даже если AWS ALB теперь поддерживает HTTP / 2 для серверной части, это не означает, что он будет поддерживать отправку HTTP / 2. Это усложняется, когда задействовано несколько подобных элементов инфраструктуры (что, если ALB и Nginx поддерживают принудительный запуск, а клиент — нет), и лучший совет — выполнять принудительный запуск с пограничного узла, особенно если он поддерживает это с помощью инструкций заголовка предварительной загрузки HTTP.

Вероятно, вам лучше использовать балансировщик нагрузки 4-го уровня (TCP), чтобы заставить это работать.