软工大作业的服务器实现了一个自动聊天机器人的功能,经过测试在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的扩展。
对于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服务器(详情可以见我之前的这篇博客)
这里主要是asgi.py
和routing.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
的环境变量
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对应的端口的请求
Daphne是一个http、http2和websocket协议服务器,用ASGI和ASGI-HTTP, 为Django频道开发
具体指令如下:
daphne -b 127.0.0.1 -p 8088 --proxy-headers buaase.asgi:application
代表在127.0.0.1:8088的端口创建了一个asgi服务器,可以响应转发到这个端口上的所有websocket请求
注意:这个指令要在asgi.py的父目录执行
以上,我的websocket便可以正常的进行转发给我的Django应用了,开发告一段落。
感谢MaxSeason同学对本篇博客的贡献!