В настоящее время мы используем GKE с балансировщиком нагрузки TCP уровня 4 в кластере nginx.Конфигурация виртуального хоста в nginx выглядит следующим образом:
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2 default_server;
server_name dev.pewpew.host;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets on;
ssl_session_ticket_key /etc/ssl/certs/random.key;
ssl_certificate /etc/ssl/certs/pewpew.fullchain.pem;
ssl_certificate_key /etc/ssl/certs/pewpew.private.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_protocols TLSv1 TLSv1.2 TLSv1.3;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_buffer_size 1400;
ssl_prefer_server_ciphers on;
ssl_ecdh_curve secp384r1;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4;
# HSTS
add_header Strict-Transport-Security max-age=15768000;
# 1 month caching
expires 1M;
add_header Cache-Control public;
location / {
root /app;
index index.html index.htm;
}
}
Использование этого nginx.conf:
user nginx;
worker_processes 1;
error_log /dev/stdout debug;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
# We only serve static content, the backend is all REST
sendfile on;
sendfile_max_chunk 1m;
# Send headers in one packet after the first chunk of data has been read
tcp_nopush on;
# Enable no delay to directly send TCP traffic without queing for small packets
tcp_nodelay on;
# Use a sane keepalive timeout to reuse the connection if needed
keepalive_timeout 65;
# Use GZIP
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
gzip_min_length 500;
gzip_buffers 4 32k;
gzip_types text/plain text/css application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml image/svg;
gzip_vary on;
include /etc/nginx/conf.d/*.conf;
}
Тест SSL-лабораторий говорит нам, что мы нажали A + с этой конфигурацией и включилиh2 для браузеров, поддерживающих его: https://www.ssllabs.com/ssltest/analyze.html?d=dev.pewpew.host
Другие тесты также показывают, что сервер готов к h2 и gzip: https://tools.keycdn.com/http2-test сообщает нам, что сервер активирован http / 2, https://checkgzipcompression.com/?url=https%3A%2F%2Fdev.pewpew.hostговорит нам, что gzip работает.
Теперь к проблеме: у нас 3 разных компьютера, на которых установлена одна и та же версия Chrome, только один получает h2 с gzip.Остальные получают только http / 1.1 без какого-либо сжатия.
Chrome также сообщает мне (через net-events), что другие сайты (в основном ssl labs иGoogle google) используют потоки http / 2.
// EDIT
Добавление снимка заголовка из одного из файлов JS, показывающего, что браузер запрашивает gzip через Accept-Encoding:
// Edit 2
Мы обнаружили проблему с двумя хостами, не получающими h2.У них установлен eset с включенным по умолчанию протоколом SSL.Отключение, которое включает h2 для этих компьютеров.Проблема gzip на http 1.1 все еще существует.