基于dockers 系统服务部署python项目
python3.11
docker
nginx
gunicorn
virtualenv
- 拉镜像(预制了基于python3.11的ubuntu镜像)
docker run --name test -idt -p5000:5000 registry.cn-hangzhou.aliyuncs.com/xiaokangk5/ubuntu:v1
- 进入容器,更新一下依赖
docker exec -it test bash
apt update
- 安装python虚拟环境依赖包,创建虚拟环境,进入虚拟环境
pip3 install virtualenv
mkdir app_flask
cd app_flask/
virtualenv -p python3 venv
source ./venv/bin/activate
- 安装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