Django+channels+nginx实现websocket服务端

使用Django+nginx实现http服务器,我们一般使用wsgi。

但是使用Django+channels+nginx实现websocket服务器时,只能使用asgi。

(关于wsgi和asgi是啥请自行搜索,我也不知道。。。)

至于如何部署asgi与nginx,channels官方文档有详细介绍: https://channels.readthedocs.io/en/latest/deploying.html

本文就简单介绍一下如何搭建服务和进行部署。(Python3)

安装Django和channels

pip install Django channels

创建websocket服务

django-admin startproject WsTest
cd WsTest
python manage.py startapp WsServer
# 手动创建修改文件,内容在下面
vi WsTest/asgi.py
vi WsServer/consumers.py
vi WsTest/routing.py
vi WsTest/settings.py
# WsTest/asgi.py
import os
import django
from channels.routing import get_default_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "WsTest.settings")
django.setup()
application = get_default_application()
# WsServer/consumers.py
from channels.generic.websocket import WebsocketConsumer

class TestConsumer(WebsocketConsumer):
    def receive(self, text_data=None, bytes_data=None):
        self.send(text_data=text_data)
# WsTest/routing.py
from django.conf.urls import url
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from WsServer.consumers import TestConsumer

application = ProtocolTypeRouter({
    "websocket": AuthMiddlewareStack(
        URLRouter([
            url("ws", TestConsumer),
        ])
    )
})
# WsTest/settings.py
# INSTALLED_APPS中添加channels和WsServer
# 添加变量ASGI_APPLICATION = 'WsTest.routing.application'
# 如下所示
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'channels',
    'WsServer',
]

ASGI_APPLICATION = 'WsTest.routing.application'

测试服务

python manage.py runserver 0.0.0.0:8888

如果没有错误,说明服务端运行正常。

在websocket客户端尝试连接,可以使用 http://www.blue-zero.com/WebSocket/ 或自己写一个。

《Django+channels+nginx实现websocket服务端》
《Django+channels+nginx实现websocket服务端》

没有问题。

使用nginx部署

根据channels文档,我们使用daphne来启动服务,然后使用nginx代理。

daphne -b 127.0.0.1 -p 8000 WsTest.asgi:application
# 可以把它做成系统服务

修改nginx配置文件,可以使用ssl实现wss。

server {
    listen      80;
    #listen      443 ssl;
    server_name your.domain;

    # ssl_certificate     /etc/nginx/conf.d/cert/cert.cer;
    # ssl_certificate_key /etc/nginx/conf.d/cert/cert.key;

    location / {
        try_files $uri @app;
    }

    location @app {
        proxy_pass http://127.0.0.1:8000;
        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;
    }
}

重启nginx,测试

使用这种方法可以http服务器和websocket服务器使用一个django,配置好路由即可。

发表评论

电子邮件地址不会被公开。 必填项已用*标注