斑马斑马-08-白云之上-python在Linux上的部署
Posted 逍遥小天狼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了斑马斑马-08-白云之上-python在Linux上的部署相关的知识,希望对你有一定的参考价值。
部署说明
- 系统:CentOS Linux release 8.1.1911 (Core) 【linux查看命令:cat /etc/redhat-release】
-
python:python3.6
- django:
- mysql:Ver 14.14 Distrib 5.7.24,
- Nginx:nginx-1.17.9
- uwsgi:
一、Nginx安装(有坑)与卸载
下载nginx与安装
1、下载:
$ wget http://nginx.org/download/nginx-1.17.9.tar.gz -P /usr/src
2、解压:
$ cd /usr/src
$ tar xvf nginx-1.17.9.tar.gz
$ cd nginx-1.17.9
3、安装前的准备
# nginx是c写的
$ yum -y install gcc
# url重写用到的包
$ yum -y install pcre-devel
# 解压缩用到的包
$ yum -y install zlib zlib-devel
4、配置安装环境
$ ./configure --prefix=/usr/local/nginx
5、编译源码生成可执行程序 依赖gcc
$ make -j4
6、 安装程序
$ make install
7、 启动nginx
$ /usr/local/nginx/sbin/nginx
8、 当前系统监听tcp端口的进程
$ netstat -ntpl
9、删除不再需要的源码
$ rm -rf nginx-1.17.9
10、阿里云服务器,需要开发端口
检测:
卸载nginx
1.首先输入命令 ps -ef | grep nginx检查一下nginx服务是否在运行。
2.停止Nginx服务
/etc/init.d/nginx stop 不同的安装方式可能停止的方法不同
3.查找、删除Nginx相关文件
- 查看Nginx相关文件:whereis nginx
-
删除
- find查找相关文件,并删除
-
再次使用yum删除。
yum remove nginx
二、Mysql的安装
mysql的安装请参考: 斑马斑马-03-白云之上-成功上云
三、Python的安装
python的安装请参考:斑马斑马-06-白云之上-python 在 linux的安装
四、上传项目到指定目录
1:目录简介:
HelloWorld,是我们的项目总目录
Django_Admin 是我们的项目目录
script 中是用于存放启动项目相关的脚本
2:查看目前项目安装了哪些内容
ps:当我们开发项目的时候,会用virtualenv创建很多python独立环境,
这时候就会出现在不同环境下安装相同的模块的时候,为了避免我们通过联网下载所需模块,不如我们直接从之前python环境已经有的模块中直接拿来用。
输入pip freeze >requirements.txt回车后此时在项目的文件夹中会有产生一个名是requirements.txt的文本文档
3:使用命令生成数据库
python3 manage.py migrate
4:修改setting文件
vim settings.py
5:启动项目
如果:python3 manage.py runserver 39.99.213.203:8000 启动不起来,用
python3 manage.py runserver 0:8000
6:测试项目是否启动成功
五、uwsg的安装
1:安装uwsgi,
安装:pip install uwsgi
2:使用uWSGI启动服务
执行这条命令的时候,一定要在这个项目目录中
格式:uwsgi --http 服务器地址 --file 项目文件名/wsgi.py --static-map=/static=static
方式一:uwsgi --http 39.99.213.203:8000 --file Django_Admin/wsgi.py --static-map=/static=static
如果方式一启动不起来,把ip地址修改成0:uwsgi --http 0:8000 --file Django_Admin/wsgi.py --static-map=/static=static
3:测试
4:在实际的生产中,一般不会通过脚本启动,都是通过配置文件来启动,也就是跟项目同一级别的script中
vim uwsgi.ini
[uwsgi] #项目目录 chdir=/opt/project/HelloWorld/Django_Admin/ # 启动uwsgi的用户名和用户组 uid=root gid=root # 指定项目的applications module=Django_Admin.wsgi:application # 指定sock文件路径 socket=/opt/project/HelloWorld/script/uwsgi.sock # 启动主进程 master=true # 进程个数 workers=5 pidfile=/opt/project/HelloWorld/script/uwsgi.pid # 自动移除unix socket 和 pid 文件,当服务停止的时候 vacuum=true # 如果可能的话,序列化接收的内容 thunder-lock=true # 启动线程 enable-threads=true # 设置中断时间 harakiri=30 # 设置缓冲 post-buffering=2048 # 设置日志目录 daemonize=/opt/project/HelloWorld/script/uwsgi.log
如果启动不起来可以把里面的注释删掉
启动:uwsgi --ini uwsgi.ini
查看服务是否启动:ps -ef | grep uwsgi
六、Nginx安装
解决Centos7安装nginx后无conf.d目录或conf.d目录下无default.conf文件
在学习nginx的过程中,安装nginx后找不到conf.d目录下的default.conf文件,其原因是该操作系统下的epel源是默认下载就是Fedora操作系统的
1:重新安装nginx,并修改nginx的epel镜像源地址
yum install yum-utils
创建新的nginx.repo文件
vim /etc/yum.repos.d/nginx.repo
nginx="/usr/local/nginx/sbin/nginx" NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/8/$basearch/ gpgcheck=0 enabled=1
#baseurl这行centos根据操作系统修改,比如:os/rehel
# 8 是Linux系统的版本,可以通过url查看路径是否正确
安装Nginx
yum -y install nginx
2:安装完成后,添加一个配置文件
cd /etc/nginx/conf.d/ #添加配置文件
vim Django_Admin.conf #这个名字随便起,最好和项目是一个名字
server { listen 80; server_name 39.99.213.203; access_log /var/log/nginx/access.log main; charset utf-8; gzip on; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; error_page 404 /404.html; error_page 500 502 503 504 /50X.html; # 指定项目路径uwsgi location / { include uwsgi_params; uwsgi_connect_timeout 30; uwsgi_pass unix:/opt/project/HelloWorld/script/uwsgi.sock; } # 指定静态文件路径 location /static/ { alias /opt/project/HelloWorld/Django_Admin/static/; index index.html index.htm; } }
3:设置开机启动:在/etc/init.d/目录下创建nginx脚本文件(不要直接用FTP创建编辑,使用vi编辑)
#!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: NGINX is an HTTP(S) server, HTTP(S) reverse \\ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /etc/sysconfig/nginx # pidfile: /var/run/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 nginx="/usr/local/nginx/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/etc/nginx/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx make_dirs() { # make required directories user=`$nginx -V 2>&1 | grep "configure arguments:.*--user=" | sed \'s/[^*]*--user=\\([^ ]*\\).*/\\1/g\' -` if [ -n "$user" ]; then if [ -z "`grep $user /etc/passwd`" ]; then useradd -M -s /bin/nologin $user fi options=`$nginx -V 2>&1 | grep \'configure arguments:\'` for opt in $options; do if [ `echo $opt | grep \'.*-temp-path\'` ]; then value=`echo $opt | cut -d "=" -f 2` if [ ! -d "$value" ]; then # echo "creating" $value mkdir -p $value && chown -R $user $value fi fi done fi } start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 make_dirs echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { configtest || return $? stop sleep 1 start } reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac
nginx="/usr/local/nginx/sbin/nginx" 和 NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"的需要根据自己的安装路径进行修改
查看安装路径:nginx -V
4:更改文件权限
chmod 755 /etc/init.d/nginx
5:将nginx添加至chkconfig管理列表
chkconfig --add /etc/init.d/nginx
6:用chkconfig设置其开机启动
chkconfig --level 2345 nginx on
7: 启动
/etc/init.d/nginx start
解决Centos7安装nginx,报No match for argument
可能是yum把它给禁用了
vim /etc/yum.conf,把下面那句给注释掉
再次执行 yum -y instll nginx
七、配置静态文件
1:启动nginx和uwsgi
uwsgi --ini uwsgi.ini
/etc/init.d/nginx start
2:访问页面
查看日志可以发现,确实通过neginx来走的
但是,发现访问django_admin里面的css样式是乱掉的
3:设置静态文件
首先停掉nginx和uwsgi
/etc/init.d/nginx stop
uwsgi --stop uwsgi.pid
查看状态
其次,生成数据库,并创建管理员用户
python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py createsuperuser
修改setting.py文件: vim settings.py
添加默认的静态目录(收集使用):STATIC_ROOT = os.path.join(BASE_DIR,"static_all")
··收集静态文件:python3 manage.py collectstatic --noinput
我们进入目录可以看到生成了相应的静态文件
修改Nginx配置文件中location的静态目录:vim /etc/nginx/conf.d/Django_Admin.conf
alias /opt/project/HelloWorld/Django_Admin/static/; 修改为 alias /opt/project/HelloWorld/Django_Admin/static_all/;
最后,重启uwsgi和nginx
测试:
八、把上面的内容整合到一个脚本文件中
1:编辑管理脚本
cd /etc/init.d/
vim manage_Django_Admin.sh
#! /bin/sh # chkconfig: 345 85 15 # 上面一行注释:哪些Linux级别需要启动manage_Django_Admin(3,4,5);启动序号(85);关闭序号(15)。 # description: manage script is the Django_Admin daemon. # Author: yango # 指定项目目录 PROJECT_DIR="/opt/project/HelloWorld/Django_Admin" # 指定脚本目录在哪里 SCRIPTS_DIR="/opt/project/HelloWorld/script" # 描述 DESC="Django_Admin daemon" # 名称 NAME="Django_Admin" # 脚本名称 SCRIPT_FILENAME="manage_Django_Admin.sh" # 脚本目录名称 SCRIPTNAME=`pwd`/$SCRIPT_FILENAME # PID PID="uwsgi.pid" # 启动函数 d_start(){ # 进入到项目目录 cd $SCRIPTS_DIR # 判断这个PID是否存在 if [ ! -f $PID ];then echo -e "\\n\\033[34m$NAME项目启动中........\\033[0m" # 如果不存在执行 uwsgi --ini uwsgi.ini killall nginx /etc/init.d/nginx start # 自动收集静态文件 cd $PROJECT_DIR && python3 manage.py collectstatic --noinput echo -e "\\n\\033[32m$NAME 项目启动完成........\\033[0m" exit 0 fi echo -e "\\n\\033[33m$NAME 项目已启动请勿重复启动\\033[0m" } # 关闭函数 # 关闭项目 d_stop(){ # 进入脚本目录 cd $SCRIPTS_DIR # 判断这个pid文件是否存在 if [ ! -f "uwsgi.pid" ];then # 这个项目已经关闭了 echo -e "\\n\\033[33m$NAME 项目已经关闭了请先启动\\033[0m" fi echo -e "\\n\\033[34m$NAME 项目关闭中........\\033[0m" echo -e "\\nStop $DESC: $NAME" # 如果没有关闭 uwsgi --stop uwsgi.pid # 是否停掉Nginx根据实际需要来操作~~!因为Nginx有对静态文件缓存[注意] killall nginx /etc/init.d/nginx start echo -e "\\n\\033[32m$NAME 项目关闭完成........\\033[0m" } d_restart(){ d_stop sleep 1 d_start } case "$1" in start) echo -e "\\nstarting $DESC: $NAME" d_start ;; stop) echo -e "\\nStop $DESC: $NAME" d_stop ;; restart) echo -e "\\nRestart $DESC: $NAME" d_restart ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2 exit 3 ;; esac
2:分配权限 chmod 755 manage_Django_Admin.sh
3:测试启动与停止
4:进一步优化
把管理脚本添加到服务中
chkconfig --add manage_Django_Admin.sh
设置成开机自启动
chkconfig manage_Django_Admin.sh on
查看启动级别
chconfig --list manage_Django_Admin.sh
在任何目录都可通过
service manage_Django_Admin.sh start 了
十、一键部署+虚拟环境
目标:从github上找django两个项目,快速部署到自己服务器上
1:创建两个虚拟环境
# mkvirtualenv wangblog
# mkvirtualenv jingblog
2:下载两个django项目
https://github.com/myminwang/myblog
https://github.com/newpanjing/myblog
3:代码上传服务器并解压至相应的文件夹
解压 unzip 文件名
# cd /opt/project/wblog
# unzip myblog.zip
4:分别在各自的虚拟环境中,一键安装相应的包
进入到:各自的虚拟目录
# workon wangblog
# /opt/project/wblog/myblog
一键配置安装包 pip3 install -r requirements.txt
# pip3 install -r requirements.txt
安装过程总可能会出现一些错误,都可百度处理,这里不再赘述。
5:修改配置文件(数据库)
修改数据库相关配置并创建数据库
CREATE DATABASE `myblog` CHARACTER SET utf8 COLLATE utf8_general_ci;
6:runserver正常运行
python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py runserver 0:8088
7:检查配置文件
主要是静态文件相关部分,用于nginx静态分配
STATICFILES_DIRS = (os.path.join(BASE_DIR, \'static_all\'),)
8:修改一键部署脚本
添加部署脚本,注意放置位置
#! /bin/sh # decription:一键部署Nginx+uWSGI+Django # Author: yango MANAGE_DIR=`pwd` #**************************您的配置区域其他的无需修改************************** # [config1]项目名称 PROJECT_NAME="myblog" # [config2]nginx域名或者IP地址和端口,我们用来访问的 SERVER_NAME="0" #也可以是域名 SERVER_PORT=8088 # 如果有虚拟环境需要指定虚拟路径名称 VEN_NAME="wangblog" # 如果有虚拟环境需要指定虚拟路径 VEN_PATH=/root/.virtualenvs/$VEN_NAME #****************************************************************************** # 项目目录 PROJECT_DIR=$MANAGE_DIR/$PROJECT_NAME # 检查项目目录是否存在 check_project(){ if [ ! -d $PROJECT_DIR ]; then echo -e "\\n\\033[33m PROJECT_DIR 没有指定,请指定项目目录\\033[0m" exit 0 elif [ -d $PROJECT_DIR ]; then echo -e "\\033[32m项目目录存在是:$PROJECT_DIR........\\033[0m" fi } # 创建脚本管理配置 make_script_init(){ echo -e "\\033[32m开始创建script目录........\\033[0m" mkdir script echo -e "\\033[32m开始创建管理文件........\\033[0m" cat > script/manage_$PROJECT_NAME<<EOF #! /bin/sh # chkconfig: 345 85 15 # 上面一行注释:哪些Linux级别需要启动manage_myblog(3,4,5);启动序号(85);关闭序号(15)。 # description: manage script is the $PROJECT_NAME daemon. #home目录 home=$VEN_PATH # Author: yango # 重载环境变量 export PATH=\\$PATH:/usr/local/lib/python3.7 # 指定项目目录 PROJECT_DIR=$PROJECT_DIR # 指定脚本目录在哪里 SCRIPTS_DIR=$MANAGE_DIR/script # 描述 DESC="$PROJECT_NAME daemon" # 名称 NAME=$PROJECT_NAME # 脚本名称 SCRIPT_FILENAME=manage_$PROJECT_NAME # 脚本目录名称 SCRIPTNAME=$MANAGE_DIR/script # PID PID="uwsgi.pid" # 启动函数 d_start(){ # 激活虚拟环境 source $VEN_PATH/bin/activate # 进入到项目目录 cd $MANAGE_DIR/script/ # 判断这个PID是否存在 if [ ! -f "uwsgi.pid" ];then echo -e "\\n\\033[34m$NAME项目启动中........\\033[0m" # 如果不存在执行 uwsgi --ini uwsgi.ini killall nginx /etc/init.d/nginx start # 自动收集静态文件 cd $MANAGE_DIR/$PROJECT_NAME&& python3 manage.py collectstatic --noinput echo -e "\\n\\033[32m$NAME 项目启动完成........\\033[0m" exit 0 fi echo -e "\\n\\033[33m$NAME 项目已启动请勿重复启动\\033[0m" } # 关闭函数 # 关闭项目 d_stop(){ # 进入脚本目录 cd $MANAGE_DIR/script/ # 判断这个pid文件是否存在 if [ ! -f "uwsgi.pid" ];then # 这个项目已经关闭了 echo -e "\\n\\033[33m$NAME 项目已经关闭了请先启动\\033[0m" fi echo -e "\\n\\033[34m$NAME 项目关闭中........\\033[0m" echo -e "\\nStop $DESC: $NAME" # 如果没有关闭 uwsgi --stop uwsgi.pid # 是否停掉Nginx根据实际需要来操作~~!因为Nginx有对静态文件缓存[注意] killall nginx /etc/init.d/nginx start echo -e "\\n\\033[32m$NAME 项目关闭完成........\\033[0m" } d_restart(){ d_stop sleep 1 d_start } case "\\$1" in start) echo -e "\\nstarting $DESC: $NAME" d_start ;; stop) echo -e "\\nStop $DESC: $NAME" d_stop ;; restart) echo -e "\\nRestart $DESC: $NAME" d_restart ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2 exit 3 ;; esac EOF chmod 755 $MANAGE_DIR/script/manage_$PROJECT_NAME echo -e "\\033[32m开始添加uwsgi.ini配置文件........\\033[0m" cat > script/uwsgi.ini<<EOF [uwsgi] # 项目目录 chdir=$PROJECT_DIR # 启动uwsgi的用户名和用户组 uid=root gid=root # 指定项目的application module=$PROJECT_NAME.wsgi:application # 指定sock的文件路径 socket=$MANAGE_DIR/script/uwsgi.sock # 启用主进程 master=true # 进程个数 workers=5 pidfile=$MANAGE_DIR/script/uwsgi.pid # 自动移除unix Socket和pid文件当服务停止的时候 vacuum=true # 序列化接受的内容,如果可能的话 thunder-lock=true # 启用线程 enable-threads=true # 设置自中断时间 harakiri=30 # 设置缓冲 post-buffering=4096 # 设置日志目录 daemonize=$MANAGE_DIR/script/uwsgi.log EOF echo "STATIC_ROOT = os.path.join(BASE_DIR, \'static_all\')">> $MANAGE_DIR/$PROJECT_NAME/$PROJECT_NAME/settings.py } make_nginx_init(){ echo -e "\\033[32m初始化Nginx........\\033[0m" cat > /etc/yum.repos.d/nginx.repo<<EOF [nginx] name=nginx repo # 下面这行centos根据你自己的操作系统修改比如:OS/rehel # 6是你Linux系统的版本,可以通过URL查看路径是否正确 baseurl=http://nginx.org/packages/centos/6/\\$basearch/ gpgcheck=0 enabled=1 EOF yum -y install nginx echo -e "\\033[32m添加Nginx配置文件........\\033[0m" cat > /etc/nginx/conf.d/$PROJECT_NAME.conf<<EOF server { listen $SERVER_PORT; server_name $SERVER_NAME ; access_log /var/log/nginx/access.log main; charset utf-8; gzip on; gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream; error_page 404 /404.html; error_page 500 502 503 504 /50x.html; # 指定项目路径uwsgi location / { include uwsgi_params; uwsgi_connect_timeout 30; uwsgi_pass unix:$MANAGE_DIR/script/uwsgi.sock; } # 指定静态文件路径 location /static/ { alias $MANAGE_DIR/$PROJECT_NAME/static_all/; index index.html index.htm; } } EOF } add_server(){ echo -e "\\033[32m添加管理至服务........\\033[0m" cp $MANAGE_DIR/script/manage_$PROJECT_NAME /etc/init.d/ chkconfig --add /etc/init.d/manage_$PROJECT_NAME chkconfig /etc/init.d/manage_$PROJECT_NAME on # 启动服务 echo -e "\\033[32m启动服务........\\033[0m" service manage_$PROJECT_NAME start } check_project make_script_init make_nginx_init add_server
分配权限 chmod 755 deploy_project.sh
切换到虚拟环境 checkon wangblog
执行脚本 ./deploy_project.sh
执行成功后,script文件中会多出一些内容
10:启动测试
service manage_myblog start
service manage_myblogs start
ps:如果 在启动过程中遇到了这个error reading information on service
1查看deploy_project.sh文件中报错位置
2:查看文件发现,文件也存在哈,但是运行确实会有问题
3: 安装 yum install dovecot
以上是关于斑马斑马-08-白云之上-python在Linux上的部署的主要内容,如果未能解决你的问题,请参考以下文章