【问题标题】:Django channels with redis-server and nginx带有 redis-server 和 nginx 的 Django 频道
【发布时间】:2018-06-09 06:40:09
【问题描述】:

我一直在关注这个 http://channels.readthedocs.io/en/latest/getting-started.html

我当前的设置(在添加频道之前)是 nginx、uwsgi、django。

在我的本地,我在转发端口 5000 的 vagrant box 上运行所有这些
Django 服务器当前运行在 0.0.0.0:5000
我的 nginx 配置监听 8000 并提供静态文件
它还有:

location / {
    include uwsgi_params;
    uwsgi_pass unix:{{backend_uwsgi_socket}};
}

按照教程,一切正常,直到我改变我的 settings.py

CHANNEL_LAYERS = {
  "default": {        
    "BACKEND": "asgiref.inmemory.ChannelLayer",        
    "ROUTING": "myapp.routing.channel_routing",
  },
}

CHANNEL_LAYERS = {
 "default": {
    "BACKEND": "asgi_redis.RedisChannelLayer",        
    "CONFIG": {
        #"hosts": [os.environ.get('REDIS_URL', 'redis://localhost:6379')],
        #"hosts": [("redis-server-name", 6379)],           
        "hosts": [("localhost", 6379)],
    },
    "ROUTING": "myapp.routing.channel_routing",
 },
}

所以教程说要安装redis-server,然后再次运行命令:
manage.py runserver 0.0.0.0:80000

如果我关闭 nginx,然后运行它会报错:

ConnectionError:连接到 localhost:6379 时出现错误 111。连接被拒绝。

我尝试在我的 nginx 服务器块中为此端口添加一个侦听器,然后我收到以下错误:

^Cvagrant@vagrant-ubuntu-trusty-64:/srv/myproj/backend$ sudo python manage.py runserver 0.0.0.0:8000
正在执行系统检查...

系统检查未发现任何问题(0 静音)。
2017 年 12 月 28 日 - 17:10:25
Django 1.10 版,使用设置'backend.settings'
http://0.0.0.0:8000/
启动 Channels 开发服务器 通道层默认 (asgi_redis.core.RedisChannelLayer)
使用 CONTROL-C 退出服务器。
2017-12-28 17:10:25,883 - 信息 - 工作人员 - 监听通道 http.request、websocket.connect、websocket.disconnect、websocket.receive
线程 Thread-1 中的异常:
回溯(最近一次通话最后一次):
文件“/usr/lib/python2.7/threading.py”,第 810 行,在 __bootstrap_inner
self.run()
文件“/usr/local/lib/python2.7/dist-packages/channels/management/commands/runserver.py”,第 176 行,运行中
worker.run()
运行中的文件“/usr/local/lib/python2.7/dist-packages/channels/worker.py”,第 87 行
频道,内容 = self.channel_layer.receive_many(channels, block=True)
文件“/usr/local/lib/python2.7/dist-packages/asgiref/base_layer.py”,第 43 行,receive_many
返回 self.receive(通道,块)
文件“/usr/local/lib/python2.7/dist-packages/asgi_redis/core.py”,第 168 行,在接收
结果 = connection.blpop(list_names, timeout=self.blpop_timeout)
文件“/usr/local/lib/python2.7/dist-packages/redis/client.py”,第 1269 行,在 blpop
return self.execute_command('BLPOP', *keys)
文件“/usr/local/lib/python2.7/dist-packages/redis/client.py”,第 668 行,在 execute_command
return self.parse_response(connection, command_name, **options)
文件“/usr/local/lib/python2.7/dist-packages/redis/client.py”,第 680 行,在 parse_response
响应 = 连接.read_response()
文件“/usr/local/lib/python2.7/dist-packages/redis/connection.py”,第 624 行,在 read_response
响应 = self._parser.read_response()
文件“/usr/local/lib/python2.7/dist-packages/redis/connection.py”,第 292 行,在 read_response
(str(byte), str(response)))
InvalidResponse:协议错误:

打印出来后,它只是不断地打印以下消息:

错误 - 服务器 - 尝试接收消息时出错:协议错误:


我正在努力寻找答案,并且在学习了一些不同的教程/示例后让自己感到困惑。
我知道我错过了一些明显的东西,或者误解了一些东西。

任何指点或帮助将不胜感激。

【问题讨论】:

  • 我一发布这个,我就在想“redis-server 正在运行吗?”.. 我运行了它......这一切都再次起作用了。感觉本教程遗漏了一些重要内容。

标签: django nginx redis django-channels


【解决方案1】:

ConnectionError:连接到 localhost:6379 时出现错误 111。连接被拒绝。

6379 是 redis 服务器应该运行的端口。你不应该配置 nginx 来监听它。

您发布的堆栈跟踪意味着 django 服务器正在尝试连接到 redis(端口 6379)并且它不喜欢响应(因为 nginx 在那里侦听,而不是 redis)。

【讨论】:

    猜你喜欢
    • 2016-08-31
    • 2020-11-28
    • 2017-02-01
    • 2013-03-22
    • 2020-07-29
    • 2011-10-23
    • 1970-01-01
    • 2019-02-01
    • 2019-12-17
    相关资源
    最近更新 更多