首页 > 编程语言 >记一次 gunicorn+python+flask+venv 部署过程

记一次 gunicorn+python+flask+venv 部署过程

时间:2023-08-02 16:01:43浏览次数:39  
标签:grep gunicorn start python APP echo flask NAME

记一次 gunicorn+python+flask+venv 部署过程

flask直接部署到服务器会有警告,本身也是不稳定的,它只是一个应用。需要一个独立的Server来承担WSGI角色和责任。

venv是pytohn的虚拟环境,用来隔离不同项目的包版本不一致的问题。python3.6+以上都自带有,在部署之前先创建虚拟环境。

1、创建python虚拟环境

cd ~
python3 -m venv xxx

这样就在root下创建了xxx这个虚拟环境(也是个文件目录),该目录下也自动创建了几个文件夹。

2、安装gunicorn

cd xxx
bin/pip install gunicorn -i https://pypi.tuna.tsinghua.edu.cn/simple

3、配置命令

可以直接使用命令方式配置启动参数,也可以使用配置文件的方式启动。这里为了后续维护方便,使用的配置文件:

import multiprocessing
import gevent.monkey
gevent.monkey.patch_all()

bind = '127.0.0.1:8777'  # 绑定的ip端口号
chdir = '/root/xxx'  # gunicorn要切换到的目的工作目录
logdir = '/var/opt/logs/xxx'
timeout = 60  # 超时
worker_class = 'gevent'  # 使用gevent模式,还可以使用sync 模式,默认的是sync模式
workers = multiprocessing.cpu_count() * 2 + 1  # 启动的进程数
loglevel = "info"  # 日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'  # 设置gunicorn访问日志格式,错误日志无法设置
pidfile = f"{logdir}/gunicorn.pid"
accesslog = f"{logdir}/access.log"
errorlog = f"{logdir}/error.log"
daemon = True  # 是否后台运行

4、自动发布脚本

设计一个自动发布脚本可以放到其他发布工具上去,只需要git合并代码就会触发,爽歪歪。

#!/bin/bash

# 修改APP_NAME为云效上的应用名
SERVE=gunicorn
APP_NAME=xxx

PROG_NAME=$0
ACTION=$1
ENV=$2
APP_START_TIMEOUT=20    # 等待应用启动的时间
APP_PORT=0000          # 应用端口
HEALTH_CHECK_URL=http://127.0.0.1:${APP_PORT}/ping  # 应用健康检查URL
HEALTH_CHECK_FILE_DIR=/home/admin/status   # 脚本会在这个目录下生成nginx-status文件
APP_HOME=/root/${APP_NAME} # 从package.tgz中解压出来的项目文件放到这个目录下
START_LOG=${APP_HOME}/logs/start.log  # 应用的启动日志
GUNICORN_CONFIG=${APP_HOME}/gun_${ENV}.py # gunicorn的配置文件

# 创建出相关目录
mkdir -p ${HEALTH_CHECK_FILE_DIR}
mkdir -p ${APP_HOME}
mkdir -p ${APP_HOME}/logs
usage() {
    echo "Usage: $PROG_NAME {start|stop|restart}"
    exit 2
}

health_check() {
    exptime=0
    echo "checking ${HEALTH_CHECK_URL}"
    while true
        do
            status_code=`/usr/bin/curl -L -o /dev/null --connect-timeout 5 -s -w %{http_code}  ${HEALTH_CHECK_URL}`
            if [ "$?" != "0" ]; then
               echo -n -e "\rapplication not started"
            else
                echo "code is $status_code"
                if [ "$status_code" == "200" ];then
                    break
                fi
            fi
            sleep 1
            ((exptime++))

            echo -e "\rWait app to pass health check: $exptime..."

            if [ $exptime -gt ${APP_START_TIMEOUT} ]; then
                echo 'app start failed'
               exit 1
            fi
        done
    echo "check ${HEALTH_CHECK_URL} success"
}

start_application() {
    echo "starting flask process"
    gunicorn -c ${GUNICORN_CONFIG} app:${APP_NAME} > ${START_LOG} 2>&1 &
    echo "started flask process"
}

stop_application() {
   checkpid=`ps -ef | grep ${SERVE} | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`

   if [[ ! $checkpid ]];then
      echo -e "\rno ${SERVE} process"
      return
   fi

   echo "stop ${SERVE} process"
   times=60
   for e in $(seq 60)
   do
        sleep 1
        COSTTIME=$(($times - $e ))
        checkpid=`ps -ef | grep ${SERVE} | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`
        if [[ $checkpid ]];then
            kill -9 $checkpid
            echo -e  "\r        -- stopping ${SERVE} lasts `expr $COSTTIME` seconds."
        else
            echo -e "\r${SERVE} process has exited"
            break;
        fi
   done
   echo ""
}
start() {
    start_application
    health_check
}
stop() {
    stop_application
}
case "$ACTION" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        stop
        start
    ;;
    *)
        usage
    ;;
esac

标签:grep,gunicorn,start,python,APP,echo,flask,NAME
From: https://www.cnblogs.com/Denny_Yang/p/17600906.html

相关文章

  • flask as_view源码,请求响应,cookie,session
    1CBV1cbv写法 -1写个类,继承MethodView-2在类中写跟请求方式同名的方法-3注册路由:app.add_url_rule('/home',view_func=Home.as_view('home'))#home是endpoint,就是路由别名2cbv加装饰器 -方式一: classHome(MethodView): decorators=[auth]#......
  • [算法题python]822.翻转卡片游戏
    在桌子上有 n 张卡片,每张卡片的正面和背面都写着一个正数(正面与背面上的数有可能不一样)。我们可以先翻转任意张卡片,然后选择其中一张卡片。如果选中的那张卡片背面的数字 x 与任意一张卡片的正面的数字都不同,那么这个数字是我们想要的数字。哪个数是这些想要的数字中最小的......
  • Python | 基础语法
    1.字面量字面量:在代码中,被写下来的固定的值1.1Python常用的6种值(数据)的类型类型描述说明数字整数(int)、浮点数(float)、复数(complex)、布尔(bool)字符串描述文本的一种数据类型由任意数量的字符组成列表有序的可变序列元组有序的不可变序列可......
  • [算法题python]14. 最长公共前缀
    编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 示例1:输入:strs=["flower","flow","flight"]输出:"fl"示例2:输入:strs=["dog","racecar","car"]输出:""解释:输入不存在公共前缀。 提示:......
  • python3 压缩图片到合理范围
    importosfromPILimportImagefromPILimportImageFileimportimghdrdefcompress_image(outfile,mb=200,quality=85,k=0.9):#修改mb大小,就是想要设定的压缩后的大小。"""不改变图片尺寸压缩到指定大小:paramoutfile:压缩文件保存地址:parammb:压缩目标,KB:pa......
  • 关于命令行运行python 报错的问题
    装好python以后,想看看是不是装好了,能否运行,在命令行中输入python以后,蹦出来这么一个东西:看这意思是环境变量没有配置好,但是很奇怪,在装的时候我是勾上了添加环境变量的呀,没办法,智能求助于度娘,网上说是要添加PYTHONHOME和PYTHONPATH两个环境变量,然后怎么怎么操作,但是我尝试后发现......
  • Python爬虫爬取B站评论区
    写了两天,参考其他大牛的文章,摸着石头过河,终于写出了一个可以爬B站评论区的爬虫,人裂了……致谢:致谢:SmartCrane马哥python说该程序具有以下功能:①输入B站视频链接,即可爬取B站评论区评论、IP、ID、点赞数、回复数,并保存在当前目录的以视频名字为标题的csv文件中。②由视频链......
  • python最简单的传参方法-第一次见这种方法
    我又一个python文件,名为grounding_dino_demo.py,其代码为:fromgroundingdino.util.inferenceimportload_model,load_image,predict,annotate,Modelimportcv2CONFIG_PATH="GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py"CHECKPOINT_PATH=&......
  • 一周学会python1-开始
    1Python简介Python是一种相当流行(而且简单易学)的高级编程语言。本书将以直观的方式向你传授Python。即使你没有任何编程语言的经验,也能掌握Python的基础知识并加以运用。1.1什么是Python?Python一种高级编程语言,在编程界非常流行。它简单、通用,并包含大量第三方框架库。它......
  • python3 install 其他包 报:ModuleNotFoundError: No module named '_ctypes' 的问题
    python3install其他包报:ModuleNotFoundError:Nomodulenamed'_ctypes'的问题python2import_ctypes没有问题python3import_ctypes报上述错误,说明_ctypes确实无法导入。据网上资料显示时没有安装libdiff库,但使用yum安装后,还需要重新编译python3。但python3好......