暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SSE与nginx的配置学习

济南小老虎 2025-04-07
194

背景

SSE 是什么? 
"Server-Sent Events"(SSE)
是一种允许服务器主动向客户端推送信息的技术。
它允许服务器在特定事件发生时,向客户端发送消息,
而不需要客户端轮询服务器以检查更新。
这种模式对于创建实时、动态的 Web 应用程序非常有用,
例如股票价格更新、新闻订阅、实时通知等场景。

与websocket 的区别: 
应用场景
SSE 更适合以下场景:
服务器向客户端推送信息,比如更新通知、新闻通知等数据的推送。
单向通信服务器通知消息:定时推送数据、监控信息等场景。

WebSocket 更适合以下场景:
实时交互:聊天室、多人游戏、RTC 等实时交互场景。
双向通信:实时推送、实时对战、数据实时同步、网页远程控制等双向通信场景。
大量高并发连接:在线直播、网页客服、社交平台等大量高并发连接场景。


SSE的优缺点

SSE 的优点
简单易用:
SSE 基于 HTTP 协议,可以在普通的 Web 服务器上部署,
无需安装额外的服务端软件,使用起来比 WebSocket 更加简单易用。
兼容性好:
SSE 协议基于 HTTP 协议,向下兼容性较好,
所有支持 HTTP 的浏览器都可以支持 SSE。

SSE 的缺点
单向通信:
SSE 只能由服务器向客户端发送消息,无法实现双向通信。
无法实现多工通信:
SSE 仅支持一个连接上进行通信,无法实现多工通信。


websocket的优缺点

WebSocket 的优点
实时性高:
WebSocket 采用全双工通信方式,
能够做到服务器和客户端之间实时交换数据,
响应速度极快,适用于实时交互、即时通信等场景。
更高的性能:
WebSocket 的数据帧格式相对简单,能够降低数据传输的开销,
同时能够实现更高的并发连接数,支持更多的客户端连接。
协议成熟、标准化:
WebSocket 协议已经成熟、标准化,并且得到了广泛应用,
各种语言和框架都有相应的实现,具有良好的兼容性和可移植性。

WebSocket 的缺点
兼容性较差:
WebSocket 是 HTML5 新增的协议,较老的浏览器不支持,
需要使用 Polyfill 进行兼容性处理。
部署、维护成本高:
WebSocket 协议使用的是 TCP 协议,需要保持持久的连接,
服务器端需要对连接进行管理和维护,与 HTTP 的请求-响应模式不同


Nginx的配置

websocket 其实是需要单独的配置的.
因为要进行协议升级. 

SSE 其实也是需要单独进行处置. 
因为他的proxy_cache 和 buffer的设置与流式发送相悖.
需要说明: 

http {
    upstream sse_backend {
        server 127.0.0.1:8080;
    }

    server {
        listen 80;

        location sse {
            proxy_pass http://se_backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_buffering off;
            proxy_cache off;
           add_header 'Access-Control-Allow-Origin''*';
        }
    }
}

分事项说明:
关闭 Nginx 的缓冲:
为了确保 Nginx 不对 SSE 响应进行缓冲,
直接透传给客户端,需要在 Nginx 配置中添加 
proxy_buffering off;。

设置 HTTP 版本:
SSE 需要 HTTP/1.1 协议,因此需要设置 
proxy_http_version 1.1;。

设置连接超时:
为了适应 SSE 流式传输的特性,需要设置较长的连接超时时间。
例如,可以设置 
proxy_connect_timeout 86400s;
proxy_read_timeout 86400s; 

禁用分块传输编码:
为了确保 SSE 流式传输过程中不会受到缓冲影响,
需要禁用 Nginx 的分块传输编码功能,设置 
chunked_transfer_encoding off;。

配置 CORS:
果 SSE 服务需要被不同域的客户端访问,
还需要在 Nginx 中配置 CORS 相关的头部,例如 
add_header 'Access-Control-Allow-Origin''*' ;

发请求头信息:
确保转发请求头信息,如 
proxy_set_header Upgrade $http_upgrade
proxy_set_header Connection 'upgrade';。


文章转载自济南小老虎,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论