Запуск daphne за обратным прокси-сервером nginx с обновлением протокола всегда направляет к http вместо websocket

Я пытаюсь развернуть приложение уведомлений на основе каналов django за обратным прокси-сервером Nginx, чтобы обслуживать только связь через веб-сокет, и в то же время настроить Nginx + uWSGI для обслуживания приложения django.

Приложение работает на моем локальном компьютере без проблем при запуске с python manage.py runserver --noasgi + daphne -p 8000 myproject.asgi:application или же python manage.py runserver с daphne обрабатывать все запросы внутри страны.

Проблема:

Все запросы websocket направляются на http тип протокола вместо websocket тип протокола и возвращает WebSocket connection to 'ws://ip_address/ws/' failed: Error during WebSocket handshake: Unexpected response code: 404

Установленные пакеты:

Django==2.0.3
channels==2.0.2
channels-redis==2.1.1
daphne==2.1.0
asgiref==2.3.0
Twisted==17.9.0
aioredis==1.0.0
autobahn==18.4.1

Среда:

Ubuntu - 16.04
Nginx - 1.12.0

Конфигурация Nginx для обновления запроса:

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

# the upstream component nginx needs to connect to websocket requests
upstream websocket {
    server unix:/path/to/my/app/daphne.sock;
}

# configuration of the server
server {

        # the port your site will be served on
        listen      80;

        # the domain name it will serve for
        server_name ip_address;
        charset     utf-8;

       # Sending all non-media requests for websockets to the Daphne server.
        location /ws/ {
            proxy_pass http://websocket;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }

}

routing.py

from django.conf.urls import url

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from myapp import consumers

application = ProtocolTypeRouter({
    'websocket': AuthMiddlewareStack(
        URLRouter([
            url(r'^ws/$', consumers.MyConsumer),
        ])
    ),
})

Дафна Логи:

None - - [TimeStamp] "GET /ws/" 404 3
None - - [TimeStamp] "GET /ws/" 404 3
None - - [TimeStamp] "GET /ws/" 404 3

Пожалуйста, дайте мне знать, если что-то дополнительно требуется, чтобы помочь.

PS: я развернул одно и то же приложение на двух серверах (оба имеют одинаковую конфигурацию и среду, как указано выше), и результат был одинаковым.

1 ответ

Решение

Наконец, я обнаружил, что виновником был брандмауэр моей компании, который удалял заголовки обновления, когда к приложению обращались через http, Итак, после обновления http в httpsначал работать как положено.

Другие вопросы по тегам