欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

使用 gunicorn 部署 flask 项目

最编程 2024-03-29 16:03:53
...

使用gunicorn部署flask项目

1、WSGI协议

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

2、WSGI容器

常用的WSGI容器有Gunicorn和uWSGI,但Gunicorn直接用命令启动,不需要编写配置文件,相比uWSGI要容易很多。所以,这里我也选择用Gunicorn作为容器。

3、gunicorn介绍

gunicorn是一个python语言的、wsgi协议的http server,只支持在Unix系统上运行,来源于Ruby的unicorn项目。Gunicorn使用prefork master-worker模型(在gunicorn中,master被称为arbiter),能够与各种wsgi web框架协作。

4、gunicorn安装

gunicorn安装非常简单,使用命令pip install gunicorn即可。之所以选择它,主要是为了使用其异步的worker模型,还需要安装对应的异步模块。

$ pip install greenlet # 使用异步必须安装
$ pip install eventlet # 使用eventlet workers
$ pip install gevent   # 使用gevent workers

5、gunicorn使用

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

如下例子,保存为app.py。

# app.py
from flask import Flask  
  
def create_app():  
    app = Flask(__name__)  
    return app  
app = create_app()  
  
@app.route('/')  
def index():  
    return 'hello world!' 

if __name__ == '__main__':  
    app.run()

在shell中输入启动命令,比如:

$ gunicorn -w 3 -b 127.0.0.1:8080 app:app
# 此处app:app中,第一个app指的是flask项目中app.py文件,第二个app指的是flask应用的名称。

这样,就可以启动服务器了。

5.1 gunicorn命令的参数详解

-c CONFIG: CONFIG配置文件的路径,通过配置文件启动;一般生产环境使用。

-b ADDRESS: ADDRESS,ip加端口,绑定运行的主机。

-w INT, --workers INT:用于处理工作进程的数量,为正整数,默认为1。

-k STRTING, --worker-class STRTING:要使用的工作模式,默认为sync异步,可以下载eventlet和gevent并指定。

--threads INT:处理请求的工作线程数,使用指定数量的线程运行每个worker。为正整数,默认为1。

--worker-connections INT:最大客户端并发数量,默认情况下这个值为1000。

--backlog int:未决连接的最大数量,即等待服务的客户的数量。默认2048个,一般不修改。

-p FILE, --pid FILE:设置pid文件的文件名。如果不设置,将不会创建pid文件。

--access-logfile FILE:要写入的访问日志目录。

--access-logformat STRING:要写入的访问日志格式。

--error-logfile FILE, --log-file FILE:要写入错误日志的文件目录。

--log-level LEVEL:错误日志输出等级。

--limit-request-line INT:HTTP请求头的行数最大值,此参数用于限制HTTP请求行的允许大小,默认情况下,这个值为4094。值是0~8190的数字。

--limit-request-fields INT:限制HTTP请求中请求头字段的数量。此字段用于限制请求头字段的数量,以防止DDOS攻击。默认情况下,这个值为100,这个值不能超过32768

--limit-request-field-size INT:限制HTTP请求中请求头的大小,默认情况下这个值为8190字节。值是一个整数或者0,当该值为0时,表示将对请求头的大小不做限制。

-t INT, --timeout INT:超过这么多秒后,工作进程将被杀掉,并重新启动。一般设定为30秒。

--daemon:是否以守护进程启动,默认false。

--chdir:在加载应用程序之前,切换目录。

--graceful-timeout INT:默认情况下,这个值为30。在超时(从接收到重启信号开始)之后,仍然活着的工作进程将被强行杀死;一般使用默认值。

--keep-alive INT:在keep-alive连接上等待请求的秒数,默认情况下值为2。一般设定在1~5秒之间。

--reload:默认为False。此设置用于开发,每当应用程序发生更改时,都会导致工作进程重新启动。

--spew:打印服务器执行过的每一条语句,默认False。此选择为原子性的,即要么全部打印,要么全部不打印。

--check-config:显示现在的配置,默认值为False,即显示。

-e ENV, --env ENV:设置环境变量。

5.2 gunicorn.conf配置文件详解

#预加载资源
preload_app = True

# 并行工作进程数
workers = 5

# 指定每个工作者的线程数
threads = 4

# 端口 5000
bind = '127.0.0.1:5006'

# 设置守护进程,将进程交给supervisor管理
daemon = 'false'

# 工作模式协程
worker_class = 'gevent'

# 设置最大并发量
worker_connections = 2000

# 设置进程文件目录
pidfile = '/var/run/gunicorn.pid'

# 设置访问日志和错误信息日志路径
accesslog = "/home/tanzhihao/3dview_remote/gunlog/access.log"
errorlog = "/home/tanzhihao/3dview_remote/gunlog/error.log"

# 设置日志记录水平 
loglevel = 'warning'

以gunicorn.conf配置文件方式启动应用,命令为:

gunicorn -c gunicorn.conf app:app

6、绑定端口

linux通常会禁止绑定1024以下的端口,除非root用户权限。很多人在使用gunicorn时,试图将其绑定到80或者443端口,结果是无效的。如果想绑定到这些端口,常见的有如下的几种方法:

  • 使用nginx代理转发。

  • sudo启动gunicorn。

  • 安装额外的程序。

7、结束gunicorn服务进程

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

[root@VM_0_12_centos ~]# ps -ef | grep gunicorn
root     16843 23035  0 Oct14 ?        00:00:02 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
root     22445 23035  0 Oct04 ?        00:00:15 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
root     22581 23035  0 Oct11 ?        00:00:05 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
root     23035     1  0 Sep27 ?        00:04:11 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app

然后,使用 “kill -9 进程ID” 命令来杀掉进程。注意,我们杀掉主进程即可,子进程会随之结束。在上例中,主进程号为23035.

[root@VM_0_12_centos ~]# kill -9 23035
[root@VM_0_12_centos ~]# ps -ef | grep gunicorn

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