Nginx+Django实现Websocket功能

Nginx+Django实现Websocket功能

1 前言

软工大作业的服务器实现了一个自动聊天机器人的功能,经过测试在Django自带服务器中没有问题,但是在部署到Nginx后,出现了Nginx不能成功转发的问题。

经过调研后,发现是之前一直使用位于8080端口的uwsgi服务器接收从nginx监听的80端口发送来的请求,而对于websocket请求,应当使用asgi服务器来处理,因此使用uwsgi无法正常的处理websocket请求,从而出现错误。

对于wsgi和asgi,可以简单的介绍:

  • WSGI,全称Web服务器网关接口(Python Web Server Gateway Interface, WSGI),是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。

    WSGI是基于http协议模式开发的,不支持websocket

  • ASGI,是异步网关协议接口,解决了python中的WSGI不支持当前的web开发中的一些新的协议标准,同时ASGI支持原有模式和websocket的扩展,即ASGI是WSGI的扩展。

2 Nginx配置

对于Nginx,我们主要修改nginx.conf文件:

server {
  listen       80;
  server_name  localhost;

  location /talk_message/ {
    proxy_pass 'http://127.0.0.1:8088';
    proxy_http_version    1.1;
    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_read_timeout    120s;
    proxy_set_header      Upgrade           $http_upgrade;
    proxy_set_header      Connection        $connection_upgrade;
  }


  location / {
    include  uwsgi_params;
    uwsgi_pass  127.0.0.1:8080;
  }

我们监听80端口,对于websocket相关请求,我们转发至8088端口的asgi服务器

而对于其他请求,我们转发至8080端口的uwsgi服务器(详情可以见我之前的这篇博客

3 Django配置

这里主要是asgi.pyrouting.py两个文件:

3.1 asgi.py
"""
ASGI config for buaase project.

It exposes the ASGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/
"""

import os

import django
from channels.routing import get_default_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'buaase.settings')

django.setup()

application = get_default_application()

注意配置DJANGO_SETTINGS_MODULE的环境变量

3.2 routing.py
from channels.routing import ProtocolTypeRouter, URLRouter
from ars.talk_message.socket_url import websocket_url

application = ProtocolTypeRouter({
    "websocket": URLRouter(websocket_url)
})

创建一个application,这里的websocket_url是我们代码具体实现中的url

完成上面两步的配置后,Django相关的内容就完成了,这里主要创建了一个asgi的应用,用于响应转发给该asgi对应的端口的请求

4 Daphne配置

4.1 Daphne介绍

Daphne是一个http、http2和websocket协议服务器,用ASGIASGI-HTTP, 为Django频道开发

4.2 Daphne命令

具体指令如下:

daphne -b 127.0.0.1 -p 8088 --proxy-headers buaase.asgi:application

代表在127.0.0.1:8088的端口创建了一个asgi服务器,可以响应转发到这个端口上的所有websocket请求

注意:这个指令要在asgi.py的父目录执行

5 总结

以上,我的websocket便可以正常的进行转发给我的Django应用了,开发告一段落。

下面是我对这一套机制的总结:
在这里插入图片描述

感谢MaxSeason同学对本篇博客的贡献!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值