部署方案:django + uwsgi + daphne + supervsior + nginx + redis
部署思路
- uwsgi 部署 http 服务
- daphne 部署 ws 服务
注意
-
daphne、uwsgi、前端服务可以使用同一个端口。比如graphql对于后端来说就是一个api入口。但是对于drf来讲直接使用不同端口是一个好选择。
-
建议非root用户下
目录
mkdir project
/home/ubuntu/project 项目目录
mkdir {uwsgi,supervisor}
uwsgi uwsgi pid 和 uwsgi 配置文件
supervisor 是所有监控进程的log日志目录
nginx
安装
sudo apt update
sudo apt install nginx
默认安装位置apt-get install
/usr/bin
/usr/lib
/usr/share
/usr/share/man
配置
include 拆分配置文件
# uwsgi 部署
upstream uwsgi {
server ip:8010;
}
upstream daphne {
server ip:8020;
}
server {
# 配置gzip
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 4;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types application/octet-stream model/gltf-binary text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
listen 80;
server_name ip;
root /home/ubuntu/project/nginx/www/dist/;
if ($request_method !~ ^(GET|HEAD|POST|OPTIONS)$ ) {
return 403;
}
index index.html index.htm;
}
# 区分大小写 ~
# daphne服务
location ^~/ws/ {
rewrite ^/ws/(.*) /$1 break;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
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_set_header X-Forwarded-Host $server_name;
proxy_pass http://daphne;
}
# georserver
location ^~/geoserver/ {
proxy_pass http://127.0.0.1:8086/geoserver/;
proxy_set_header Host $host:$server_port;
}
# 前端页面转发
location / {
try_files $uri /index.html;
}
}
server {
# 配置gzip
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 4;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types application/octet-stream model/gltf-binary text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
listen 8080;
server_name _;
if ($request_method !~ ^(GET|HEAD|POST|OPTIONS)$ ) {
return 403;
}
# uwsgi 服务
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass django;
}
}
前端、ws、geoserver访问80
uwsgi 访问8080端口
uwsgi
安装方式使用pip服务使用supervisor监控
pip install uwsgi
配置
[uwsgi]
# 项目地址
chdir = /home/ubuntu/project/my_project
# nginx + uwsgi 部署
socket = :8010
uid = root
gid = root
# wsgi application
module = core.wsgi:application
master = True
# 开启进程和线程*设置
processes = 4
threads = 2
max-requests = 5000
pidfile = /home/ubuntu/project/uwsgi/uwsgi.pid
vacuum = true
enable-threads = true
harakiri = 30
buffer-size = 65536
# supervisor 只能监控前台运行的进程。daemonize 不可使用
supervisor
需要注意 supervisor需要权限启动。
/etc/supervisor/superisord.conf
[unix_http_server]
file=/tmp/supervisor.sock ;UNIX socket 文件,supervisorctl 会使用
;chmod=0700 ;socket文件的mode,默认是0700
;chown=nobody:nogroup ;socket文件的owner,格式:uid:gid
;[inet_http_server] ;HTTP服务器,提供web管理界面
;port=127.0.0.1:9001 ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
;username=user ;登录管理后台的用户名
;password=123 ;登录管理后台的密码
[supervisord]
logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
logfile_backups=10 ;日志文件保留备份数量默认10,设为0表示不备份
loglevel=info ;日志级别,默认info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ;pid 文件
nodaemon=false ;是否在前台启动,默认是false,即以 daemon 的方式启动
minfds=1024 ;可以打开的文件描述符的最小值,默认 1024
minprocs=200 ;可以打开的进程数的最小值,默认 200
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord
;包含其它配置文件
[include]
files = /etc/supervisor/conf.d/*.ini ;这里也就是包含了我们的任务配置
配置
/etc/supervisor/conf.d/config.ini
python 使用 venv 如果没有使用虚拟环境command去掉
[program:daphne]
directory=/home/ubuntu/project/my_project
# 指定daphne位置 启动
command=/home/ubuntu/venv/bin/daphne -b 0.0.0.0 -p 8020 --proxy-headers core.asgi:application
autostart=true
autorestart=true
stdout_logfile=/home/ubuntu/project/supervisor/daphne.log
stderr_logfile=/home/ubuntu/project/supervisor/daphne.error.log
redirect_stderr=true
[program:uwsgi]
directory=/home/ubuntu/project/uwsgi
command=/home/ubuntu/venv/bin/uwsgi --ini uwsgi.ini
autostart=true
autorestart=true
stdout_logfile=/home/ubuntu/project/supervisor/uwsgi.log
stderr_logfile=/home/ubuntu/project/supervisor/uwsgi.error.log
redirect_stderr=true
[program:celery-worker]
directory=/home/ubuntu/project/my_project
command=/home/ubuntu/venv/bin/celery -A async_tasks worker -l WARNING
autostart=true
autorestart=true
stdout_logfile=/home/ubuntu/project/supervisor/celery-worker.log
stderr_logfile=/home/ubuntu/project/supervisor/celery-worker.error.log
redirect_stderr=true
[program:celery-beat]
directory=/home/ubuntu/project/my_project
command=/home/ubuntu/venv/bin/celery -A async_tasks beat -l WARNING
autostart=true
autorestart=true
stdout_logfile=/home/ubuntu/project/supervisor/celery-beat.log
stderr_logfile=/home/ubuntu/project/supervisor/celery-beat.error.log
redirect_stderr=true
[program:redis]
directory=/home/ubuntu/project/my_project
# 指定配置文件
command=/xx/redis-server /xx/redis.conf
autostart=true
autorestart=true
stdout_logfile=/home/ubuntu/project/supervisor/redis.log
stderr_logfile=/home/ubuntu/project/supervisor/redis.error.log
redirect_stderr=true
使用
supervisord -c supervisor.conf 通过配置文件启动supervisor
supervisorctl -c supervisor.conf status 察看supervisor的状态
supervisorctl -c supervisor.conf reload 重新载入 配置文件 更新后可以选择重新载入