解决SSE流被Nginx缓存的问题

问题

如果你的服务使用了nginx网关,可能会出现nginx缓冲sse流的问题,导致的现象是,客户端调用sse接口时,流数据并不是一条条出现的,而是一口气出现的,原因就是nginx网关对流数据进行了缓存。

单个Nginx的情况

如果你的客户端和服务器之间只存在一层nginx网关,可以通过在接口添加X-Accel-Buffering=no的响应header,来告诉nginx不要对响应数据进行缓存。

多个Nginx的情况

但很多时候我们所在的服务环境可能不止一个nginx网关。拿我们的服务为例子,因为某些历史遗留原因,客户端到服务端实际上存在两个nginx网关,一个是公司层面的网关,一个是用于k8s反向代理的网关,这个时候单纯设置X-Accel-Buffering=no就无效了。

原因是响应数据首先到达第一个nginx,此时这个nginx会消耗掉这个header,然后将数据透传到下一个nginx,此时第二个nginx由于默认会缓存数据,所以sse流就再一次被缓存了。

解决办法是在第一个nginx的配置里面,继续加上这个header,表示这个路径下的请求需要带上这个header,这样第二个nginx才能继续收到这个header并且不缓存数据。

  location /path {
      ...
      add_header X-Accel-Buffering "no";
      ...
  }

客户端与服务器之间有n个nginx,就要至少在n-1个nginx里面配置好这个header。

你可能感兴趣的:(nginx,缓存,java,网络,运维,http)