使用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/ 或自己写一个。
没有问题。
使用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,配置好路由即可。
文章评论