如何在 Flask 服务器发送事件的生成器中配置 gunicorn 和 gevent 以实现睡眠功能?

How to configure gunicorn and gevent for sleep function inside a generator for Flask Server-Sent Events?

我正在使用这个生成器函数来实现服务器发送的事件:

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 变量。

经过两天的尝试,结果发现必须为 Server-Sent Events 更改 nginx 配置。

仅仅添加这三行就可以了:

proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;

来源:First Google Hit for "nginx server sent events" (SO answer)