Nginx配置支持SSE流式返回

最近通过springboot对接one-api实现类似于chatgpt的打字机效果,后端采用sse的方式,自己本地使用postman直接调用后端服务完全正常,但是部署到服务器上通过nginx就是一口气直接返回,最后查了下发现是需要在nginx上配置一下才支持流式返回,特此记录一下备忘。

什么是 SSE?

SSE 是一种让服务器能主动给浏览器发送数据的技术。通常,我们的网站都是浏览器去服务器请求数据,但有时候我们希望服务器能主动告诉浏览器一些新的信息,比如实时更新的股票价格、聊天消息等,这时候就用到了 SSE。

nginx配置支持sse

nginx直接新增如下配置:

代码语言:javascript
复制
            # 设置 Nginx 不对 SSE 响应进行缓冲,直接透传给客户端
            proxy_buffering off;

当然你还要配置连接超时等配置可以参考下面这份配置:

代码语言:javascript
复制
http {
    ...
server {
    ...

    location /sse {
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # SSE 连接时的超时时间
        proxy_read_timeout 86400s;
        
        # 取消缓冲
        proxy_buffering off;

        # 关闭代理缓存
        proxy_cache off;
        
        # 禁用分块传输编码
        #chunked_transfer_encoding off
        
        # 反向代理到 SSE 应用的地址和端口
        proxy_pass http://backend-server;
    }

    ...
}

...

}

参考链接

nginx 转发Tcp、WebSocket、SSE配置
大模型流式输出 sse实现时,如何配置nginx
使用Nginx配置反向代理处理SSE请求