django+nginx+uwsgi+supervisor+daphne+docker deploying websocket

部署方式

  • OS Linux
  • func docker + docker-compose

websocket简介

功能:使用单个TCP连接实现双向通信
实现原理:通过浏览器发出websocket连线请求,然后服务器发出回应,浏览器很服务器只需要做一个握手的动作就可以实现数据的相互传送
好处:1、Header很小;2、服务器的推送,服务器不需要被动的返回数据,可以主动推送数据到浏览器

实现方式

使用nginx代理,uwsgi处理HTTP请求,daphne处理websocket请求,supervisor管理所有得到进程。
注: daphne中的默认端口是8000

配置文件简介

asgi.py

在setting.py的路径下添加asgi.py

import os
from channels.asgi import get_channel_layer
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "projects_name.settings")
channel_layer = get_channel_layer()

nginx.conf

server {
    .....
    location / {
        uwsgi_pass  projects_name;
        include    /etc/nginx/uwsgi_params; 
    }
    location /ws/ {
            proxy_pass http://127.0.0.1:8000/ws/;
            proxy_redirect off;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        }

}

uwsgi.ini

[uwsgi]
chdir           = /usr/src/app 
module          = projects_name.wsgi
master          = true
processes       = 10
socket          = /tmp/projects_name.sock
chmod-socket    = 666
vacuum          = true
enable-threads  = true

supervisord.conf

[program:app-worker]
command =python /usr/src/app/manage.py runworker #其实这里感觉怪怪的,有时候查查是否有更好的解决方法
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log

[program:app-websocket]
command = daphne -b 0.0.0.0 projects_name.asgi:channel_layer
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log

测试方式

wscat -c ws://IP+port/api

在此记录一下方法,如果您有更好的方式请在评论区分享一下,谢谢!

参考网站

http://masnun.rocks/2016/11/02/deploying-django-channels-using-daphne/
http://channels.readthedocs.io/en/latest/deploying.html

你可能感兴趣的:(docker,python,ubuntu)