Daphne websocket erro r 200 при использовании с nginx - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь внедрить систему, состоящую из nginx, Дафны и Гуникорна. До сих пор я заставил gunicorn работать, однако я сталкиваюсь с проблемой, соединяющей websockets для Дафни. Эта проблема не возникает, когда я в режиме разработки, только когда я использую nginx. Это код ошибки из моей консоли:

reconnecting-websocket.js:199 WebSocket connection to 'ws://192.168.8.31/' failed: Error during WebSocket handshake: Unexpected response code: 200

Это мой nginx файл конфигурации:

    upstream crm_server {                                                                                                       server unix:/home/user/project/venv/run/gunicorn.sock fail_timeout=0;
}

upstream channels-backend {
    server localhost:8001;
}

server {
    listen 80;
    # add here the ip address of your server
    # or a domain pointing to that ip (like example.com or www.example.com)
    server_name 192.168.8.31;
    keepalive_timeout 5;
    client_max_body_size 4G;

    access_log /home/user/project/venv/logs/nginx-access.log;
    error_log /home/user/project/venv/logs/nginx-error.log;

    location /staticfiles/ {
        root /home/user/roject/crm/staticfiles/;
    }
    # checks for static file, if not found proxy to app
    location / {
       try_files $uri @proxy_to_app;                                                                                        }                                                                                                                   
    location /ws/ {
        try_files $uri @proxy_to_ws;
    }
        location @proxy_to_ws {
            include proxy_params;
            proxy_pass http://channels-backend;
            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_to_app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_buffering off;
        proxy_redirect off;
        proxy_pass http://crm_server;
    }

Это мой интерфейс, генерирующий сокет

<script type="text/javascript">                                                                                         


     var loc = window.location
var wsStart = 'ws://'
    if (loc.protocol == 'https'){
          wsStart = 'wss://'                                                                                                    } var endpoint = wsStart + loc.host + loc.pathname                                                                        var socket = new ReconnectingWebSocket(endpoint)

Это мой маршрут:

 from channels.routing import ProtocolTypeRouter , URLRouter
from django.urls import path
from rnd.consumers import NotificationConsumer
from django.conf.urls import url
from channels.auth import AuthMiddlewareStack
from channels.security.websocket import AllowedHostsOriginValidator, OriginValidator


application = ProtocolTypeRouter({
        "websocket": AllowedHostsOriginValidator(
                AuthMiddlewareStack(
                        URLRouter(
                                [
                                        path('',NotificationConsumer),
        ]                                                                                                                       )                                                                                                               )
            )                                                                                                               })            

Я был бы очень признателен за любую форму обратной связи!

1 Ответ

0 голосов
/ 09 марта 2020

Когда вы проходите через прокси-сервер, чтобы открыть соединение через веб-сокет, вам необходимо передать через прокси все заголовки http веб-сокета. https://developer.mozilla.org/en-US/docs/Web/HTTP/Protocol_upgrade_mechanism#WebSocket -specific_headers вам также нужно будет передать заголовок Origin, так как вы используете AllowedHostsOriginValidator.

- также для их отладки я предлагаю использовать клиент API напрямую, а не чем браузер. Paw или Insomnia можно использовать, чтобы нажать api, чтобы убедиться, что ваша конфигурация Nginx направлена ​​на каналы, а не на Gunicorn.

...