node.js - Chrome net::ERR_HTTP2_PROTOCOL_ERROR 200 重新连接后

标签 node.js google-chrome nginx http2 eventsource

我正在使用带有处理服务器发送事件流的快速应用程序的 Node 服务器。这是通过启用 http2 的 NginX 代理的。 SSE 事件通过 React 应用程序中的 EventSource 使用。我每 10 秒发送一次心跳消息以保持连接有效。

这一切都很好,直到出现某种形式的网络中断,例如让我的笔记本电脑进入休眠状态然后重新唤醒它。

然后从那时起,流将每 40 秒左右出错一次,出现 net::ERR_HTTP2_PROTOCOL_ERROR 200 错误,然后重新连接,而不是仅使用稳定流重新连接一次。

Firefox 工作正常。它不会出错并且仅重新连接一次。

如果我将 Node 配置为直接为 http2 提供服务,而不是通过 NGinx 作为测试(通过 spdy 库),那么一切都按预期工作,所以我认为这不是 Node 问题,我的 Nginx 配置和 Chrome 肯定缺少某些内容。

Nginx配置如下(位置/stream为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 秒。

最佳答案

不确定你是否明白这一点。我最近遇到了同样的问题,通过增加大小:

http2_max_field_size 64k;
http2_max_header_size 512k;
Chrome 的 net::ERR_HTTP2_PROTOCOL_ERROR走了。
另外,不确定它是否适用于您。如果我使用 Firefox,我实际上可以正确访问我的网站。

关于node.js - Chrome net::ERR_HTTP2_PROTOCOL_ERROR 200 重新连接后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60974237/

相关文章:

jquery - 错误: jQuery . ..未被调用——Ajax从Node.js跨域服务器请求geoJSON

node.js - Azure:409 冲突:无法删除目录。要么不为空,要么不允许访问

javascript - Vorpal 命令上下文

python - windows chrome 通过命令行刷新选项卡 0(或当前选项卡)

javascript - "' x'的含义不是函数或其返回值不可迭代”错误

javascript - Demeteorizer编译meteor app并导致WebSocket连接错误?

ubuntu - 如何确定工作进程的数量

python - 为 Flask 应用程序提供服务是否需要 WSGI 服务器和 HTTP 服务器?

javascript - Firebase http 函数在 http 请求库返回数据之前完成

css - 如何跨浏览器垂直对齐文本