Chrome net :: ERR_HTTP2_PROTOCOL_ERROR 200 после переподключения - PullRequest
1 голос
/ 01 апреля 2020

Я использую Node-сервер с приложением express, которое обрабатывает поток отправленных событий сервера. Это передается через NginX с включенным http2. События SSE потребляются через EventSource в приложении React. Каждые 10 секунд я отправляю сообщение о сердцебиении, чтобы поддерживать соединение.

Все это прекрасно работает до тех пор, пока не произойдет какая-либо форма прерывания работы сети, например, перевести ноутбук в режим сна, а затем снова его разбудить.

Затем с этого момента поток будет каждые 40 с или около того давать ошибку с ошибкой net :: ERR_HTTP2_PROTOCOL_ERROR 200, а затем переподключаться, а не просто переподключаться один раз с постоянным потоком.

Firefox работает правильно. Он не выдает ошибку и переподключается только один раз.

Если я настрою Node для непосредственного обслуживания http2 вместо теста через NGinx (через библиотеку spdy), то все будет работать так, как ожидается, поэтому я не думаю, что это проблема с узлом, и я должен что-то упустить в моей конфигурации Nginx и Chrome.

Nginx настроить следующим образом (местоположение / поток - прокси SSE)

server {
    listen 28443 ssl http2;
    listen [::]:28443 ssl http2;

    server_name example.com;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    http2_max_field_size 16k;
    http2_max_header_size 128k;

    root /var/www/example.com;
    index index.html index.htm;

    location / {
        client_max_body_size 100M;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://localhost:28080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'Upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    location /stream {
        proxy_http_version 1.1;
        # proxy_request_buffering off;
        # proxy_buffering off;
        # proxy_cache off;
        # chunked_transfer_encoding off;
        proxy_set_header    Connection          '';
        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_pass http://localhost:28080/stream;
    }
}

Я пробовал различные комбинации с отключенными proxy_buffers и т. Д. Настроек keepalive, которые, похоже, влияют только на время между ошибками, т.е. 5 минут вместо 40 секунд.

...