本文是针对毕业设计展示,小项目部署展示的小型系统,仅供参考。
该项目演示是一个小型工时系统,前端采用了vue-template模板,后端使用django rest framework框架,包含了cache redis的缓存使用,celery的异步定时任务,supervisor的进程统一管理 venv + nginx + uwsgi+supervisor的一整套服务搭建。简单easy。
项目地址----------------
github地址--------------
更新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
将本地生成的打包后的dist文件拷贝到服务器上,使用xftp放到django项目的上一级目录下
/root/django_admin_work/dist
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
如果访问失败,看端口是否允许,阿里云配置开启端口组。
# 安装
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
# 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
当然也可以选择rabbitmq,redis 低可靠,实时,高并发,在不讲究确认机制的时候,推荐使用redis
官方比较使用rabbitmq 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详解
官方使用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
# 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:重新加载配置文件,并启动新配置指定的程序。
至此结束。