技术标签: celery-worker channels + asgi Django celery-beat uwsgi supervisor
服务器为centos7
yum install supervisor
友情提示:如果安装失败按照以下三步走,然后再次安装
第一步:直接更换镜像源,别看网上那些没用的(如果你想重蹈覆辙的话)
第二步:安装EPEL源
yum -y install epel-release
第三步:更新yum源
yum --skip-broken update
yum clean all
yum -y upgrade
如果你上一步安装没有问题,那就跳过该步骤
cd /etc/yum.repos.d/
mv CentOS-Base.repo CentOS-Base.repo_back
wget http://mirrors.aliyun.com/repo/Centos-7.repo
mv Centos-7.repo CentOS-Base.repo
yum --skip-broken update
yum clean all
yum -y upgrade
yum makecache
vi /etc/supervisord.conf
; Sample supervisor config file.
[unix_http_server] # socket通讯相关配置
...
;[inet_http_server] # Web Server配置,如果想使用web界面管理的话,可以去掉前面的;号。port写你服务器的ip,端口可以改称自己喜欢的,默认9001, 建议打开用户名密码验证, 生产环境不建议打开web界面管理。
...
[supervisord] # 服务端程序
...
[rpcinterface:supervisor] # 这个选项是给XML_RPC用的,当然你如果想使用supervisord或者web server 这个选项必须要开启的
...
[supervisorctl] # client端程序
...
;[program:theprogramname] # 要管理的子进程
...
;[eventlistener:theeventlistenername] # 和program的地位是一样的,也是suopervisor启动的子进程,不过它干的活是订阅supervisord发送的event。他的名字就叫listener了。我们可以在listener里面做一系列处理,比如报警等等
...
;[group:thegroupname] # 给programs分组,划分到组里面的program。我们就不用一个一个去操作了我们可以对组名进行统一的操作。 注意:program被划分到组里面之后,就相当于原来的配置从supervisor的配置文件里消失了。。。supervisor只会对组进行管理,而不再会对组里面的单个program进行管理了
;programs=progname1,progname2 # 组成员,用逗号分开
;priority=999 # 优先级,相对于组和组之间说的
...
[include]
files = supervisord.d/*.ini
include
,此处告诉我们,手动创建的环境管理配置文件应该放在/etc/supervisord.d
目录下,并且文件名必须以.ini
结尾。最好一个服务启动命令新建一个配置文件
django
服务启动配置vi /etc/supervisord.d/django.ini
[program:django]
; 使用daphne启动
; command=/usr/local/python3/bin/daphne -b 0.0.0.0 -p 8888 ECloudBM.asgi:application
; 不使用daphne启动
command=/root/.pyenv/versions/qingyun/bin/python3 manage.py runserver 0.0.0.0:8888
; 项目路径
directory=/root/projects/ECloud-BM
; 启动优先级(越小越优先)
priority=9999
; 启动 5 秒后没有异常退出,就当作已经正常启动了
startsecs = 5
; 程序异常退出后自动重启
autorestart = true
; 启动失败自动重试次数,默认是 3
startretries = 3
; 标准输出日志
stdout_logfile = /var/log/supervisor.log
supervisord -c /etc/supervisord.conf
或者
systemctl status supervisord.service
supervisorctl status django
supervisorctl stop django
supervisorctl start django
supervisorctl restart django
celery-worker
异步任务启动配置文件vi /etc/supervisord.d/celery_worker.ini
[program:celery_worker]
; 启动项目时运行的命令
command=/root/.pyenv/versions/qingyun/bin/celery -A ECloudBM worker -l info
; 项目绝对路径
directory=/root/projects/Ecloud-BM
; 是否自动启动
autostart=true
; 程序意外退出是否自动重启
autorestart=true
; 自动重启间隔
startsecs=10
; 杀进程的信号
stopsignal=QUIT
; 向进程发出stopsignal后等待OS向supervisord返回SIGCHILD 的时间。若超时则supervisord将使用SIGKILL杀进程
stopwaitsecs=60
; 子进程的stdout的日志路径 输出日志文件
stdout_logfile= /var/log/supervisor/celery_worker.log
; 错误日志文件 当redirect_stderr=true。这个就不用
stderr_logfile= /var/log/supervisor/celery_worker_error.log
; 优先级
priority=1000
celery-beat
定时任务启动配置文件vi /etc/supervisord.d/celery_beat.ini
[program:celery_beat]
; 启动项目时运行的命令
command=/root/.pyenv/versions/qingyun/bin/celery -A ECloudBM beat -l info
; 项目绝对路径
directory=/root/projects/Ecloud-BM
; 是否自动启动
autostart=true
; 程序意外退出是否自动重启
autorestart=true
; 自动重启间隔
startsecs=10
; 杀进程的信号
stopsignal=QUIT
; 向进程发出stopsignal后等待OS向supervisord返回SIGCHILD 的时间。若超时则supervisord将使用SIGKILL杀进程
stopwaitsecs=60
; 子进程的stdout的日志路径 输出日志文件
stdout_logfile= /var/log/supervisor/celery_beat.log
; 错误日志文件 当redirect_stderr=true。这个就不用
stderr_logfile= /var/log/supervisor/celery_beat_error.log
; 优先级
priority=1001
celery-flower
启动配置文件(用于查看异步任务资源占用率以及执行情况)[program:flower]
; 启动命令
command=/root/.pyenv/versions/qingyun/bin/flower -A ECloudBM --address=10.10.8.179 --port=5555 --basic_auth=admin:password@
; 项目目录
directory=/root/projects/Ecloud-BM
; 启动优先级
priority=1002 ; the relative start priority (default 999)
; 启动 5 秒后没有异常退出,就当作已经正常启动了
startsecs = 5
; 程序异常退出后自动重启
autorestart = true
; 启动失败自动重试次数,默认是 3
startretries = 3
; 错误日志
stdout_logfile = /var/log/supervisor/celery_flower.log
; 标准输出日志
stderr_logfile= /var/log/supervisor/celery_flower_error.log
uwsgi
启动配置文件(后面结合nginx进行并发处理,注意,此处如果使用uwsgi启动django项目,则去掉django.ini这个启动配置)uwsgi.ini
(建议放在项目根目录下,与manage.py同级别),内容如下:[uwsgi]
; 使用nginx连接时使用
; socket = 10.10.8.179:10000
; 直接做web服务器使用,指定要监听的ip和端口号,即我们运行项目时的ip和端口
http = 10.10.8.179:9000
; 项目目录
chdir = /root/projects/Ecloud-BM
; 项目中的wsgi.py文件的目录,相对于项目目 = Ecloud-BM.wsgi
module = ECloudBM.wsgi:application
; 静态文件映射,测试uwsgi配置时为了能够访问到静态资源,所以加上这个配置。在使用nginx时,需要注销掉这个配置,改用nginx来代理静态资源访问
; 可使用 python manage.py collectstatic
static-map=/static=/root/projects/Ecloud-BM/static
; 指定启动的工作进程数
processes = 4
; 指定每个进程中的线程数
threads = 2
; 指定在工作进程中存在一个主进程
master = True
; 服务停止时自动移除unix Socket和pid文件
vacuum = True
; 保存启动之后主进程的进程号
pidfile = uwsgi.pid
; 设置uwsgi后台运行,运行信息保存在uwsgi.log(使用supervisor托管时此处一定要注释调)
; daemonize = uwsgi.log
; 单个日志的大小
buffer-size=32768
; 设置每个工作进程处理请求的上限,达到上限时,将回收(重启)该进程。可以预防内存泄漏
max-requests=5000
; 虚拟环境所在目录
home=/root/.pyenv/versions/qingyun/
PYTHONHOME = /root/.pyenv/versions/qingyun/bin/
uwsgi
服务,内容如下:[program:uwsgi]
; 启动项目时运行的命令
command=/root/.pyenv/versions/qingyun/bin/uwsgi uwsgi.ini
; 项目绝对路径
directory=/root/projects/Ecloud-BM
; 是否自动启动
autostart=true
; 程序意外退出是否自动重启
autorestart=true
; 自动重启间隔
startsecs=10
; 杀进程的信号
stopsignal=QUIT
; 向进程发出stopsignal后等待OS向supervisord返回SIGCHILD 的时间。若超时则supervisord将使用SIGKILL杀进程
stopwaitsecs=60
; 子进程的stdout的日志路径 输出日志文件
stdout_logfile= /var/log/supervisor/uwsgi.log
; 错误日志文件 当redirect_stderr=true。这个就不用
stderr_logfile= /var/log/supervisor/uwsgi_error.log
; 优先级
priority=1003
asgi
启动配置文件(用于channels通信)/run/daphne
该路径不存在则需要手动创建[program:asgi]
; channels通信地址
socket=tcp://10.10.8.179:8889
; 项目目录
directory=/root/projects/Ecloud-BM/EcloudBM
; 启动命令(我使用此命令启动报错,网上也没找到解决办法,如果你也一样,可以使用下面命令启动)
command=/root/.pyenv/versions/qingyun/bin/daphne -u /run/daphne/daphne%(process_num)d.sock --fd 0 --access-log - --proxy-headers ECloudBM.asgi:application
; command=/root/.pyenv/versions/qingyun/bin/daphne -b 10.10.8.179 -p 8889 --proxy-headers ECloudBM.asgi:application
; 进程数
numprocs=4
; 进程名
process_name=asgi%(process_num)d
; 自动启动
autostart=true
; 自动重启
autorestart=true
; 错误日志
stdout_logfile=/var/log/supervisor/asgi.log
; 标准输出日志
stderr_logfile=/var/log/supervisor/asgi_error.log
; 日志保存上限
stdout_logfile_maxbytes = 20MB
(qingyun) [[email protected] supervisord.d]# supervisorctl status
asgi:asgi0 STARTING
asgi:asgi1 STARTING
asgi:asgi2 STARTING
asgi:asgi3 STARTING
celery_beat STARTING
celery_worker STARTING
flower STARTING
uwsgi STARTING
supervisor>
supervisorctl
管理命令报以下错误:(qingyun) [[email protected] ~]# supervisorctl
unix:///var/run/supervisor/supervisor.sock no such file
(qingyun) [[email protected] Ecloud-BM]# supervisorctl
asgi:asgi0 RUNNING pid 21529, uptime 0:00:01
asgi:asgi1 STARTING
asgi:asgi2 RUNNING pid 21492, uptime 0:00:03
asgi:asgi3 RUNNING pid 21505, uptime 0:00:01
celery_beat RUNNING pid 12319, uptime 0:28:09
celery_worker RUNNING pid 12334, uptime 0:28:07
flower RUNNING pid 25468, uptime 1:23:50
uwsgi RUNNING pid 25469, uptime 1:23:50
supervisor>
supervisor>
supervisor> help
default commands (type help <topic>):
=====================================
add exit open reload restart start tail
avail fg pid remove shutdown status update
clear maintail quit reread signal stop version
supervisor>
supervisor> help tail # 查看命令使用方式
tail [-f] <name> [stdout|stderr] (default stdout)
Ex:
tail -f <name> Continuous tail of named process stdout
Ctrl-C to exit.
tail -100 <name> last 100 *bytes* of process stdout
tail <name> stderr last 1600 *bytes* of process stderr
supervisor>
supervisor>
supervisor> tail -200 django stderr
Listen failure: Couldn't listen on 0.0.0.0:8888: [Errno 98] Address already in use.
supervisor>
supervisor> stop all
asgi:asgi1: stopped
asgi:asgi0: stopped
asgi:asgi3: stopped
celery_beat: stopped
asgi:asgi2: stopped
uwsgi: stopped
celery_worker: stopped
flower: stopped
supervisor>
supervisor> start all
asgi:asgi1: started
asgi:asgi0: started
asgi:asgi3: started
asgi:asgi2: started
flower: started
celery_worker: started
celery_beat: started
uwsgi: started
supervisor>
supervisor> status
asgi:asgi0 STARTING
asgi:asgi1 RUNNING pid 25414, uptime 0:00:03
asgi:asgi2 RUNNING pid 25417, uptime 0:00:02
asgi:asgi3 RUNNING pid 25416, uptime 0:00:02
celery_beat RUNNING pid 21789, uptime 0:12:03
celery_worker RUNNING pid 21788, uptime 0:12:03
flower RUNNING pid 21790, uptime 0:12:03
uwsgi RUNNING pid 21791, uptime 0:12:03
supervisor>
supervisor> quit
vi /etc/supervisord.conf
[inet_http_server] ; inet (TCP) server disabled by default
port=10.10.8.179:9001 ; ip(你服务器的ip地址) + 端口号(根据你的爱好指定)
username=user ; web端登录用户名
password=password ; web端登录密码
supervisorctl reload
vi /lib/systemd/system/supervisord.service
ExecStop=/usr/bin/supervisord shutdown
ExecReload=/usr/bin/supervisord reload
killMode=process
Restart=on-failure
RestartSec=42s
systemctl enable supervisord
项目结构
frontend目录(需要自己创建名称随意,也可以不放在项目内)将前端vue打包生成的dist直接拷贝进来就(nginx配置时写绝对路径到该dist目录)
将settings.py配置文件DEBUG改为False
yum install nginx
# 这是nginx原生配置文件所包含配置信息的目录(它建议将项目配置文件放在此处,而不是在原生配置文件上进行改动)
cd /etc/nginx/conf.d/
# 文件名随意, 但必须以.conf结尾
vi xxx.conf
upstream qingyun {
server 10.10.8.179:10000; # 与uwsgi服务端口保持一致
}
upstream channels-backend {
server 10.10.8.179:8889; # 与asgi服务端口保持一致
}
# 将80端口转发到vue,然后请求接口以api|base|vserver|setup开头则转发到10000端口的uwsgi服务上,将请求接口以ws开头的websocket连接转发到asgi服务上
server {
listen 80;
server_name 10.10.8.179; # 你的访问地址, 有域名的话直接写域名
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-real-ip $remote_addr;
location / {
try_files $uri $uri/ /index.html; # 此处是重点(指向dist目录下的index.html),如果不配置会自动转发到nginx默认主页
root /root/projects/Ecloud-BM/frontend/dist; # 这是前端静态文件目录路径
}
location ~(api|base|vserver|setup)/ {
# 此处则是前台项目转发给后端的请求接口(即你的项目url可能的开头,以此来进行匹配)
uwsgi_pass qingyun; # uwsgi(通用网关接口)转发django请求
include /etc/nginx/uwsgi_params;
}
location ~(ws)/ {
# # 此处则是前台项目转发给后端websocket的请求接口(routing可能的开头,以此来进行匹配)
try_files $uri @proxy_to_app; # channels通信转发,需要用到asgi(异步网关协议接口)
}
location @proxy_to_app {
proxy_pass http://channels-backend;
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;
}
}
说明:
项目总urls.py示例如下(可能的开头有 base vserver api setup)
对应配置如下:
location ~(api|base|vserver|setup)/ {
...
}
项目总routing.py示例如下(可能的开头有 ws)
对应配置如下:
location ~(ws)/ {
...
}
1.在系统服务目录里创建nginx.service文件
vi /usr/lib/systemd/system/nginx.service
2.在 [Service] 下加入以下内容
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/usr/sbin/nginx -s quit
3.设置开机自启动
systemctl enable nginx.service
可能性一:
解决:
cd /etc/nginx/ # 进入nginx目录
vim nginx.conf # 编辑nginx.conf
将user xxxx; 修改为 user root;
# 命令重新加载配置
nginx -s reload
可能性二:
查看SELinux状态:
1、/usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态
SELinux status: enabled
2、getenforce ##也可以用这个命令检查
关闭SELinux:
1、临时关闭(不用重启机器):
setenforce 0 ##设置SELinux 成为permissive模式
##setenforce 1 设置SELinux 成为enforcing模式
2、修改配置文件需要重启机器:
修改/etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled
重启机器即可
# location没有写index index.html index.htm;导致项目无法实现重定向
location / {
...
index index.html index.htm;
}
# 命令重新加载配置
nginx -s reload
电脑入门基本操作知识要想学会电脑就别怕弄坏它,只管上机实验,出问题了大不了重装系统一遍。下面是电脑基本操作知识,学会了就去捣鼓一番吧!1、电脑的组成:软件,硬件,外部设备.硬件就是大家所看见的主机,由主板,CPU,内存条,硬盘,板卡等组成,打开机箱盖即可看见,外部设备包括键盘,鼠标,光驱,软驱,显示器,打印机,扫描仪,摄像头等等设备.2、软件分为系统软件,应用软件,系统软件就是win xp win...
一、透明代理概述根据百度百科的资料:透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改变你的 request fields(报文),并会传送真实IP,多用于路由器的NAT转发中。透明代理技术中的透明是指客户端感觉不到代理的存在,不需要在浏览器中设置任何代理,客户只需要设置缺省网关,客户的访问外部网络的数据包被发送到缺省网关,而这时缺省网关运行着一个代理服务器,数据实际上被被重定向到代理服务器的代理端口(如8080),即由本地代理服务器向外请求所需数据然后拷贝给客户端。理论上透明代理可以对任何协
为了保护广大的Microsoft 365用户的安全,Azure AD在某些情况下会启用安全默认值,就是要求所有的账号都启用MFA。MFA的全称是 Multi-factor Authenti...
第一步:进入微信小程序项目目录下,输入cmd 第二步:加载插件包第三步:加载成功之后,会参生这个文件夹 第四步:然后在对应的js文件中引入miniprogram-sm-crypto/index.js 第五步: 加密方式,加密方法
前因其实我们这个7人iOS开发团队并不适合组件化开发。原因是因为性价比低,需要花很多时间和经历去做这件事,带来的收益并不能彻底改变什么。但是因为有2~3个星期的空档期,并不是很忙;另外是可以用在一个全新的App上。所以决定想尝试下组件化开发。所谓尝试也就是说:去尝试解决组件化开发当中的一些问题。如果能解决,并且有比较好的解决方案,那就继续下去,否则就放弃。背景脱离实
turtle库是一个非常有意思的东西,可以做一些画,安装也非常好安装,只需要在电脑中的ide中输入pip install turtle(这是Python2.0版本的安装)python3中输入pip3 install turtle ,有人或许会问在3.0版本中输入pip install turtle会怎么样,系统会用英文提示你升级,有兴趣的朋友可以试一下,下面就是奥运五环的效果:环与环之间有点...
上个月写了一篇使用像素shader返回累加信息的Trick:https://www.cnblogs.com/hont/p/9977401.html后来无意中发现DX11/Compute shader有一类Append/Consume数据格式更适合这类操作。c sharp脚本:using System.Collections;using System.Collections...
1、 wpa_supplicant介绍supplicant是恳求者的意思,是wpa的发起者,是发送认证请求的设备(手机),手机——AP——认证服务器,可用于上述4种"认证/加密"2、wpa_supplicant应用程序的编译与使用(阅读README文件)(1) 先编译它的依赖libopenssltar xzf openssl-1.0.1d.tar.gzcd o
在用matplotlib保存图片时,发现不能直接保存为emf格式。百度有人说要先另存为svg格式,再使用INKSCAPE软件转换成emf格式。我试了一下,发现还是不行,后来,发现先用matplotlib存为svg格式,再用visio另存为emf是可以的。matplotlib支持的图片存储格式:eps, jpeg, jpg, pdf, pgf, png, ps, raw, r...
centos 安装oracle 11g r2(三)-----表空间创建创建表空间前要保证监听与数据库实例已经启动1、启动监听[[email protected] ~]$ lsnrctl startLSNRCTL for Linux: Version 11.2.0.1.0 - Production on 01-DEC-2017 09:25:48Copyright (c) 1991, 2009, Ora...
腾讯云Centos7搭建gitlab服务与smtp邮件服务配置(亲测可用)首先服务器的搭建就不多说了,腾讯开发实验室讲的很详细:https://cloud.tencent.com/developer/labs/lab/10288服务器搭好讲下smtp服务器的配置,这里我使用的是163的邮箱:1.配置SMTP服务: nano /opt/gitlab/etc/gitlab.rbctr...
立方体类Box的实现,完成计算体积、计算表面积、输出结果等功能。其中给定的主函数为:int main( ){float ab;cin>>ab;Box obj;obj.seta( ab );obj.getvolume( );obj.getarea( );obj.disp( );return 0;}输入格式:立方体的边长,可以是float类型的数据。输出格式:...