Я использую 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 секунд.