Django频道:一段时间后会卡住

时间:2018-08-10 02:04:12

标签: django django-channels

我从https://github.com/andrewgodwin/channels-examples/tree/master/multichat运行了大约50个用户的代码。

它会卡住而没有任何通知。服务器没有关闭,访问日志没有什么特别的。当我停止daphne服务器(使用Ctrl + C)时,大约需要5-10分钟才能完全关闭。有时我必须运行kill命令。

当我将daphne放入supervisor中时,这很奇怪,我每隔30分钟使用crontab重新启动一次,websocket可以正常连接。它很hack但是可以正常工作。

我的配置:HAProxy =>达芙妮

daphne -b 192.168.0.6 -p 8000 yyapp.asgi:application --access-log=/home/admin/daphne.log

backend daphne
        balance source
        option http-server-close
        option forceclose
        timeout check 1000ms
        reqrep ^([^\ ]*)\ /ws/(.*) \1\ /\2
        server daphne 192.168.0.6:8000 check maxconn 10000 inter 5s

Debian:OVH服务器上的9.4(原始内核)。
的Python:3.6.4
达芙妮:2.2.1
频道:2.1.2
Django:1.11.15
Redis:4.0.11

我知道这个问题可能太笼统了,但是我对此真的没有想法。我尝试升级python,重新安装所有软件包,但没有成功。

1 个答案:

答案 0 :(得分:1)

通常,Web服务器和负载平衡器对于持久连接非常不利。您需要给Haproxy明确的指示,以便它知道何时以及如何使未使用的隧道超时。

Haproxy需要跟踪四个超时:

  1. 超时客户端
  2. 超时连接
  3. 超时服务器
  4. 超时隧道

前三个与套接字连接的初始HTTP协商阶段有关。建立连接后,仅超时隧道很重要。您将需要修改自己的应用程序的值,但是一些建议的起始值是:

  1. 超时客户端:25秒
  2. 超时连接:5秒
  3. 超时服务器:25秒
  4. 超时隧道:3600s

在您的代码中,应该是:

backend daphne
    balance source
    option http-server-close
    option forceclose
    timeout check 1000ms
    timeout client 25s
    timeout connect 5s
    timeout server 25s
    timeout tunnel 3600s
    reqrep ^([^\ ]*)\ /ws/(.*) \1\ /\2
    server daphne 192.168.0.6:8000 check maxconn 10000 inter 5s

您可能需要调整其他超时时间才能获得良好的混合效果。一些可能会影响您的设置的超时-以及一些初始值-

  1. 超时http-keep-alive:1秒
  2. 超时http请求:15秒
  3. 超时队列:30秒
  4. 超时时间:60秒

当然,请阅读并自定义以满足您的需求。

参考: Haproxy - Websockets Load Balancing