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

什么是 SSE?

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

nginx配置支持sse

nginx直接新增如下配置:

            # 设置 Nginx 不对 SSE 响应进行缓冲,直接透传给客户端
            proxy_buffering off;

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

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请求

文章目录