【问题标题】:Daphne websocket erro r 200 when used with nginx与 nginx 一起使用时,Daphne websocket 错误 200
【发布时间】:2020-06-19 14:13:03
【问题描述】:

我试图实现一个由 nginx 、 daphne 和 gunicorn 组成的系统。到目前为止,我已经让 gunicorn 开始工作,但是我面临着为 daphne 连接 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),
        ]                                                                                                                       )                                                                                                               )
            )                                                                                                               })            

我将不胜感激任何形式的反馈!

【问题讨论】:

    标签: nginx websocket django-channels daphne


    【解决方案1】:

    当您代理传递以打开 Web-socket 连接时,您需要代理传递所有 Web-socket http 标头。 https://developer.mozilla.org/en-US/docs/Web/HTTP/Protocol_upgrade_mechanism#WebSocket-specific_headers 您还需要传递 Origin 标头,因为您使用的是 AllowedHostsOriginValidator

    -- 为了调试这些,我建议直接使用 api 客户端而不是浏览器。 Paw 或 Insomnia 可用于点击 api 来检查您的 Nginx 配置是否路由到通道而不是 Gunicorn。

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 2021-09-25
      • 2021-12-23
      • 1970-01-01
      • 2016-07-09
      • 2016-09-20
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      相关资源
      最近更新 更多