无法使用django-channels,docker上的nginx作为服务连接到websocket

前端之家收集整理的这篇文章主要介绍了无法使用django-channels,docker上的nginx作为服务连接到websocket前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在使用docker compose来构建一个django,Nginx作为服务的项目.当我启动daphne服务器,并且客户端尝试连接到websocket服务器时,我收到此错误

  1. *1 recv() Failed (104: Connection reset by peer) while reading response header from upstream

客户端显示了这一点

  1. Failed: Error during WebSocket handshake: Unexpected response code: 502

这是我的docker-compose.yml

  1. version: '3'
  2. services:
  3. Nginx:
  4. image: Nginx
  5. command: Nginx -g 'daemon off;'
  6. ports:
  7. - "1010:80"
  8. volumes:
  9. - ./config/Nginx/Nginx.conf:/etc/Nginx/Nginx.conf
  10. - .:/makeup
  11. links:
  12. - web
  13. web:
  14. build: .
  15. command: /usr/local/bin/circusd /makeup/config/circus/web.ini
  16. environment:
  17. DJANGO_SETTINGS_MODULE: MakeUp.settings
  18. DEBUG_MODE: 1
  19. volumes:
  20. - .:/makeup
  21. expose:
  22. - '8000'
  23. - '8001'
  24. links:
  25. - cache
  26. extra_hosts:
  27. "postgre": 100.73.138.65

Nginx的:

  1. server {
  2. listen 80;
  3. server_name thelab518.cloudapp.net;
  4. keepalive_timeout 15;
  5. root /makeup/;
  6. access_log /dev/stdout;
  7. error_log /dev/stderr;
  8. location /api/stream {
  9. proxy_pass http://web:8001;
  10. proxy_http_version 1.1;
  11. proxy_set_header Upgrade $http_upgrade;
  12. proxy_set_header Connection "upgrade";
  13. proxy_redirect off;
  14. proxy_set_header Host $host;
  15. proxy_set_header X-Real-IP $remote_addr;
  16. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  17. proxy_set_header X-Forwarded-Host $server_name;
  18. }
  19. location / {
  20. try_files $uri @proxy_to_app;
  21. }
  22. location @proxy_to_app {
  23. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  24. proxy_set_header X-Real-IP $remote_addr;
  25. proxy_set_header X-Forwarded-Host $server_name;
  26. proxy_set_header Host $http_host;
  27. proxy_redirect off;
  28. proxy_pass http://web:8000;
  29. }

而circusd的web.ini文件

  1. [watcher:web]
  2. cmd = /usr/local/bin/gunicorn MakeUp.wsgi:application -c config/gunicorn.py
  3. working_dir = /makeup/
  4. copy_env = True
  5. user = www-data
  6. [watcher:daphne]
  7. cmd = /usr/local/bin/daphne -b 0.0.0.0 -p 8001 MakeUp.asgi:channel_layer
  8. working_dir = /makeup/
  9. copy_env = True
  10. user = root
  11. [watcher:worker]
  12. cmd = /usr/bin/python3 manage.py runworker
  13. working_dir = /makeup/
  14. copy_env = True
  15. user = www-data
最佳答案
非常明确地说stated in the fine manual,要成功运行Channels,您需要有一个专用的应用服务器来实现ASGI协议,例如提供的daphne

使用Channels更改了整个Django执行模型,因此有单独的“接口服务器”负责接收和发送消息,例如,WebSockets或HTTP或SMS,以及运行实际代码的“工作服务器”(可能在不同的服务器或VM或容器上或…).这两者通过“通道层”连接,该通道层来回传送消息和回复.

当前实现提供3个通道层,用于在接口服务器和工作服务器之间通信ASGI:

>内存中的通道层,主要用于运行测试服务器(它是单个进程)
>基于IPC的通道层,可用于在同一服务器上运行不同的工作程序
>基于redis的通道层,应该用于繁重的生产站点,能够将接口服务器连接到多个工作服务器.

你像配置DATABASES一样配置它们::

  1. CHANNEL_LAYERS = {
  2. "default": {
  3. "BACKEND": "asgi_redis.RedisChannelLayer","ROUTING": "my_project.routing.channel_routing","CONFIG": {
  4. "hosts": [("redis-channel-1",6379),("redis-channel-2",6379)],},}

当然这意味着您的docker配置必须更改并添加一个或多个接口服务器,而不是Nginx(或者除此之外)(即使在这种情况下,您需要在不同的端口上接受所有的端口上的websocket连接)连接可能的问题)并且很可能是redis的一个实例连接它们.

这反过来意味着在circus和Nginx支持ASGI之前,不可能将它们与django-channels一起使用,或者这种支持只适用于系统的常规http部分.

您可以在Deploying section of the official documentation中找到更多信息.

猜你在找的Nginx相关文章