我正在使用此生成器功能来实现服务器发送的事件:
def event_stream():
while True:
gevent.sleep(3)
yield 'data: some data\n\n'
...并以如下方式返回它:
return Response(event_stream(), mimetype='text/event-stream')
如果我使用time.sleep(3)
而不是gevent.sleep(3)
,它将阻止其他所有内容(按预期方式)。因此,当我使用gevent
并在本地运行Flask应用程序时,它可以正常工作。
但是,当我在远程服务器上运行它时,它不会像在本地运行该应用程序时那样每隔3秒发送一次消息,而是似乎继续堆积消息,以便当我按下 Ctrl + C结束服务器,所有堆积的消息都立即在客户端转储。
因此,在等待约30秒而没有任何消息之后,当我杀死远程服务器时,应该在3秒的时间间隔内立即接收到的十条消息将被转储。
我假设这与我运行gunicorn
的方式有关。这是我当前启动服务器的方式:
gunicorn -c config.py server:app -k gevent
配置文件中唯一配置的是bind
变量。
经过两天的尝试后,发现必须为服务器发送的事件更改nginx配置。
仅添加这三行就可以了:
proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
来源:First Google Hit for "nginx server sent events" (SO answer)