非容器部署python项目

时间:2023-02-02 13:59:51

部署方案: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                    重新载入 配置文件  更新后可以选择重新载入