@robocop45
Only python

Почему именно на деплой сервере валится webscoket соединение?

Всем привет, проблема следующая:
сделал функционал для websockets в своем django приложении. На локалке подключение происходит успешно, но на сервере ubuntu 18 все валится.

локалка
654e36a116b08292914102.png

consumers.py
class CallConsumer(AsyncWebsocketConsumer):
    """
       WebSocket-потребитель для отправки уведомлений пользователям.
    """

    async def connect(self) -> None:
        """Устанавливает соединение и проверяет юзера на аутентификацию"""
        self.user = self.scope['user']
        self.group_name = 'notifications'
        await self.channel_layer.group_add(
            self.group_name,
            self.channel_name
        )
        await self.accept()

    async def disconnect(self, close_code) -> None:
        """Отключает соединение"""
        await self.channel_layer.group_discard(
            self.group_name,
            self.channel_name
        )

    async def send_notification(self, event: dict) -> None:
        """ Отправляет уведомление конкретному пользователю"""

        if self.scope['user'].id == int(event['employee_number']):  # сравниваем id текущего пользователя со списком из контекста(send_simple_notification)
            await self.send(text_data=json.dumps(event['data'], ensure_ascii=False))


asgi.py
import os
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator
from django.core.asgi import get_asgi_application
from django.urls import path

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cpm.settings")

django_asgi_app = get_asgi_application()


from call.consumers import CallConsumer


application = ProtocolTypeRouter({
    # Django's ASGI application to handle traditional HTTP requests
    "http": django_asgi_app,

    # WebSocket chat handler
    "websocket": AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter([
                path("ws/notifications/", CallConsumer.as_asgi())
            ])
        )
    ),
})


settings.py
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("адрес сервера ubuntu", 6379)],
        },
    },
}

ASGI_APPLICATION = "cpm.asgi.application"


docker-compose.yml
version: '3.8'

services:
  # Контейнер для Gunicorn (WSGI)
  wsgi:
    build:
      context: .
      dockerfile: Dockerfile_wsgi
    command: >
      sh -c "python manage.py collectstatic --noinput &&
             python manage.py makemigrations &&
             python manage.py migrate &&
             gunicorn cpm.wsgi:application --bind 0.0.0.0:8005 --access-logfile -"
    volumes:
      - ./logs/wsgi_docker/:/cpm/logs/
      - static_value:/cpm/static/
      - media_value:/cpm/media/
    restart: always
    ports:
      - "8005:8005"

  asgi:
    build:
      context: .
      dockerfile: Dockerfile_asgi
    command: >
      sh -c "python manage.py makemigrations &&
             python manage.py migrate
             python manage.py runserver 0.0.0.0:8006"
    volumes:
      - ./logs/asgi_docker/:/cpm/logs/
      - static_value:/cpm/static/
      - media_value:/cpm/media/
    restart: always
    ports:
      - "8006:8006"
    depends_on:
      - wsgi

  redis:
      image: redis:alpine
      restart: always

  nginx:
     build: ./nginx
     ports:
       - "85:85"
     depends_on:
       - wsgi
       - asgi

volumes:
  static_value:
  media_value:


ошибка на сервере
654e3808959fd479381086.png

nginx.conf
server {
    listen 85; 
    server_name my_name; 
    server_tokens off;

    location / {
        proxy_pass http://wsgi:8005/; # Порт, на котором работает WSGI (Gunicorn) 
        proxy_set_header Host $http_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-Proto $scheme;
    }
    location /ws/notifications/ {
        proxy_pass http://asgi:8006/; # Порт, на котором работает ASGI-сервер (Daphne) 
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_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-Proto $scheme;
    }

}


заранее всем спасибо
  • Вопрос задан
  • 61 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы