微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flask + gevent – SSE超时nginx + uwsgi

我正在编写一个基于Flask,gevent和Redis的Web应用程序,它使用Server Sent Events。

我已经经历了几个关于StackOverflow的问题,并在谷歌上进行了广泛的search,但没有find适合我的任何合适的答案,所以在这里我要求社区帮助。

问题在于生产栈Nginx + uwsgi:浏览器定期收到更新(并按预期刷新)约30秒。 之后,连接超时,浏览器不再收到任何更新,直到手动重新加载页面

由于整个事情在本地主机上完美工作,与标准的瓶开发服务器(连接闲置30分钟后),我敢肯定,这个问题是在uwsgi / Nginxconfiguration。 我已经尝试了所有我能想到的Nginx / uwsgi设置,但没有任何设置,它会在几秒钟后超时。

Nginx在60秒后正好超时

HTML5服务器发送的事件原型 – 模棱两可的错误和重复轮询?

服务器发送的事件连接超时在Node.js通过Nginx

服务器发送的事件和Railsstream

在代理上启用ssl后,服务器发送的事件停止工作

有人有线索吗?

这里有一些代码和configuration。

Nginx相关的生产设置:

location / { include uwsgi_params; uwsgi_pass unix:/tmp/myapp.sock; uwsgi_param UWsgi_PYHOME /srv/www/myapp/venv; uwsgi_param UWsgi_CHDIR /srv/www/myapp; uwsgi_param UWsgi_MODULE run; uwsgi_param UWsgi_CALLABLE app; uwsgi_buffering off; proxy_set_header Connection ''; proxy_http_version 1.1; chunked_transfer_encoding off; proxy_cache off; }

uwsgi生产设置

[uwsgi] base = /srv/www/myapp app = run home = %(base)/venv pythonpath = %(base) socket = /tmp/%n.sock gevent = 100 module = %(app) callable = app logto = /srv/www/myapp-logs/uwsgi_%n.log

这是模板为了订阅频道而执行的JavaScript(目前模板只是在服务器推送一些数据时刷新整个页面

<script type="text/javascript"> var eventOutputContainer = document.getElementById("event"); var evtSrc = new EventSource("/movers/monitor"); evtSrc.onmessage = function(e) { console.log(e.data); location.reload(); //eventOutputContainer.innerHTML = e.data; }; </script>

这是我用来返回stream数据的代码

from myapp import redislist from flask import Response,Blueprint,stream_with_context movers = Blueprint('movers',__name__,url_prefix='/movers') r = redislist['r'] @movers.route("/monitor") def stream_movers(): def gen(): pubsub = r.pubsub() pubsub.subscribe('movers-real-time') for event in pubsub.listen(): if event['type'] == 'message': yield 'retry: 10000nndata: %snn' % event['data'] return Response(stream_with_context(gen()),direct_passthrough=True,mimetype="text/event-stream")

最后,应用程序就像这样执行(本地主机上的DEBUG为True)

from myapp import app from gevent.wsgi import WsgiServer if __name__ == '__main__': DEBUG = True if app.config['DEBUG'] else False if DEBUG: app.run(debug=DEBUG,threaded=True) app.debug = True server = WsgiServer(("",5000),app) server.serve_forever() else: server = WsgiServer("",app) server.serve_forever()

Rails:我想要Server Sent Events。 我必须放弃Phusion Passenger吗?

无法通过移动3gnetworking访问服务器发送的事件

使用Nginx和uWsgi发送服务器事件

SSE(EventSource):为什么不超过6个连接?

SSE / EventSource在第一批数据(Rails 4 + Puma + Nginx)之后closures

Nginx日志文件和firefox js控制台上长时间工作之后,结果显示问题中显示的配置完全正确。

问题是页面重新加载,这个操作杀死并重新初始化连接,因此重试命令没有任何作用。

删除该指令后,即使长时间不活动,SSE更新仍然像魅力一样。

现在的问题是为什么这个工作在更简单的开发环境栈上:-)

编辑

事实上,几天之后,这个连接仍然超时。 我已经做了一些时间测量,发现超时间隔在30秒和几分钟不活动之间是可变的。

我的结论是,上面的堆栈是好的,而它是亚马逊EC2连接,因为我仍然使用一个微型实例,在一些变量不活动的时间后失效。

最后的修正是以下的JS片段:

evtSrc.onerror = function(e) { location.reload(); }

页面重新加载时连接被删除(无论原因)。 当服务器发送事件频繁时,预计不会发生重新加载。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐