我将Node服务器与用于处理服务器已发送事件流的Express应用程序一起使用。这是通过启用了http2的NginX代理的。 SSE事件通过React应用程序中的EventSource消耗。我每10秒发送一次心跳消息,以保持连接状态。
这一切都非常有效,直到出现某种形式的网络中断为止,例如让我的笔记本电脑进入睡眠状态然后重新唤醒它。
然后从该点开始,流将每40秒钟左右出现一次net :: ERR_HTTP2_PROTOCOL_ERROR 200错误,然后重新连接,而不是仅与稳定流重新连接一次。
Firefox可以正常工作。它没有错误,仅重新连接一次。
如果我将Node配置为直接提供http2而不是通过NGinx作为测试(通过spdy库),那么一切都会按预期进行,所以我不认为这是Node问题,我的Nginx配置和铬。
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秒。
答案 0 :(得分:2)
http2_max_field_size
和 http2_max_header_size
指令自 1.19.7 版起已过时
相反,可以使用类似以下内容:
large_client_header_buffers 4 64k;
答案 1 :(得分:1)
不确定是否可以解决这个问题。通过增加大小,我最近遇到了相同的问题:
http2_max_field_size 64k;
http2_max_header_size 512k;
chrome的net::ERR_HTTP2_PROTOCOL_ERROR
消失了。
此外,不确定它是否适用于您。如果我使用Firefox,实际上可以正确访问我的网站。