最近有个django的后端项目,因为需要实时上传视频播放进度,综合考虑使用websocket来实现,某度、某歌里面找了一天的资料都发现坑越踩越大,最后参考了这篇文章才解决了 https://www.cnblogs.com/mangmangbiluo/p/10931062.html
uwsgi websocket官方文档
其他文章也有参考,但是因为关闭了那些页面,就不一一引出了,某度、某歌随便一搜,都能出来一堆参考文章
注意
视图文件view.py
里面需要使用uwsgi的websocket来实现websocket功能,因为uwsgi2.0以后有了自己的websocket(这个说法是某度里面的资料说的,咱也不知道),如果需要本地调试的,建议系统不要选择Windows的,因为uwsgi不支持windows操作系统,也就是说根本无法调试
废话不多说,直接上干货
生产环境
ubuntu 18.04.4 LTS
python 3.6.9
uwsgi 2.0.18
django 2.1.3
nginx 1.14.0
Django配置
在项目的 settings.py
中加入
WEBSOCKET_FACTORY_CLASS = 'dwebsocket.backends.uwsgi.factory.uWsgiWebSocketFactory'
view.py
def web_socket():
import uwsgi
uwsgi.websocket_handshake()# 与客户端建立链接
while True:
msg = uwsgi.websocket_recv()# 线程阻塞
message = json.loads(msg.decode())# 解析json文本
uwsgi.websocket_send(json.dumps({'code':0,'msg':'欢迎使用本后台'}))# 返回json文本
url.py
urlpatterns = [
...
path('websocket', view.web_socket)
...
]
待 uwsgi
和nginx
启用完毕后,使用wss://xxx.com/websocket
来进行访问
Uwsgi配置
- 先执行
apt-get install libssl-dev
安装ssl支持库(如果已安装uwsgi,为避免不必要的麻烦,请先卸载(pip/pip3 uninstall uwsgi
),因为安装完之后还需要重新安装uwsgi,但是不是线上安装,需要手动安装 - 然后到https://github.com/unbit/uwsgi下载整个项目下来,然后在目标python环境中执行
python setup.py install
命令来安装uwsgi(切记,直接执行pip/pip3 install uwsgi
也能安装uwsgi,但是我尝试多次都无法成功启动websocket) - 在Django项目的manage.py 的同级目录下新建一个uwsgi.ini文件,写入以下代码(请根据自己的实际情况改对应的配置),重点是最后三行:
[uwsgi] #使用nginx连接时使用 socket=127.0.0.1:9000 #直接做web服务器使用 #http=127.0.0.1:8080 # 启动主进程 master=True # 进程管理文件 pidfile=uwsgi/uwsgi.pid processes=8 threads=4 stats=uwsgi/uwsgi.socket #项目目录 chdir=xxx/djangoProjectPath #项目中wsgi.py文件的目录,相对于项目目录 wsgi-file=xxx/wsgi.py # 设置日志目录 daemonize=uwsgi/uwsgi.log # 设置缓存 buffer-size=65535 # 当服务器退出的时候自动删除unix socket 文件和pid 文件 vacuum = false # 加载项目配置(django + websocket时需要配置的信息) DJANGO_SETTINGS_MODULE=LanguageLearning.settings WEBSOCKET_FACTORY_CLASS="dwebsocket.backends.uwsgi.factory.uWsgiWebSocketFactory" http-websockets=true
- 执行
uwsgi -ini uwsgi.ini
开启uwsgi
Nginx配置
关键代码
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
nginx 文件
http {
...
server {
listen 80;
server_name www.xxx.com;
# 将http强制转https
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
...
相关证书和加密方式请自行寻找和设置
...
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass 127.0.0.1:9000;
uwsgi_read_timeout 3600;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
...
}
...
}
执行service nginx start
开启nginx