Luk*_*yer 66 ruby nginx sinatra
在服务器端使用带有stream
块的Sinatra .
get '/stream', :provides => 'text/event-stream' do
stream :keep_open do |out|
connections << out
out.callback { connections.delete(out) }
end
end
Run Code Online (Sandbox Code Playgroud)
在客户端:
var es = new EventSource('/stream');
es.onmessage = function(e) { $('#chat').append(e.data + "\n") };
Run Code Online (Sandbox Code Playgroud)
当我直接使用应用程序,通过http://localhost:9292/
,一切都很完美.连接是持久的,所有消息都传递给所有客户端.
但是当它通过Nginx时http://chat.dev
,连接被丢弃并且重新连接每隔一秒左右触发一次.
Nginx设置对我来说没问题:
upstream chat_dev_upstream {
server 127.0.0.1:9292;
}
server {
listen 80;
server_name chat.dev;
location / {
proxy_pass http://chat_dev_upstream;
proxy_buffering off;
proxy_cache off;
proxy_set_header Host $host;
}
}
Run Code Online (Sandbox Code Playgroud)
尝试keepalive 1024
在upstream
部分以及proxy_set_header Connection keep-alive;
在location
.
什么都没有帮助:(
没有持久连接和消息未传递给任何客户端.
小智 151
你的Nginx配置是正确的,你只是错过了几行.
这是一个EventSource
通过Nginx工作的"魔术三重奏" :
proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
Run Code Online (Sandbox Code Playgroud)
将它们放入location
部分,它应该工作.
您可能还需要添加
proxy_buffering off;
proxy_cache off;
Run Code Online (Sandbox Code Playgroud)
这不是官方的做法.
我最后通过"试验和错误"+"谷歌搜索":)
小智 9
另一种选择是在您的响应中包含值为"no"的"X-Accel-Buffering"标头.Nginx特别对待它,请参阅http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering
不要自己从头开始写这个.Nginx是一个很棒的服务器,它有一些模块可以为你处理SSE而不会降低上游服务器的性能.
查看https://github.com/wandenberg/nginx-push-stream-module
它的工作方式是订户(使用SSE的浏览器)连接到Nginx,连接在那里停止.发布者(你的Nginx背后的服务器)会在相应的路由上向Nginx发送一个POST,在那一刻,Nginx将立即转发到浏览器中等待的EventSource监听器.
这种方法比ruby webserver处理这些"长轮询"SSE连接更具可扩展性.
归档时间: |
|
查看次数: |
20316 次 |
最近记录: |