HTTP / 2 и gzip не включаются в Chrome - PullRequest
0 голосов
/ 12 октября 2018

В настоящее время мы используем 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 Canary dev tool showing http/1.1 requests

Chrome также сообщает мне (через net-events), что другие сайты (в основном ssl labs иGoogle google) используют потоки http / 2.

// EDIT

Добавление снимка заголовка из одного из файлов JS, показывающего, что браузер запрашивает gzip через Accept-Encoding:

Chrome dev tools showing a gzip enabled request

// Edit 2

Мы обнаружили проблему с двумя хостами, не получающими h2.У них установлен eset с включенным по умолчанию протоколом SSL.Отключение, которое включает h2 для этих компьютеров.Проблема gzip на http 1.1 все еще существует.

...