AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 801628
Accepted
c4urself
c4urself
Asked: 2016-09-08 07:17:03 +0800 CST2016-09-08 07:17:03 +0800 CST 2016-09-08 07:17:03 +0800 CST

对于服务器发送事件 (SSE),什么 Nginx 代理配置是合适的?

  • 772

我已经阅读了很多关于 Nginx 配置适合 SSE 的不同问题,并就使用哪些设置得出了一些令人困惑的结果:

  • https://stackoverflow.com/questions/17529421/sending-server-sent-events-through-a-socket-in-c
  • https://stackoverflow.com/questions/13672743/eventsource-server-sent-events-through-nginx
  • https://stackoverflow.com/questions/21630509/server-sent-events-connection-timeout-on-node-js-via-nginx

那么正确答案是什么?

nginx
  • 1 1 个回答
  • 32589 Views

1 个回答

  • Voted
  1. Best Answer
    c4urself
    2016-09-08T07:17:03+08:002016-09-08T07:17:03+08:00

    长时间运行的连接

    服务器发送事件 (SSE) 是一个长时间运行的 HTTP 连接**,所以对于初学者来说,我们需要这个:

    proxy_http_version 1.1;
    proxy_set_header Connection "";
    

    注意:HTTP/1.1 中的 TCP 连接默认是持久的,因此将 Connection 标头设置为空是正确的,也是 Nginx 的建议。

    分块传输编码

    现在顺便说一句;SSE 响应不设置 Content-Length 标头,因为它们不知道将发送多少数据,而是需要使用 Transfer-Encoding 标头[0][1],这允许流连接。另请注意:如果您不添加 Content-Length,大多数 HTTP 服务器将为Transfer-Encoding: chunked;您设置。奇怪的是,HTTP 分块警告并导致混乱。

    混淆源于 W3 EventSource 描述的注释部分中的一个有点模糊的警告:

    作者还告诫说,HTTP 分块可能对该协议的可靠性产生意想不到的负面影响。在可能的情况下,应该禁用分块以提供事件流,除非消息的速率足够高以至于这无关紧要。

    这会让人们相信Transfer-Encoding: chunked;对 SSE 来说是一件坏事。但是:情况不一定如此,只有当您的网络服务器为您进行分块(不知道有关您的数据的信息)时,这才是问题。因此,虽然大多数帖子都会建议chunked_transfer_encoding off;在典型情况下添加此功能 [3]。

    缓冲(真正的问题)

    大多数问题的根源在于应用服务器和客户端之间存在任何类型的缓冲。默认情况下[4],Nginx 使用 proxy_buffering on(也可以查看uwsgi_buffering并fastcgi_buffering取决于您的应用程序)并且可以选择缓冲您想要发送给客户端的块。这是一件坏事,因为 SSE 的实时性中断了。

    但是,proxy_buffering off实际上最好(如果可以的话)X-Accel-Buffering: no在您的应用程序服务器代码中添加作为响应标头,以仅关闭基于 SSE 的响应的缓冲,而不是针对来自您的应用程序的所有响应,而不是转向所有内容服务器。奖励:这也适用于uwsgiand fastcgi。

    解决方案

    所以真正重要的设置实际上是应用服务器响应头:

    Content-Type: text/event-stream;
    Cache-Control: no-cache;
    X-Accel-Buffering: no;
    

    并且可能会实施一些 ping 机制,以便连接不会闲置太久。这样做的危险是 Nginx 将关闭使用keepalive设置设置的空闲连接。


    [0] https://www.rfc-editor.org/rfc/rfc2616#section-3.6
    [1] https://en.wikipedia.org/wiki/Chunked_transfer_encoding
    [2] https://www.w3.org /TR/2009/WD-eventsource-20091029/#text-event-stream
    [3] https://github.com/whatwg/html/issues/515
    [4] http://nginx.org/en/docs/ http/ngx_http_proxy_module.html#proxy_buffering
    [5] https://www.rfc-editor.org/rfc/rfc7230#section-6.3
    [6] https://gist.github.com/CMCDragonkai/6bfade6431e9ffb7fe88

    • 75

相关问题

  • Gzip 与反向代理缓存

  • nginx 作为代理的行为

  • Nginx 学习资源 [关闭]

  • 提供 70,000 个静态文件 (jpg) 的最佳方式?

  • 在 Apache、LightTPD 和 Nginx Web 服务器上提供 PHP 5.x 应用程序的现状?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve