记一次开启ssl的django项目部署websocket的火坑


最近有个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)
	...
]

uwsginginx启用完毕后,使用wss://xxx.com/websocket来进行访问

Uwsgi配置

  1. 先执行apt-get install libssl-dev 安装ssl支持库(如果已安装uwsgi,为避免不必要的麻烦,请先卸载(pip/pip3 uninstall uwsgi),因为安装完之后还需要重新安装uwsgi,但是不是线上安装,需要手动安装
  2. 然后到https://github.com/unbit/uwsgi下载整个项目下来,然后在目标python环境中执行python setup.py install命令来安装uwsgi(切记,直接执行pip/pip3 install uwsgi也能安装uwsgi,但是我尝试多次都无法成功启动websocket
  3. 在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
    
  4. 执行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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值