使用gunicorn部署flask项目 - SSB4455/ownArticleSome GitHub Wiki

使用gunicorn部署flask项目

  1. WSGI协议

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

  1. WSGI容器

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

  1. gunicorn介绍

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

  1. gunicorn安装

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

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

5、gunicorn使用 这里使用gunicorn来部署一个flask项目举例,此处flask框架的使用不过多阐述,不是本文的重点。 如下例子,保存为app.py

from flask import Flask
app = Flask(__name__)

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

gunicorn通常使用的参数如下:

 -c CONFIG, --config=CONFIG
# 设定配置文件。-b BIND, --bind=BIND
# 设定服务需要绑定的端口。建议使用HOST:PORT。-w WORKERS, --workers=WORKERS
# 设置工作进程数。建议服务器每一个核心可以设置2-4个。-k MODULE
# 选定异步工作方式使用的模块。
‘’‘

在shell中输入你的启动配置,比如:

```bash
$ gunicorn **-**w 3 **-**b 127.0**.**0.1:8080 app:app
#*此处app:app中,第一个app为flask项目实例所在的包,第二个app为生成的flask项目实例*

这样运行正常就可以启动服务器了。

上述命令代表的是使用 3个 worker 进程来运行 Flask 应用,绑定到 本地的 8080 端口。

gunicorn 其实还有非常多的配置项,可以通过gunicorn -h查看。

实际上,由于运行时需要指定的配置项很多,通过命令的方式运行Gunicorn就会非常麻烦,通常会把配置项写入 gunicorn.config.py 文件来进行指定。 如:

import multiprocessing

bind = "0.0.0.0:5000"
workers = multiprocessing.cpu_count()*2 + 1
threads = 10

# 日志配置
loglevel = "debug"
accesslog = './log/access.log'
errorlog = './log/error.log'

preload_app = True
daemon = True

以上配置了日志、工作模式等配置项,把工作模式设置成了 gevent, 是基于Python 第三方库 gevent 的异步工作模式,除此之外,还有sync、eventlet、tornado、gthread,默认是sync。

配置完成后,使用gunicorn app:app -c ./gunicorn.config.py命令即可使用 gunicorn 运行 Flask 服务。

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服务进程已全部杀掉。

部署: 部署时外网无法访问是真的坑,搞了好久,网上的答案都是你抄我,我抄你,百度了半天都一个样,也没解决问题, 具体是:

from flask import Flask
app = Flask(__name__)

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

if __name__ == '__main__':
    app.run(host='0.0.0.0',port=5000)
  • 假如你是买的云服务器(阿里/腾讯/华为等等),记得把端口安全组打开,这个每一家的打开都不太一样,略去不表。
  • 设置host为0.0.0.0, 设置gunicorn的配置
bind = "0.0.0.0:5000"
daemon = True

这两行代码是:默认ip可以访问,和后台运行,守护进程方式,就是类似于Linux的nohup 这样的话开始启动gunicorngunicorn -c 配置文件.py 执行文件名:app 查询:ps aux|gerp gunicorn,假如有进程就是运行了。

Untitled

然后外网访问时写的是你云服务器公网ip:

2024-04-09