Подключение и отключение веб-сокета каналов Django (Nginx + Daphne + Django + Channels)

У меня проблемы с развертыванием этого на производственной виртуальной машине с Nginx + Gunicorn + Daphne + Django. Я тестировал его на локальной виртуальной машине, и он работает без проблем, но на производстве сокеты подключаются и отключаются. Я прикрепил свою конфигурацию nginx, asgi.py и routing.py. Я использую команду `` `` $ daphne -p 8010 project.asgi: application`` введите здесь описание изображения

# Nginx config
upstream test_project {
        server localhost:8001;
}
upstream test_project_websocket {
        server localhost:8002;
}
server {
        listen 1881;

        location / {
                proxy_pass http://test_project;
        }
        location /ws/ {
                proxy_pass http://test_project_websocket;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "Upgrade";
                proxy_redirect off;
        }

        proxy_set_header Host $host;
}

#asgi.py
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'WebServer.settings')
django.setup()

from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter
import Andon.routing # app.routing
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.layers import get_channel_layer


application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": AuthMiddlewareStack(
            URLRouter(
                    Andon.routing.websocket_urlpatterns,
            ),
        ),
})
# routing.py
from django.urls import path, re_path
from . import consumers

from channels.layers import get_channel_layer

websocket_urlpatterns = [
    re_path(r'ws/andon/$', consumers.AndonConsumer.as_asgi()),
]

Изменить 27-11-20: еще не решил, но нашел что-то интересное. Если вы используете старые версии Redis, убедитесь, что у вас есть следующие версии:

channels==3.0.2
channels-redis==2.4.1

Изменить 27-11-20: частичное решение Я думаю, у меня проблемы с конфигурацией nginx, потому что, если я попытаюсь подключиться напрямую к порту daphne, он будет работать нормально, но если я перенаправляю трафик с nginx, это не так.

Изменить 16-12-20: Решение У меня была старая версия nginx 1.10, я обновил ее до 1.16 и работал без каких-либо проблем, используя конфигурацию этого сообщения: Конфигурация


person lautaro dapin    schedule 24.11.2020    source источник


Ответы (1)


Это конфигурация, которую вы ищете

# Connecting to daphne socket
upstream test_project_websocket {
        server localhost:8010;
}
....
    # Notice the "/" at then end of location & proxy_pass url
    location /ws/ {
        proxy_pass http://test_project_websocket/;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $server_name;
    }

    location / {
         proxy_pass http://test_project;
    }

person Arash77    schedule 25.11.2020
comment
Я заметил, что в исходном посте я написал неправильный порт, но в развертывании я написал его нормально. Я пробую ваш ответ, не сработало, я проверяю /, на который вы указываете, также пытаюсь удалить originvalidators из маршрутизации asgi, но это не сработало. Я буду продолжать искать информацию - person lautaro dapin; 26.11.2020
comment
ваш порт nginx 1881 работает с ssl? Можете ли вы поставить код клиента и как вы пытаетесь подключиться к серверу? также экран консоли daphne и любые предупреждения, которые он выдает при подключении, было бы неплохо для отладки проблемы. - person Arash77; 28.11.2020