django + supervisor + celery + nginx + redis + uwsgi centos7部署

本文是针对毕业设计展示,小项目部署展示的小型系统,仅供参考。
该项目演示是一个小型工时系统,前端采用了vue-template模板,后端使用django rest framework框架,包含了cache redis的缓存使用,celery的异步定时任务,supervisor的进程统一管理 venv + nginx + uwsgi+supervisor的一整套服务搭建。简单easy。

项目地址----------------
github地址--------------

步骤

  • 安装必要软件包
  • vue 打包 dist目录
  • 部署django
    • 第一 测试django单一启动
    • 第二 使用uwsgi + nginx 启动django
      • 安装配置uwsgi
      • 安装配置nginx
  • celery 配置定时任务异步任务
    • redis 作为中间件存储和结果存储
      • redis
      • celery[redis]
  • 进程管理配置supervisor

安装必要软件包

  • 更新yum源安装软件管理包

    yum update -y
    yum -y groupinstall "Development tools"
    yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel
    
  • 下载python3.8.5 并安装

    cd /usr/local
    wget https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tgz
    tar -zxvf Python-3.8.5.tgz
    cd Python-3.8.5
    # prefix 收集到指定的文件所有配置文件都将在python3下
    ./configure --prefix=/usr/local/python3
    # 编译安装 
    make
    make install
    # 软连接
    ln -s /usr/local/python3/bin/python3.8 /usr/bin/python3
    ln -s /usr/local/python3/bin/pip3.8 /usr/bin/pip3
    
    
  • django 项目上传到服务器
    这里直接使用xftp上传到指定目录下 项目文件目录名为django-admin-work

    mkdir /root/django_admin_work
    mv django-admin-work /root/django_admin_work/django-admin-work
    
  • 安装并创建虚拟环境

    pip3 install virtualenv -i https://pypi.douban.com/simple/
    ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
    # 创建 djvenv 指定python 
    cd /root/django_admin_work/django-admin-work/
    mkdir venv_admin
    cd venv_admin
    virtualenv --python=/usr/bin/python3 djvenv	
    # 开启虚拟环境
    source djvenv/bin/activate
    # 关闭虚拟环境
    deactivate
    

vue 打包 dist目录

将本地生成的打包后的dist文件拷贝到服务器上,使用xftp放到django项目的上一级目录下
/root/django_admin_work/dist

部署django

第一 测试django单一启动

django文件目录放置在/root/django_admin_work/django-admin-work 进入文件夹下安装在本地生成的requirements.txt文件
# 启动刚才建立的虚拟环境
source venv_admin/djvenv/bin/activate
# 安装项目所需要的的python第三方包
pip install -i https://pypi.douban.com/simple -r requirements.txt
# 安装完成后测试
python3 manage.py runserver
# 允许外网访问
python3 manage.py runserver 0.0.0.0:8000

如果访问失败,看端口是否允许,阿里云配置开启端口组。

第二 使用uwsgi + nginx 启动django

安装配置uwsgi

# 安装
pip install -i https://pypi.douban.com/simple uwsgi
uwsgi 配置 使用 xml ini yaml 都可以 本次使用 xml
uwsgi 文档 https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html 
# 在项目的根目录下创建 djuwsgi.xml
touch djuwsgi.xml
# 具体文件内容如下
<uwsgi>
   <socket>127.0.0.1:8899</socket>
   <chdir>/root/django_admin_work/django-admin-work/</chdir>
   <module>WTS.wsgi</module>
   <processes>4</processes>
   <daemonize>djuwsgi.log</daemonize>
</uwsgi>
# 启动uwsgi
uwsgi -x djuwsgi.xml
# 显示 [uWSGI] getting INI configuration from uwsgi.ini 表明uwsgi运行成功
# 通过ps -ef|grep uwsgi   查看确认是否uwsgi启动. ps aux |grep uwsgi
# 停止运行uwsgi,通过包含主进程编号的文件设置停止项目
uwsgi --stop uwsgi.pid
# 重启uwsgi
uwsgi --reload uwsgi.pid
# 找不到pid文件的话 直接杀死进程 kill -9 uwsgi 

安装配置nginx

# root 权限
sudo yum install nginx
# 编辑 etc/nginx.conf 文件
vim /etc/nginx.conf
user root;
events {
    worker_connections 1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    include /etc/nginx/conf.d/*.conf;#主要是这个地方,把新建的两配置文件包含进来
    #server {
    #    listen 80 default_server;
    #    server_name _;
    #    return 404;
    #    }
    }

# 在相应的conf.d 文件夹下编写相应的配置文件 本项目使用django 以及vue 相关nginx配置
# djadmin.conf  vue-admin.conf
vim djadmin.conf

server {
    listen       8001;
    server_name  localhost;
    charset utf-8;
    root /root/django_admin_work/dist/;
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8899;  #端口要和uwsgi里配置的一样           
        uwsgi_param UWSGI_SCRIPT WTS.wsgi;  #wsgi.py所在的目录名+.wsgi           
        uwsgi_param UWSGI_CHDIR /root/django_admin_work/django-admin-work/; #项目路径           
        }
    location /static/ {
        alias /root/django_admin_work/django-admin-work/static/; #静态资源路径       
        }
    }

vi vue-admin.conf

server {
    listen       9001;
    server_name  127.0.0.1;
    charset utf-8;
    location / {
        root /root/django_admin_work/dist/;
        try_files $uri $uri/ /index.html;
        }
    }

配置完成,下面开始启动

nginx
# 重启
nginx -s reload
# 配置nginx 开机自启动 /usr/lib/systemd/system/、/etc/systemd/system/
vi /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target

# 启动关闭
systemctl stop nginx.service
systemctl start nginx.service
# 设置开机自启
systemctl enable nginx.service

外网访问 9001端口即可访问vue页面 访问8001则是api接口
如果发现项目静态文件没有生效, 查看settings文件下是否配置:

STATIC_ROOT  = os.path.join(BASE_DIR, 'static') # 指定样式收集目录
# 在终端输入 收集静态文件
python3 manage.py collectstatic

celery 配置定时任务异步任务

redis 作为中间件存储和结果存储

当然也可以选择rabbitmq,redis 低可靠,实时,高并发,在不讲究确认机制的时候,推荐使用redis
官方比较使用rabbitmq redis

redis

# 下载
wget http://download.redis.io/releases/redis-6.2.1.tar.gz
# 解压
tar -zvxf redis-6.2.1.tar.gz
# 移动
mv redis-6.2.1 /usr/local/redis
# 编译
make
# 安装  PREFIX 收集redis配置文件到指定路径
make PREFIX=/usr/local/redis install
# 1 启动 
cd /usr/local/redis
./bin/redis-server ./redis.conf
# 2 后台进程启动 编辑redis.conf 修改daemon  yes
vim redis.conf 
daemonize yes
# 查看redis是否已经开启
ps aux | grep redis

如果启动过程报错Creating Server TCP listening socket 127.0.0.1:6379: bind
只需启动redis-cli shutdown exit 重启redis即可

# 配置软连接
ln -s /usr/local/redis/bin/redis-server /usr/bin/redis-server  
# 开机自启动
# centos 7以上是用Systemd进行系统初始化的,Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvinit 固有的缺点,提高系统的启动速度。Systemd服务文件以.service结尾,比如现在要建立redis为开机启动,如果用yum install命令安装的,yum命令会自动创建redis.service文件,直接用命令systemcel enable redis.service设置开机启动即可。
# 在系统服务目录里创建redis.service文件
vim /etc/systemd/system/redis.service
[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
PrivateTmp=true

[Install]
WantedBy=multi-user.target
# 启动关闭
systemctl stop redis.service
systemctl start redis.service
# 设置开机自启
systemctl enable redis.service
# 其他命令
  systemctl start redis.service #启动redis服务
  systemctl enable redis.service #设置开机自启动
  systemctl disable redis.service #停止开机自启动
  systemctl status redis.service #查看服务当前状态
  systemctl restart redis.service  #重新启动服务
  systemctl list-units --type=service #查看所有已启动的服务

systemd详解

celery[redis]

官方使用redis详解

# 虚拟环境下安装celery redis 捆绑依赖包
pip install -U "celery[redis]"

项目下配置celery redis

# 在项目的根目录下创建文件celerys
cd /root/django_admin_work/django-admin-work
mkdir celerys
# 配置celery py文件
vim celerys/celery_task.py
# -*- coding: utf-8 -*-
from __future__ import absolute_import  # 拒绝隐式引入
from celery.schedules import crontab

import os

from celery import Celery

PATH_DOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
project_name = os.path.split(os.path.abspath('.'))[-1]
project_settings = '%s.settings' % project_name
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', "WTS.settings")

app = Celery("WTS") 
         
app.config_from_object('django.conf:settings', namespace='CELERY')
         
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
app.conf.timezone = 'Asia/Shanghai'
# 定时任务
app.conf.beat_schedule = { 
    'task-calculation-month-4': { 
        'task': 'celerys.celery_task.task_calculation_time',
        'schedule': crontab(0,0,day_of_month='4'),  # crontab(0, 0, day_of_month='4')  每月的第四天
        'args': () 
    }, 
} 

import logging
import time
from django_redis import get_redis_connection
#from celerys.celery_task import app
#from wtsapp.models import *
logger = logging.getLogger(__name__)

redis_client = get_redis_connection("default")
# todo wql celery 定时任务 异步已完成,下一步使用supervisor进程管理

@app.task(bind=True)
def task_calculation_time(self):
    #Role.objects.create(name="celery_test", status=1)
    try:
        if not redis_client.get("test_"):
            redis_client.set("test_", "wocao", ex=200)
    except Exception as e:
        logger.info("e----",e)
        redis_client.set("error", "ccc", ex=200)
    return 1

1 由于个人操作失误,将项目文件夹名修改为django-admin-work 而不是原本的WTS,而项目已经部署完成,包括一些配置改动较多,导致celery文件查找task任务 找不到,所以我将task 文件内容 放在了celery_task文件内(不推荐使用)
2 项目文件夹名称不一样,找不到task的问题,另一种解决方案 app.autodiscover_tasks(['v1']) 其中v1是项目根目录下的存放有task任务的文件
3 task 文件另一种方式 使用 CELERY_IMPORTS 写死指定的任务文件
#settings.py 文件配置celery

# celery 缓存地址
CELERY_BROKER_URL = "redis://127.0.0.1:6379/9"
CELERY_RESULT_BACKEND = "redis://127.0.0.1:6379/10"
#celery时区设置,使用settings中TIME_ZONE同样的时区
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC=True
# 缓存配置  测试使用
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/0',
        'OPTIONS': {
            'DB':1,
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        },
    },
}

#celery 启动定时任务,异步任务

# 定时任务 将 定时的任务放到 broker内 数组形式 等待worker执行
celery -A celerys.celery_task beat --loglevel=info
# 任务执行
celery -A celerys.celery_task worker --loglevel=info

进程管理配置supervisor

综合以上 基本的这个项目是可以正常访问运行, 但是为了更好的统一管理项目,我们需要用到进程管理工具supervisor

supervisor官方地址

# 可以只在当前虚拟环境下安装supervisor
# pip install supervisor
# python setup.py install     # 我们用来安装下载的python包或者自己按照python官方规范开发的扩展包的常用指令。
yum -y install supervisor
echo_supervisord_conf > /etc/supervisord.conf		# 生成配置文件 

#修改配置文件 supervisord.conf

[unix_http_server]
file=/var/run/supervisor.sock   ; the path to the socket file

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; 修改为 /var/log 目录,避免被系统删除
pidfile=/var/run/supervisord.pid ; 修改为 /var/run 目录,避免被系统删除
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=info                ; log level; default info; others: debug,warn,trace
nodaemon=false               ; start in foreground if true; default false
minfds=1024                  ; min. avail startup file descriptors; default 1024
minprocs=200                 ; min. avail process descriptors;default 200

[supervisorctl]
;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
serverurl=unix:///var/run/supervisor.sock ;  修改为 /var/run 目录,避免被系统删除

[include]
files = /root/django_admin_work/django-admin-work/supervisor.conf

#上述的include files 可以指定相应的文件
#在指定的 files文件内配置当前项目的内容包括 uwsgi(django项目)celery

[group:api]
programs = api_uwsgi, api_beat, api_worker

[program:api_uwsgi]
process_name = %(program_name)s
environment = DJANGO_SETTINGS_MODULE="WTS.settings"
command = /root/django_admin_work/django-admin-work/venv_admin/djvenv/bin/uwsgi -x /root/django_admin_work/django-admin-work/djuwsgi.xml
directory = /root/django_admin_work/django-admin-work
autostart = true
autorestart = true
stopsignal = TERM
redirect_stderr=true
stdout_logfile= /var/log/supervisor/%(program_name)s.log
stdout_logfile_maxbytes = 100MB
stdout_logfile_backups = 10

[program:api_beat]
process_name = %(program_name)s
environment = DJANGO_SETTINGS_MODULE="WTS.settings"
command = /root/django_admin_work/django-admin-work/venv_admin/djvenv/bin/celery -A celerys.celery_task beat --loglevel=info
directory = /root/django_admin_work/django-admin-work
autostart = true
autorestart = true
stopsignal = TERM
redirect_stderr=true
stdout_logfile= /var/log/supervisor/%(program_name)s.log
stdout_logfile_maxbytes = 50MB
stdout_logfile_backups = 5
# supervisor 启动关闭以及相关命令
supervisord -c /etc/supervisord.conf
# 重启
supervisorctl reload
# 关闭全部
supervisorctl stop all
# 开机自启
systemctl enable supervisord
# supervisorctl 相关命令
supervisorctl:进入命令行交互界面,可直接输入子命令进行管理。
supervisorctl reload:重新加载配置文件,并重启supervisord及所有自动启动的程序。
supervisorctl restart all|{PROGRAM < ...>}:重启程序,all表示重启所有程序。
supervisorctl start all|{PROGRAM <...>}:启动程序,all表示启动所有程序。
supervisorctl status <all|{PROGRAM <...>}>:查看程序状态,如为all或不指定则查看所有程序状态。
supervisorctl stop all|{PROGRAM <...>}:停止程序,all表示停止所有程序。
supervisorctl update:重新加载配置文件,并启动新配置指定的程序。

至此结束。

你可能感兴趣的:(Python,部署)