django - channel Websocket 立即与 ssl 断开连接

标签 django ssl nginx django-channels daphne

我试图从 channel docs 运行教程在我的生产服务器上,使用 ssl。 几个小时后,我设法建立了连接,但它立即断开连接:

None - - [12/Mar/2018:17:42:22] "WSCONNECTING /ws/chat/bibou/" - -
None - - [12/Mar/2018:17:42:22] "WSCONNECT /ws/chat/bibou/" - -
None - - [12/Mar/2018:17:42:23] "WSDISCONNECT /ws/chat/bibou/" - -

我的堆栈是

ubuntu 16.04
nginx 1.10.3
channels==2.0.2
daphne==2.1.0
channels-redis==2.1.0
Twisted==17.9.0

除了 room.html 中的这部分,我有教程中代码的精确复制粘贴

var chatSocket = new WebSocket(
    'wss://' + window.location.host +
    ':8443/ws/chat/' + roomName + '/');

这是我的 nginx conf

server {
    #http
    listen 80;
    server_name domain.com;
    root /usr/share/nginx/html;
    include /etc/nginx/default.d/*.conf;

    location / {
        return 301 https://$server_name$request_uri;
    }
}

server {
    #https
    listen 443 ssl;
    listen 8443 ssl;
    server_name domain.com;
    root /usr/share/nginx/html;

    ssl_certificate "/etc/letsencrypt/live/domain.com/fullchain.pem";
    ssl_certificate_key "/etc/letsencrypt/live/domain.com/privkey.pem";
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    add_header Strict-Transport-Security "max-age=31536000";

    include /etc/nginx/default.d/*.conf;

    location /static/ {
    root /home/ubuntu;
    }

    location /media/ {
        root /home/ubuntu;
    }

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass http://unix:/home/ubuntu/tlebrize/Project.sock;
    }

    location /ws/ {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

        proxy_pass http://unix:/home/ubuntu/tlebrize/Daphne.sock;
    }
}

我用 daphne -u Daphne.sock Project.asgi:application -v 3 运行 daphne

我还尝试绕过 nginx 并使用 sudo daphne -e ssl:8443:privateKey=/etc/letsencrypt/live/domain.co/privkey.pem:certKey=/etc/letsencrypt/live/domain.co/fullchain.pem Project.settings:CHANNEL_LAYERS 但我得到了相同的结果。

前面的中断显示消息聊天套接字意外关闭,错误代码为 1011(内部错误),没有任何原因。

最佳答案

我设法让它工作,这是 nginx 和/或使用 ReconnectingWebSocket 的问题。这是我的整个工作 session : nginx

server {
#http
listen 80;
server_name domain.co;
root /usr/share/nginx/html;
include /etc/nginx/default.d/*.conf;

location / {
    return 301 https://$server_name$request_uri;
}
}

server {
#https
listen 443 ssl;
server_name domain.com;
root /usr/share/nginx/html;

ssl_certificate "/etc/letsencrypt/live/domain.com/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/domain.com/privkey.pem";
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

add_header Strict-Transport-Security "max-age=31536000";

include /etc/nginx/default.d/*.conf;

location /static/ {
root /home/ubuntu;
}

location /media/ {
    root /home/ubuntu;
}

location /ws/ {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_pass http://127.0.0.1:8443;
}

location / {...}
}

达芙妮 sudo/home/ubuntu/venv/bin/daphne -e ssl:8443:privateKey=/etc/letsencrypt/live/domain.com/privkey.pem:certKey=/etc/letsencrypt/live/domain.com/fullchain.pem Project.asgi:application -v 3

js

var chatSocket = new ReconnectingWebSocket(
    'wss://' + window.location.host +
    ':8443/ws/chat/' + roomName + '/');

关于django - channel Websocket 立即与 ssl 断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49242104/

相关文章:

security - 客户端可以在使用 SSL 发送数据之前看到数据吗?

java - 尝试运行 Java NIO SSL 的简单示例来加载 https ://www. amazon.com 的内容,但收到 400 Bad Request

node.js - 哪种扩展 Nodejs 应用程序的方式更好?

ssl - Socket.IO 聊天应用 + SSL + NGINX

django - 从一组用户中删除特定用户的对象

未提供 Django Rest Framework 身份验证凭据

django - 基于类的 View MySQL DateTimeField 收到了一个简单的日期时间

ruby-on-rails - ActionMailer SMTP "certificate verify failed"

nginx add_header 不工作

Django 中的 Ajax 调用失败