我正在尝试使用在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-stream
,Cache-Control:no-cache
,加Referer
和User-Agent
。
我添加的标头是Content-Type:text/event-stream
,Cache-Control:no-cache
和Connection:keep-alive
。
在AWS中运行时,只要我在适当地修改配置,我在nginx后运行它就可以了。
在谷歌计算引擎中,其他页面加载正常,但带有服务器发送事件的路由只是挂起,甚至从不接收标题。我怀疑谷歌在GCE框和外部世界之间粘贴代理的原因是添加了Via:HTTP/1.1 proxy10205
标题。
答案 0 :(得分:1)
GCE不会删除Server-Sent-Events标头。我列出了下面的简单步骤,可以帮助您在GCE VM实例上配置演示服务器发送事件:
安装Apache Web服务器和PHP:
$ sudo yum install httpd php
使用此page中的HTML内容创建一个index.html文件:
$ sudo vi /var/www/html/index.html
在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
答案 1 :(得分:0)
较低网络层可能存在魔力,但在GCE上,外部IP上的VM与互联网之间没有(透明或其他)代理。我不确定Via标头的来源,浏览器/客户端是否配置了代理?
外部IP没有在GCE上以最直接的方式配置,尽管可能会在堆栈中绊倒一些东西。我认为对于外部IP,外部IP本身不会出现在VM配置中的任何位置,它会通过1-1 NAT转换为VM内部IP。负载均衡的IP最终会在主机上显示外部IP(尽管即使这些IP配置都很有趣)。
即使我认为任何事情都不应该关心SSE的服务器IP,也许可以尝试设置一个指向这个实例的负载均衡IP并查看它是否更好?