我的堆栈是 gunicorn、gevent worker、nginx 和 django。经过一番努力,我已经能够让SSE工作(不,我不想使用 node.js、socket.io、tornado、twisted 或 nginx 推送模块或其他工具 - 想使用上面的列出的堆栈)。我最终会为 pubsub 使用 redis 支持的队列,但不是现在我在调试时。
在我的虚拟/测试程序中,我能够通过 SSE 将更新发送到浏览器/客户端(使用浏览器进行测试),我的任务需要 2 秒才能完成(我只是在那里睡觉)。按预期工作。
当我将睡眠时间增加到 60 秒以上(即,我不那么频繁地向客户端发送更新)时,我的浏览器出现超时。我如何告诉 nginx 不要超时event-stream
(可能超过 5 分钟)的内容?
我的 nginx.conf:
upstream app_server {
server 127.0.0.1:8000 fail_timeout=0;
}
server {
listen 80 default;
client_max_body_size 4G;
keepalive_timeout 5;
root /home/ubuntu/webapps/testt;
error_log /var/log/nginx/sse.error.log debug;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Connection '';
proxy_buffering off;
proxy_cache off;
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://app_server;
break;
}
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /path/to/app/current/public;
}
}
我的客户端期望从服务器返回消息:
<script type="text/javascript">
$(document).ready(function() {
var source = new EventSource('/events1/');
var events_dom = $("#events");
source.onmessage = function(message) {
$('#events').append('<li>'+message.data+'</li>');
}
});
});
</script>
我将一个 url 映射到 sse_request():
def event_stream()
while True:
time.sleep(70)
yield 'data: %s\n\n' % unicode(datetime.datetime.now())
def sse_request(request):
return HttpResponse(
event_stream(),
mimetype='text/event-stream')