Google Compute Engine中的服务器已发送事件

时间:2015-05-20 16:50:06

标签: google-compute-engine gcloud

我正在尝试使用在Google Compute Engine上运行的服务器已发送事件的应用程序,当SSH进入框中时我可以查看它们,但不能通过ephermeral IP进行外部操作,又名

curl 0.0.0.0/route

从框内工作但

curl xx.xx.xx.xx/route

只是挂起,看着其他路由的标题似乎在框和外部单词之间存在某种缓存代理,这阻止了服务器发送的事件因为连接没有完成而退出,有在关闭proxy_cache之前,与nginx类似的问题,但据我所知,没有配置计算引擎使用的代理的文档。

是否可以从Google Compute Engine执行服务器发送的事件,如果可以,您需要做些什么才能让它发挥作用?

修改

使用浏览器EventSource对象创建请求,因此它具有默认标头,其标题为Accept:text/event-streamCache-Control:no-cache,加RefererUser-Agent

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

在AWS中运行时,只要我在适当地修改配置,我在nginx后运行它就可以了。

在谷歌计算引擎中,其他页面加载正常,但带有服务器发送事件的路由只是挂起,甚至从不接收标题。我怀疑谷歌在GCE框和外部世界之间粘贴代理的原因是添加了Via:HTTP/1.1 proxy10205标题。

2 个答案:

答案 0 :(得分: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文件,其中包含以下内容:

  5. <?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  
    

答案 1 :(得分:0)

较低网络层可能存在魔力,但在GCE上,外部IP上的VM与互联网之间没有(透明或其他)代理。我不确定Via标头的来源,浏览器/客户端是否配置了代理?

外部IP没有在GCE上以最直接的方式配置,尽管可能会在堆栈中绊倒一些东西。我认为对于外部IP,外部IP本身不会出现在VM配置中的任何位置,它会通过1-1 NAT转换为VM内部IP。负载均衡的IP最终会在主机上显示外部IP(尽管即使这些IP配置都很有趣)。

即使我认为任何事情都不应该关心SSE的服务器IP,也许可以尝试设置一个指向这个实例的负载均衡IP并查看它是否更好?