#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), чтобы заставить это работать.