【问题标题】:Server Sent Events in Google Compute EngineGoogle Compute Engine 中的服务器发送事件
【发布时间】:2025-11-25 10:25:01
【问题描述】:

我正在尝试让一个使用在 Google Compute Engine 上运行的服务器发送事件的应用程序,当 SSH 进入框中时,我可以查看它们,但不能通过临时 IP 在外部查看,也就是

curl 0.0.0.0/route

在盒子里面工作,但是

curl xx.xx.xx.xx/route

只是挂起,查看来自其他路由的标头,似乎在盒子和外部单词之间存在某种缓存代理,由于连接尚未完成,因此阻止服务器发送的事件退出,有在您关闭 proxy_cache 之前,nginx 会出现类似问题,但据我所知,没有用于配置计算引擎使用的代理的文档。

是否可以从 Google Compute Engine 执行服务器发送事件,如果可以,您需要做什么才能使其正常工作?

编辑

Request 是使用浏览器 EventSource 对象创建的,因此它具有看起来像 Accept:text/event-streamCache-Control:no-cache 以及 RefererUser-Agent 的默认标头。

我添加的标题是Content-Type:text/event-streamCache-Control:no-cacheConnection:keep-alive

假设我适当地修改了配置,当我在 nginx 后面运行它时,在 AWS 中运行一切都很好。

在 Google Compute Engine 中,其他页面加载正常,但带有服务器发送事件的路由甚至挂起,甚至从未接收到标头。我怀疑谷歌在 GCE 盒子和外界之间粘贴代理的原因是添加了 Via:HTTP/1.1 proxy10205 标头。

【问题讨论】:

  • 我认为您需要提供更多信息才能更好地诊断原因。你能用你看到的标题更新吗?既发送又接收?到目前为止,我还没有听说过任何与 GCE 相关的代理问题,但这里有一个可能对您有用的线程:serverfault.com/questions/634658/… 考虑到它在内部而不是外部工作,您是否确保所有防火墙规则都是设置允许流量? (我假设你有,但只是问。)
  • 用更多信息对其进行了更新,我能找到设置的唯一防火墙规则是与仅转发除指定地址之外的任何内容有关的规则,因此我可以访问所有其他页面的事实让我认为我设置了正确设置,如果有其他类型的防火墙规则我找不到这可能是问题。

标签: google-compute-engine gcloud


【解决方案1】:

您的 HTTP 响应中的“Via:HTTP/1.1 proxy10205”不是来自 Google Compute Engine。

GCE 不会去除 Server-Sent-Events 标头。我列出了下面的简单步骤,可以帮助您在 GCE VM 实例上配置演示服务器发送事件:

  1. 使用 CentOS 映像创建 GCE 实例。
  2. 安装 Apache Web 服务器和 PHP:

    $ sudo yum install httpd php 
    
  3. 使用来自此page 的 HTML 内容创建一个 index.html 文件:

    $ sudo vi /var/www/html/index.html
    
  4. 在 www 根目录 ($ sudo vi /var/www/html/demo_sse.php ) 中创建一个名为 demo_sse.php 的 PHP 文件,内容如下:

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

$time = date('r');
echo "data: The server time is: {$time}\n\n";
flush();
?>

现在访问网页。您还可以使用 curl 命令验证标头:

$ curl -H "Accept:text/event-stream" --verbos http://<YOUR-GCE-IP ADDRESS>/demo_sse.php  

【讨论】:

  • 问题不在于标头被剥离,而是整个响应被缓冲
【解决方案2】:

在较低的网络层上可能有魔法,但在您的虚拟机和 GCE 上的互联网之间没有(透明或其他)代理用于外部 IP。我不确定 Via 标头来自哪里,浏览器/客户端没有配置代理吗?

外部 IP 没有在 GCE 上以最直接的方式配置,尽管这可能会导致堆栈中的某些问题。我认为对于外部 IP,外部 IP 本身不会出现在 VM 配置中的任何位置,它通过 1-1 NAT 转换为 VM 内部 IP。负载平衡的 IP 最终会出现在主机上,但外部 IP 可见(即使这些 IP 以一种有趣的方式配置)。

尽管我认为任何东西都不应该真正关心 SSE 的服务器 IP,但也许可以尝试设置一个负载平衡 IP 指向那个实例,看看它是否工作得更好?

【讨论】: