问题汇总
由于centos7到现在好像挺老了。有些东西真的逆天。
本次采取的项目为django后端项目
采用的是开源的django博客系统
代码仓库:https://github.com/liangliangyy/DjangoBlog.git
使用poetry作为包管理工具。
uwsgi + nginx进行部署
supervisor作为进程管理工具
采取动静分离的nginx代理设计。
遇到的问题
python3.6装不了coverage==7.3.2
源代码换python3.9进行重新安装部署。
中间出的问题是,poetry卸掉了python3.6配置文件没卸载。
–使用yum安装回python3.6,先通过pip3把poetry卸了。再装新的环境的包。
poetry下包巨慢
–换源:poetry source add tsinghua https://pypi.tuna.tsinghua.edu.cn/simple
注意这个好像3.6下的poetry不支持。也问题不大,找教程就行。
mysqlclient包安不上
好家伙包这个错:
Exception: Can not find valid pkg-config name.
Specify MYSQLCLIENT_CFLAGS and MYSQLCLIENT_LDFLAGS env vars manually
[end of output]
–解决方法
试着用yum安装pkg-config。找不到包和其他问题话。总结配置环境变量
# 找到 mysql_config 文件的路径
[root@localhost Backend]# which mysql_config
/usr/local/mysql8/bin/mysql_config
# 配置MYSQLCLIENT_CFLAGS 和 MYSQLCLIENT_LDFLAGS 环境变量,将 mysql_config 的路径传递给它们
[root@localhost Backend]# export MYSQLCLIENT_CFLAGS=$(mysql_config --cflags)
[root@localhost Backend]# export MYSQLCLIENT_LDFLAGS=$(mysql_config --libs)
# 再安装就行了
结果搞了这么久,yum装不了mysql,centos7装的mariadb
也可以安装高版本mariadb,参考文章:https://www.cnblogs.com/pyyu/p/9467289.html,按照配置仓库,安装的要求就行,巨详细。
没办法,源码安装mysql-8,可以参考文章:https://www.cnblogs.com/zhourx/p/17558946.html
uwsgi.ini配置问题
重要配置
chdir:一定是项目根目录,也就是uwsgi.ini的位置
module:这个必须得是根目录开始,找到wsgi的目录application
wsgi-file:和module基本一致,就是去找wsgi.py
home: 虚拟环境路径
通信方式:socket/http。内部通信使用socket,比如说和nginx通信;外部通信使用http,可以直接展示与页面
[uwsgi]
project=djangoblog
# uid=www-data
# gid=www-data
base=/root/DjangoBlog
chdir = %(base)
# 项目application路径,也就是django的wsgi.py路径
module = %(project)/wsgi:application
wsgi-file = %(project)/wsgi.py
# 虚拟环境路径
home = /root/.cache/pypoetry/virtualenvs/djangoblog-h-y_BC25-py3.9
# chown-socket =%(uid):www-data
# chmod-socket =664
# 使用http协议与nginx通信
# 监听在端口号8888上
# http =0.0.0.0:8000
# 使用socket和nginx通信,不暴露http
socket =0.0.0.0:8888
# 服务器的缓冲区大小设置为64KB(65536字节)
buffer-size =65536
# 用于存储当前运行的进程ID,以便在需要时可以重新启动或停止该进程
pidfile =/tmp/%(project)-master.pid
# 启用了自动清理功能
vacuum =True
# 每个进程允许处理的最大请求数为5000次
max-requests =5000
# 日志文件
# daemonize =/tmp/%(project)-uwsgi.log
# 生成一个监听的文件,
# touch .touchforlogrotat 相当于修改了创建时间,系统会重新reload日志
# touch-logreopen =/tmp/.touchforlogrotat
#设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
harakiri=60
#当一个请求被harakiri杀掉会,会输出一条日志
harakiri-verbose=true
master = True
# worker数,多个worker则多进程
processes = 4
#开启内存使用情况报告
memory-report = true
#设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
reload-mercy = 10
#设置工作进程使用虚拟内存超过N MB就回收重启
reload-on-as= 1024
# uwsgi热加载
py-autoreload=1
# uwsgi后台运行
daemonize = yes
nginx做动静分离时。
因为django静态文件的问题,得把静态文件搞出来:设置setting的三个主要参数
STATIC_ROOT='/opt/nginx1-12/static'
STATIC_URL = '/static/'
STATICFILES_DIRS=[
os.path.join(BASE_DIR,"static"),
]
接下来做静态文件的收集(收集于STATIC_ROOT路径当中)和nginx配置
# 收集静态文件
python3 manage.py collectstatic
# 记得记录收集的文件根目录文件以配置nginx
# 配置nginx虚拟主机(server)加个location,来标记static别名位置,可以直接通过nginx拿静态文件而不走django
location /static {
alias /opt/djangostatic/collectedstatic;
}
完成之后,按道理是正常启动,可是,还有一点bug
拿静态文件还是拿不到,报403.
显然权限问题,把收集的静态文件权限给nginx,或者直接打开就是
chmod 777 /opt/djangostatic/collectedstatic
首页刷新出现404,这个好像常发生在vue项目当中
在nginx的location当中添加参数
try_files $url $url/ /index.html
supervisor进程管理工具
管理进程组开关,并且把配置文件多的命令搞成一个项目,已控制启动和关闭。
pip安装或者yum安装和简单配置
# pip安装
pip3 install supervisor
# yum安装
yum install python-setuptools
easy_install supervisor
# 拿配置文件(将配置文件生成在哪)
echo_supervisord_conf > /etc/supervisord.conf
# 书写uwsgi的配置(记得用which拿命令绝对路径)
# 在配置文件最后加上
[program:my]
command=/opt/venv/bin/uwsgi --ini /etc/uwsgi_nginx.ini ;需执行命令
stopasgroup=true ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=true ;默认为false,向进程组发送kill信号,包括子进程
配置文件详解
# supervisord.conf配置文件参数解释
[program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程序启动命令
autostart=true ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3 ; 启动失败自动重试次数,默认是3
user=tomcat ; 用哪个用户启动进程,默认是root
priority=999 ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程
运行常用命令
# 带着配置文件启动
supervisord -c /etc/supervisord.conf
# 查找配置文件更新
supervisorctl reread
# 更新配置文件
supervisorctl update
# 进入supervisor管理页面
supervisorctl
# 启动重启停止
start/restart/stop program1
# 停止所有项目
stop all
# 查看某项目状态
status program1
# 退出
exit