斑马斑马-08-白云之上-python在Linux上的部署

2021-02-07 11:19

阅读:476

标签:整合   rm -rf   Django项目   test   map   ges   down   云服务   type   

 部署说明

  • 系统: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、阿里云服务器,需要开发端口

技术图片

 

 检测:

技术图片

二、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 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.reponginx="/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
nginx.repo

  #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;
} 
}
Django_Admin.conf

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

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  

技术图片

 

七、配置静态文件

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
manage_Django_Admin

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_NAMEEOF
#! /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.iniEOF
[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.repoEOF
[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.confEOF
    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
deploy_project.sh

   分配权限 chmod 755 deploy_project.sh 

 切换到虚拟环境 checkon wangblog

 执行脚本 ./deploy_project.sh 

技术图片

执行成功后,script文件中会多出一些内容

技术图片

10:启动测试

service manage_blog start

service manage_blogs start

技术图片

 

斑马斑马-08-白云之上-python在Linux上的部署

标签:整合   rm -rf   Django项目   test   map   ges   down   云服务   type   

原文地址:https://www.cnblogs.com/YK2012/p/12714191.html


评论


亲,登录后才可以留言!