Назад | Перейти на главную страницу

Неожиданная смесь ответов http2 и 1.1

Я настраиваю nginx как обратный прокси (перед некоторыми серверами http / 1.1). Первоначально я настроил исходный сервер на экземпляре nginx. Как и ожидалось, он возвращал контент исключительно через HTTP / 2. Однако, когда я настроил nginx для предоставления прокси-службы, он вернул смесь ответов HTTP2 и HTTP / 1.1.

 server {
    listen 443 ssl http2;
    server_name www.example.com;

    ssl_certificate /etc/nginx/ssl/example.com/cert.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com/cert.key;
    include snippets/ssldefaults.conf;

    location / {
         proxy_http_version      1.1;
         proxy_set_header        Host $host;
         proxy_set_header        X-Real-IP $remote_addr;
         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

         proxy_ssl_verify off;
         proxy_pass  https://192.168.23.12/
    }
 }

(Я использую Chrome 76.0.3809.132 и nginx 1.14, чтобы проверить это)

Различные протоколы, поступающие от nginx, поступают с одного и того же исходного сервера. Мой тестовый пример (например) включает несколько кешируемых файлов CSS - некоторые поступают через HTTP2, некоторые через 1.1.

Что могло вызвать разницу?

Невозможно обслуживать HTTP / 2 и HTTP / 1.1 через одно и то же соединение.

Поэтому я бы предложил здесь одно из следующих действий:

  1. Вы запрашиваете ресурсы в разных доменах, и не все они проходят через ваш сервер nginx.
  2. Вы смотрите на запросы третьих лиц (например, Google Analytics), а не на запросы вашего сайта.
  3. Вы просматриваете кэшированные ресурсы, и изначально они были загружены через HTTP / 1.1.
  4. Вы используете ServiceWorker и Chrome неправильно сообщает протокол для них.
  5. Вы обнаружили ошибку в Chrome!

Я предлагаю вам добавить $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;