Docker 项目快速部署Flask项目

news2024/11/28 12:31:22

前言

打造 flask + gunicron + nginx + Mysql 环境
nginx + Mysql 使用docker 快速部署
使用 supervisor 对 gunicron 做监控
环境:centos7 ,python3.7

flask 篇

flask 项目就不多赘述了。这里贴一下项目的目录,便于解释下面的命令参数。
flask
运行python app.py脚本,即可 web 访问,但无法并发访问,如果需要多线程开启 web 服务,实现并发访问,则需要额外一个工具进行封装,如gunicorn

这里安装 gunicron
gunicron 是用来 解析HTTP请求的网关服务
安装命令

pip install gunicron
# start gunicorn server  命令: 
# gunicorn  命令要在 flask 项目所在的文件夹下运行
gunicorn  app:app -c gunicorn.py
# gunicorn.py 内容
# 并行进程数量
workers = 3
# 每个进程的线程数
thread = 5
# #gunicorn监控的接口
bind = '0.0.0.0:5000'
# 进程pid文件
pidfile = 'gunicorn.pid' #gunicorn进程id,kill掉该文件的id,gunicorn就停止

logfile = './debug.log' #debug日志
errorlog = './error.log' #错误信息日志

loglevel = 'debug'
logfile = './debug.log' #debug日志
errorlog = './error.log' #错误信息日志
timeout = 90

#https://github.com/benoitc/gunicorn/issues/1194
keepalive = 75 # needs to be longer than the ELB idle timeout
worker_class = 'gevent'

docker 篇

docker 安装 mysql

docker pull mysql
docker run -p 3306:3306 --name test-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

进入mysql容器

docker exec -it test-mysql /bin/bash
# 进入mysql容器
docker exec -it test-mysql /bin/bash

# 查看mysql配置文件
cat /etc/mysql/my.cnf
# 进入mysql命令行
mysql -u root -p123456
# 修改数据库的权限 
grant all on *.* to 'root'@'%';
# 刷新权限
flush privileges

docker 安装 nginx

nginx是一个功能强大的反向代理服务器, 使用nginx来转发gunicorn服务。
为什么要在gunicorn之上再加层nginx呢?一方面nginx可以补充gunicorn在某些方面的不足,如SSL支持、高并发处理、负载均衡处理等

编辑配置文件/etc/nginx/sites-available/default,修改location /如下

#拉取最新的nginx 镜像
docker pull nginx
sudo mkdir /opt/nginx
# 启动nginx容器
docker run -d -p 80:80 -p 443:443 --name nginx01  -v /opt/nginx:/etc/nginx  nginx 

-p 80:80 -p 443:443 暴露80 , 443 端口
-v /opt/nginx:/etc/nginx nginx 挂载目录

进入容器

docker exec -it nginx01 /bin/bash

编辑配置文件/etc/nginx/conf.d/default.conf 修改location /如下

location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;
    proxy_pass http://localhost:5000/;
    proxy_redirect off;

    proxy_set_header Host $http_post;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

重启nginx服务

docker restart nginx01

此时flask已经可以并发访问了,但存在一个问题,就是gunicron不支持重启,如果脚本需更新、服务异常关闭等,如何自动启动?
这里就要用到supervisor。
supervisor是一个用python语言编写的进程管理工具,它可以很方便的监听、启动、停止、重启一个或多个进程。当一个进程意外被杀死,supervisor监听到进程死后,可以很方便的让进程自动恢复,不再需要程序员或系统管理员自己编写代码来控制.

Supervisor 安装配置

1、安装

方法一 (yum安装)

yum install epel-release
yum install supervisor

方法二 (推荐第二种: 本人环境python 3.7)

pip install supervisor

生成配置文件

sudo root
mkdir -p /etc/supervisor/conf.d # 这个目录是配置文件所存放的目录
echo_supervisord_conf > /etc/supervisord.conf

需要注意的地方

supervisor安装后/etc下有时默认没有配置文件,运行echo_supervisord_conf程序生成supervisor的初始化配置文件

-bash: /etc/supervisord.conf: Permission denied
sudo chmod -R 777 /etc
sudo  echo_supervisord_conf > /etc/supervisord.conf

创建 gunicorn服务的配置文件

创建/etc/supervisor/conf.d/gunicorn.conf文件
gunicorn服务的配置文件:

[program:gunicorn]
command=/home/cloud/anaconda3/bin/gunicorn -b 0.0.0.0:5000 app:app -c gunicorn.py
directory=/home/cloud/git/Data_Lineage/Data_Lineage_backend
autostart=true
autorestart=true
user=cloud
redirect_stderr=true
stdout_logfile=/home/cloud/superErr.log

program: 为你的进程取个别名
command:执行进程的命令
dirrectory:你的文件所在地址
redirect_stderr:将错误输出到日志
stdout_logfile:设置日志文件所在
path autostart=true supervisord守护程序启动时自动启动tornado
autorestart=true ;supervisord守护程序重启时自动重启tornado
redirect_stderr=true ;将stderr重定向到stdout

修改配置文件 /etc/supervisord.conf添加:

[include]
;files = relative/directory/*.ini
files = /etc/supervisor/conf.d/*.conf

特别注意:
初始化的 /etc/supervisord.conf 文件中

;[include]
;files = relative/directory/*.ini

记得要将前面的;去掉,否则不生效

Error 内容

supervisord -c /etc/supervisord.conf 运行失败


[cloud@web conf.d]$ supervisord -c /etc/supervisord.conf
[cloud@web conf.d]$ supervisorctl status
gunicorn                         FATAL     Exited too quickly (process log may have details)

查看错误日志
22
查看端口被占用情况
netstat -tunpl |grep 5000
lsof -i:5000
kill -9 pid

在这里插入图片描述

[2022-12-14 16:19:57 +0000] [14203] [INFO] Starting gunicorn 20.1.0

Error: Already running on PID 14202 (or pid file 'gunicorn.pid' is stale)

[cloud@web Data_Lineage_backend]$ cat gunicorn.pid
14202
[cloud@web Data_Lineage_backend]$ rm gunicorn.pid
[cloud@web Data_Lineage_backend]$ kill -9 14202
[cloud@web Data_Lineage_backend]$ gunicorn  app:app -c gunicorn.py
[2022-12-14 16:20:55 +0000] [14562] [INFO] Starting gunicorn 20.1.0

Error: Already running on PID 14536 (or pid file 'gunicorn.pid' is stale)



在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91777.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

​Word怎么转换成PDF格式?这三种方法教你如何转换

怎么把Word文档转换成PDF文件格式呢?相信小伙伴们在办公过程中会习惯使用Word文档来编辑文件,编辑好后如果需要发送文件的话会将文档转换成PDF格式来发送,原因就是PDF格式独有的兼容性和稳定性能够让我们的文件格式不会错乱,这也是…

深入理解Maven的全部配置

深入理解Maven的全部配置1. Introduction1.1 Big Data -- Postgres2. Install2.1 Maven Install2.2 Config Setting.xml2.3 Local Package Install Maven3. Project4.AwakeningMaven Document: https://maven.apache.org/. Maven Download: https://maven.apache.org/download.…

前端富文本设置的表格样式无法展示解决方案

当我们在富文本编辑器里编辑好文本后,发布一看,为什么编辑器预览的内容和实际保存后展示的内容不一致呢。这是因为,大部分编辑器本身会自带一些样式属性,而当获取富文本内容的时候往往是不带这些样式属性的,所以才导致…

【Java_GUI编程】--基本操作你要知道

文章目录一、组件和容器1、JFrame2、面板JPanel3、布局管理器流式布局(从左到右)东南西北中网格布局4、事件监听输入框事件监听键盘监听5、JDialog弹窗6、Icon、ImageIcon标签IconImageIcon7、按钮单选按钮复选按钮8、列表下拉框列表框9、文本框密码框文…

醉三皇酒特别的爱:孙子15年买酒送爷爷,爷爷90箱好酒赠重孙

小强没有万万没有想到,自己不仅会被裁员,而且还妻离子散,最敬爱的爷爷又意外去世。 一、惨遭裁员,一蹶不振 都说程序员是吃年轻饭的,以前不以为然,现在看着手里的裁员告知单,小强也不得不信了。…

Mybatis源码分析(三)SqlSessionFactoryl的初始化

目录一 解析配置文件入口二 解析properties文件三 解析settings文件四 解析typeAliases文件五 解析 Plugin文件六 解析 Environments 文件七 解析Mapper 文件官网: mybatis – MyBatis 3 | 简介参考书籍:《通用源码阅读指导书:MyBatis源码详解…

vscode无法读取头文件问题,改变exe生成路径问题,头文件,源文件分离问题

首先声明一点,我这里演示的基础是源文件都位于项目根目录下的,然后exe文件和头文件可以放在项目的其他任何文件夹中的。 目录 1. vscode自定义头文件包含问题 1.1 首先是我们的c_cpp_peoperties.json文件 1.2 接下来是我们的settings.json文件 2.改变…

String(2)

字符串中的库函数,基本上只要对原来的字符串进行修改,基本上返回的都是一个新的对象 我们先来看一个内存布局图: String s1new String("hello"); String s2new String("world"); String s3s1; 下列程序的输出结果是:输出good和gbc p…

Go开发环境搭建

文章目录Go环境搭建开发工具Visual Studio Code Go 扩展插件时间2022-12-15 Go环境搭建 下载安装Go 国外的官网: https://golang.org/dl/国内的官网: https://golang.google.cn/dl/ 检查版本go version 必须在安装目录执行命令:C:\Program Files\Go>go version…

软考信息安全工程师备考笔记

上午 信息安全的5个基本要素为:机密性、完整性、可用性、可控性、可审查性。 法律 《中华人民共和国网络安全法》已由中华人民共和国第十二届全国人民代表大会常务委员会第二十四叫次会议于2016年11月7日通过,自2017年6月1日起施行。 第八条明确规定了…

ADI Blackfin DSP处理器-BF533的开发详解53:CMOS摄像头采集图像+LCD显示(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了摄像头拍摄一张 640480 大小,YUV422 格式的图片,然后将图片转成 RGB565 格式,裁剪为 480…

Latex 中插入 Matlab 代码

这篇文章将介绍如何在 Latex 排版过程中添加 Matlab 代码 功能效果 主要有如下排版功能: 语法高亮自动添加边框自动添加行号 先上图,大家感受一下效果: 而实现这些只需要一行代码加一个包! 插入代码块 \usepackage{listings…

JavaScript刷LeetCode拿offer-二叉树层序遍历篇

前言 博主最近在刷leetcode,做到二叉树套题的时候发现很多题的解题思路都是基于二叉树的层序遍历来完成的,因此写下这篇文章,记录一下二叉树层序遍历这件"神器"在实战的运用。 [leetcode] 102.二叉树的层序遍历 二叉树的层序遍历…

[附源码]Python计算机毕业设计高校宿舍管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

Vue渲染器(五):快速diff算法

渲染器(五):快速diff算法 这章开始讨论第三种用于比较新旧vnode的方式:快速diff算法。跟它的名字一样,它很快。Vue3采用的就是这种算法,Vue2采用的是上一章中的双端diff算法。 接下来就来着重了解它的实现…

宝塔部署前后端分离项目(Vue+SpringBoot)

目录 后端部分 配置Redis 前端部分 后端部分 1 先修改自己的speingboot配置文件,我的是yml文件 保证宝塔上建的数据库和自己代码里,就是配置文件中所建的数据库的名字是一致的密码也要保持一致,Redis也一样,如果有的话 2 记录…

关注电动汽车能效水平 提高续航能力

电动汽车(EV)近些年发展迅猛,已被汽车业内普遍认为是未来汽车发展的新方向,但是现如今电动汽车仍然存在一些短板,导致其还无法替代传统燃油车。对此,先想到的是电动车的续航问题。其实解决电动车续航问题主…

python 插值处理一维数据 interpolate

scipy库: 原码: https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp1d.html kind可选“linear”、“nearest”、“nearest-up”、“zero”、“slinear”、“quadratic”、“cubic”、“previous”或“next”之一。 “zero…

JSP sshOA办公系统myeclipse开发oracle数据库MVC模式java编程计算机网页设计

一、源码特点 JSP sshOA办公系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开 发。开发环境为TOMCAT7.0,Myecl…

音视频编解码流程与如何使用 FFMPEG 命令进行音视频处理

一、前言 FFMPEG 是特别强大的专门用于处理音视频的开源库。你既可以使用它的 API 对音视频进行处理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,来编辑你的音视频文件。 本文将简要介绍一下 FFMPEG 库的基本目录结构及其功能&#…