基于dockers 系统服务部署python项目

基于dockers 系统服务部署python项目

python3.11

docker

nginx

gunicorn

virtualenv

  1. 拉镜像(预制了基于python3.11的ubuntu镜像)
docker run --name test -idt -p5000:5000 registry.cn-hangzhou.aliyuncs.com/xiaokangk5/ubuntu:v1

在这里插入图片描述

  1. 进入容器,更新一下依赖
docker exec -it test bash
apt update
  1. 安装python虚拟环境依赖包,创建虚拟环境,进入虚拟环境
pip3 install virtualenv
mkdir app_flask
cd app_flask/
virtualenv -p python3 venv
source ./venv/bin/activate
  1. 安装flask 包,创建flask测试项目main.py文件
pip install -i https://mirrors.aliyun.com/pypi/simple flask
#main.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return 'jianhua_helloworld2020'

if __name__ == '__main__':
    app.run(port=5000,host='0.0.0.0')  #host设置为0.0.0.0,可以允许外部远程访问

在这里插入图片描述
5.生产环境使用gunicorn部署flask项目
有了gunicorn和gevent后,gunicorn可以实现多进程http服务

  • 安装gunicorn
pip install -i https://mirrors.aliyun.com/pypi/simple gunicorn
  • 使用gunicorn命令
gunicorn --workers=3 main:app 

–workers=3表示三个进程,main:app,其中main为之前flask工程中的main.py,意味这将main.py对象实例化为app。
在这里插入图片描述
可以看到上述监听地址为:127.0.0.0,端口为8000。工作模式为sync,即同步工程模式。这两种参数都可以进行修改,其中监听地址和端口号可以在上述命令后添加 -b ip:port方式实现:

gunicorn --workers=5 main:app -b 0.0.0.0:5000

在这里插入图片描述
对于工作模式,默认是sync,即同步模式。这种模式就是说在调用的时候,必须等待调用返回结果后,决定后续的行为。而异步则是在调用这个job的时候,不用等待其执行结果,还可以执行其他job。
如果要更换为异步模式,可以使用gevent。此时还需要pip来安装gevent。

  • 异步模式
    安装gevent包 并启动
pip install gevent
gunicorn --workers=3 main:app -b 0.0.0.0:5000 -k 'gevent'

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

  • 使用参数配置文件设定
    使用上述脚本命令还是不方便的,gunicorn可以使用-c参数,就是使用配置文件。将一些参数设定放在该配置文件里:
    模板:
import os
bind='0.0.0.0:5001'   #绑定监听ip和端口号
workers=3               #同时执行的进程数,推荐为当前CPU个数*2+1
backlog=2048            #等待服务客户的数量,最大为2048,即最大挂起的连接数
worker_class="gevent" #sync, gevent,meinheld   #工作模式选择,默认为sync,这里设定为gevent异步
max_requests=1000       #默认的最大客户端并发数量
daemon=True           # 是否后台运行
reload=True            # 当代码有修改时,自动重启workers。适用于开发环境。
pidfile='./gunicore.pid'    #设置pid文件的文件名
loglevel='debug'     # debug error warning error critical
accesslog='log/gunicorn.log'  #设置访问日志
errorlog='log/gunicorn.err.log' #设置问题记录日志

将上述内容存放在config.py文件中,然后在命令行输入:

gunicorn -c config.py main:app

本次配置信息
在这里插入图片描述
成都。至此基本的gunicorn+flask异步服务部署就实现了。

  • gunicorn+nginx配置

在这里插入图片描述

  • 拉去nginx镜像
docker pull nginx
  • 跑起来
docker run --name nginx -p 8080:80 -d nginx

在这里插入图片描述
8. nginx+gunicorn部署
首先启动gunicorn+flask项目服务:

gunicorn -c config.py main:app

然后在/usr/share/nginx目录下新建一个nginx.conf文件,在其中输入如下内容:

server {
    listen 80;
    server_name asmarket.com; # 这是HOST机器的外部域名,用地址也行

    location / {
        proxy_pass http://0.0.0.0:5001; # 这里是指向 gunicorn host 的服务地址
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }

本次部署代码:

server {
    listen 80;
    server_name 117.50.187.24; # 这是HOST机器的外部域名,用地址也行

    location / {
        proxy_pass http://0.0.0.0:5000; # 这里是指向 gunicorn host 的服务地址
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }

将其映射到nginx容器里的default.conf配置文件:
启动容器

 docker run --name mynginx -v /usr/share/nginx/nginx.conf:/etc/nginx/conf.d/default.conf -d nginx

在这里插入图片描述
9. supervisor进程守护
nginx一般不会莫名其妙被关闭,但gunicorn是一个进程,完成有有可能因为一些原因被关闭或者阻塞,为了保证gunicorn进程,需要使用看护进程插件。这里使用supervisor来解决这个问题。

pip install supervisor

安装成功后,可以创建一个配置文件:

# 设置默认配置
$ echo_supervisord_conf > /etc/supervisord.conf
$ vi /etc/supervisord.conf

这个配置文件放在/etc/目录下,名为supervisor.conf。接下来就可以修改其配置了:

[program:myapp]
command=/usr/local/bin/gunicorn -c config.py main:app               
directory=/home/hadoop/asmarket
autostart=true                ; start at supervisord start (default: true)
startsecs=1                   ; # of secs prog must stay up to be running (def. 1)
startretries=3                ; max # of serial start failures when starting (default 3)
exitcodes=0                   ; 'expected' exit codes used with autorestart (default 0)
stdout_logfile=/home/hadoop/asmarket/logs/main.logs
stdout_logfile_maxbytes=50MB   ; max # logfile bytes b4 rotation (default 50MB)
user=root

修改完成后,直接使用supervisord来执行:

supervisord -c supervisor.conf

这样myapp的进程就启动了。可以使用supervisorctl status命令来查看当前进程状态:

supervisorctl status

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值