基于gunicorn部署flask项目

文章目录

*

+
* 1、WSGI协议
* 2、gunicorn介绍
* 3、gunicorn安装
* 4、gunicorn使用
*
4.1 基于Flask创建python服务
4.2 配置参数、启动应用服务

+ 4.2.1 命令行配置gunicorn参数
+ 4.2.2 文件配置gunicorn参数
* 5、访问web服务器
* 6、结束gunicorn服务进程

1、WSGI协议

Web框架致力于如何生成HTML代码,而Web服务器用于处理和响应HTTP请求。Web框架和Web服务器之间的通信,需要一套双方都遵守的接口协议。WSGI协议就是用来统一这两者的接口的。

2、gunicorn介绍

我们知道,python是单线程的语言,当进程阻塞时,后续请求将排队处理。

gunicorn是一个python WSGI http server,其优势在于它使用了pre-fork worker模式。gunicorn在启动时,会在主进程中预先fork出指定数量的worker进程来处理请求,依靠操作系统来提供负载均衡。

3、gunicorn安装

gunicorn安装非常简单,使用命令pip install gunicorn即可:

pip install gunicorn

一般使用它,主要是为使用其异步的worker模型,还需要安装对应的异步模块:

pip install greenlet
pip install eventlet
pip install gevent

4、gunicorn使用

4.1 基于Flask创建python服务

这里使用gunicorn来部署一个flask项目举例,此处flask框架的使用不过多阐述,不是本文的重点。

如下例子,保存为app.py

from flask import Flask
app = Flask(__name__)

@app.route("/hello")
def hello():
    return "Hello World!"

注: 建议将应用程序运行所需的所有Python文件都放在顶层文件夹apps中。
将主入口程序命名为 app.py,将脚本中创建的Flask对象命名为 app (对应于部署命令 gunicorn -c gunicorn/config.py app:app 中的 app:app )。

FlaskApp
    └── apps
        └── < .py files>
    └── gunicorn
        └── config.py
    ├── app.py
4.2 配置参数、启动应用服务

gunicorn通常使用的参数如下:

1)-c CONFIG,--config=CONFIG
指定一个配置文件(py文件)

2)-b BIND,--bind=BIND
设定服务需要绑定的端口。建议使用HOST:PORT。

3)-D,--daemon
后台进程方式运行gunicorn进程

4)-w WORKERS,--workers=WORKERS
工作进程的数量

5)-k WORKERCLASS,--worker-class=WORKERCLASS
工作进程类型,包括sync(默认),eventlet,gevent,tornado,gthread,gaiohttp

6)--backlog INT
最大挂起的连接数

7)--log-level LEVEL
日志输出等级

8)--access-logfile FILE
访问日志输出文件

9)--error-logfile FILE
错误日志输出文件
4.2.1 命令行配置gunicorn参数

当所需配置的参数较少时,我们可以直接在shell中输入启动配置,比如:

gunicorn -w 3 -b 127.0.0.1:5000 app:app

此处app:app中,第一个app为flask项目实例所在的包,第二个app为生成的flask项目实例。

4.2.2 文件配置gunicorn参数

当参数较多或者不方便使用命令行时,我们也可以将参数写在配置文件中,下面举列说明配置文件 gunicorn/config.py 的写法。

bind = "127.0.0.1:5000"
workers = 2

运行以下命令:

gunicorn -c gunicorn/config.py app:app

看到如下信息表明运行成功:

xxx@xxx:~/projects/project_name$ gunicorn -c gunicorn/config.py app:app
[2021-10-13 17:19:41 +0800] [19950] [INFO] Starting gunicorn 20.1.0
[2021-10-13 17:19:41 +0800] [19950] [INFO] Listening at: http://127.0.0.1:5000 (19950)
[2021-10-13 17:19:41 +0800] [19950] [INFO] Using worker: sync
[2021-10-13 17:19:41 +0800] [19968] [INFO] Booting worker with pid: 19968

也可以使用 nohup 使应用始终保持后台运行,并记录相应的日志信息:

nohup gunicorn -c  $(pwd)/config.py app:app &> ./logs/uwsgi.log &

运行结果和使用命令行参数结果一样。

gunicorn配置文件是一个python文件,因此可以实现更复杂的逻辑,如下:


import logging
import logging.handlers
from logging.handlers import WatchedFileHandler
import os
import multiprocessing

bind = '127.0.0.1:5000'

backlog = 512
timeout = 30

worker_class = 'gevent'
workers = multiprocessing.cpu_count() * 2 + 1
threads = 2

loglevel = 'info'
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'

"""
其每个选项的含义如下:
h          remote address
l          '-'
u          currently '-', may be user name in future releases
t          date of the request
r          status line (e.g.  / HTTP/1.1)
s          status
b          response length or '-'
f          referer
a          user agent
T          request time in seconds
D          request time in microseconds
L          request time in decimal seconds
p          process ID
"""
accesslog = "/log/access.log"
errorlog = "/log/error.log"

5、访问web服务器

访问地址:127.0.0.1:5000/hello
查看相关页面可查看是否启用成功。

基于gunicorn部署flask项目

; 6、结束gunicorn服务进程

使用 ps -ef | grep gunicorn 命令找出gunicorn所有进程。

[root@VM_0_12_centos ~] ps -ef|grep gunicorn
xxx   19950 17074  0 17:13 pts/2    00:00:00 /home/xxx/anaconda3/bin/python /home/xxx/anaconda3/bin/gunicorn -c gunicorn/config.py app:app
xxx   19968 19950  0 17:13 pts/2    00:00:00 /home/xxx/anaconda3/bin/python /home/xxx/anaconda3/bin/gunicorn -c gunicorn/config.py app:app
xxx   20264 20141  0 17:13 pts/1    00:00:00 grep --color=auto gunicorn

然后使用 kill -9 进程ID 命令来杀掉相关进程

[root@VM_0_12_centos ~] kill -9 19950
[root@VM_0_12_centos ~] kill -9 19968
[root@VM_0_12_centos ~] ps -ef | grep gunicorn

杀掉进程后,稍等几秒,再使用ps -ef | grep gunicorn查看,发现gunicorn服务进程已全部杀掉。

【参考博客】:

Original: https://blog.csdn.net/u012856866/article/details/119384985
Author: 酒酿小圆子~
Title: 基于gunicorn部署flask项目

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/744945/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球