zl程序教程

您现在的位置是:首页 >  工具

当前栏目

docker部署基于gunicorn的flask-resful服务,flask本身自带的服务部署占用服务器资源

Docker部署服务 基于 占用 Flask 自带 本身
2023-09-11 14:14:27 时间

一、

程序已经跟docker容器绑定了,只要docker后台运行程序就能后台了,所以不必开守护进程
守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。 [1]
个人理解守护进程和普通进程区别是指:将后台程序变成一种服务,比如说,用命令行输入启动程序,如果不是守护进程的话,一旦命令行窗口关闭,程序就终止了;而如果启动守护进程,则退出命令行窗口之后,服务一直处于运行状态。

二、

今天登陆服务器发现python占用了相当高比例的cpu,然后发现是本站点使用flask做的的一些web小工具带来的,因此总算明白了启动flask的时候为什么提示不要在生产环境直接部署。0-0。因此决定部署好flask的生产环境,由于大部分人都对gunicorn评价很好,容易配置,因此本文也使用gunicorn来部署flask的生产环境了。

可以通过cat指令查看linux文件的内容

CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

CMD 在docker run 时运行。
RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
# -*- coding: utf-8 -*-
"""
"""
import multiprocessing


bind = '0.0.0.0:9537'  # 绑定监听ip和端口号
workers = multiprocessing.cpu_count() * 2  # 同时执行的进程数,推荐为当前CPU个数*2+1
worker_class = "gevent"  # sync, gevent,meinheld   #工作模式选择,默认为sync,这里设定为gevent异步
backlog = 2048  # 等待服务客户的数量,最大为2048,即最大挂起的连接数
max_requests = 1000  # 默认的最大客户端并发数量
timeout = 600  # 进程沉默超时多少秒,杀死进程
daemon = False            # 是否后台运行
reload = False          # 当代码有修改时,自动重启workers。适用于开发环境。
capture_output = True   # 将 stdout/stderr 重定向到错误日志中的指定文件。
loglevel = 'debug'     # debug, info, warning, error, critical.
pidfile = 'logs/gunicore.pid'  # 设置pid文件的文件名
accesslog = 'logs/gunicorn.log'  # 设置访问日志
errorlog = 'logs/gunicorn.err.log'  # 设置问题记录日志

FROM python:3.7.4

COPY . /deploy
WORKDIR /deploy

RUN pip config set global.index-url https://mirror.baidu.com/pypi/simple \
    && pip install --upgrade setuptools \
    && pip install --upgrade pip \
    && pip install -r requirements.txt \
    && python3 paddle_model.py

EXPOSE 9537
ENTRYPOINT ["gunicorn", "-c", "gunicorn_cfg.py", "main_api:app"]

注意执行指令里面的参数是双引号,不能是单引号

三 特别注意在程序里面不要配置argparse参数,否则会和gunicorn传参冲突并报错

在这里插入图片描述
在这里插入图片描述

四,内存报错,去掉多个进程,防止加载多套独立的程序导致内存溢出

在这里插入图片描述

1.查看CPU信息

cat /proc/cpuinfo       //这个命令可以查看很详细的CPU信息
2.查看CPU指令集

gcc -march=native -Q --help=target | grep march    //这个命令只查看CPU指令集
3.查看内存信息

cat /procmeminfo       //这个命令可以查看很详细的内存信息
# -*- coding: utf-8 -*-

import multiprocessing


bind = "0.0.0.0:9537"  # 绑定监听ip和端口号
# workers = multiprocessing.cpu_count() * 2  # 同时执行的进程数,推荐为当前CPU个数*2+1
workers = 1
worker_class = "gevent"  # sync, gevent,meinheld   #工作模式选择,默认为sync,这里设定为gevent异步
backlog = 2048  # 等待服务客户的数量,最大为2048,即最大挂起的连接数
max_requests = 1000  # 默认的最大客户端并发数量
timeout = 600  # 进程沉默超时多少秒,杀死进程
daemon = False            # 是否后台运行
reload = False          # 当代码有修改时,自动重启workers。适用于开发环境。
capture_output = True   # 将 stdout/stderr 重定向到错误日志中的指定文件。
loglevel = "error"    # debug, info, warning, error, critical.
pidfile = "logs/gunicore.pid"  # 设置pid文件的文件名
accesslog = "logs/gunicorn.log"  # 设置访问日志
errorlog = "logs/gunicorn.err.log"  # 设置问题记录日志