欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于 WSGI、uwsgi和uWSGI的区别及基于 uWSGI和gunicorn 部署python web 简述

程序员文章站 2022-04-29 13:45:00
...

关于 WSGI、uwsgi和uWSGI的区别及基于 uWSGI和gunicorn 部署python web 简述

 

引言

最近基于 Flask Web框架在开发一个后端项目,在Web Server和 Flask 应用程序交互的过程中总会碰到本文题目提及到WSGI、uwsgi和uWSGI这几个概念,整理如下。

WSGI

英文全称:Web Server Gateway Interface,Web服务网管接口,简单来说它是一种Web服务器和应用程序间的通信规范。

uwsgi

uwsgi是一种通信协议,不过跟WSGI分属两种东西,该协议下速度比较快。

uWSGI

uWSGI是一个Web Server,并且独占uwsgi协议,但是同时支持WSGI协议、HTTP协议等,它的功能是把HTTP协议转化成语言支持的网络协议供python使用。

 

虽然 Flask 非常容易上手,它自带的app.run(host="0.0.0.0", port=7001)用来调试非常方便,但是用于生产环境无论是处理高并发还是鲁棒性都有所欠缺,一般会配合WGSI容器来进行[生产环境的部署]

 

uWSGI的使用

在做Django项目时,一般测试开发我们直接用Django内嵌的Web Server即可,但是如果项目要上生产环境,考虑并发等性能时,我们可能需要uwsgi和nginx,下面只说明uwsgi的常用用法,至于nginx的配置笔者后续准备专门写一篇博文来讲。

1. 安装

 

pip install uwsgi

2. 配置

uwsgi执行一般有两种方式:命令行和文件配置,但是命令行可能需要识记很多参数,因此采用文件配置是更通用的做法,文件格式支持很多种比如ini、xml、yaml等,笔者建议还是采用比较简单key-value形式ini模式,下面给出一个简单的uwsgi ini配置实例:

 

[uwsgi]
socket = 127.0.0.1:8001
master = false
chdir = /var/www/cmpvirtmgr/
module = cmpvirtmgr.wsgi
home = /var/www/env
workers = 2
reload-mercy = 10
vacuum = true
max-requests = 1000
limit-as = 512
buffer-size = 30000
pidfile = /etc/uwsgi/uwsgi.pid

执行:uwsgi --ini /path/to/uwsgi.ini

参数解释:

  • socket:socket文件,也可以是地址+端口;
  • master:是否启动主进程来管理其他进程;
  • chdir:项目的根目录;
  • module:wsgi文件相对路径;
  • home:虚拟环境目录;
  • workers:开启的进程数量;
  • reload-mercy:设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长秒数;
  • vacuum:服务结束后时候删除对应的socket和pid文件;
  • max_requests:每个工作进程设置的请求上限;
  • limit_as:限制每个uwsgi进程占用的虚拟内存数目;
  • buffer_size:设置用于uwsgi包解析的内部缓存区大小;
  • pid_file:指定pid文件;
  • harakiri:请求的超时时间;
  • daemonize:进程后台执行,并保存日志到特定路径;如果uwsgi进程被supervisor管理,不能设置该参数;

更多uwsgi参数可参考官方文档:https://uwsgi-docs.readthedocs.io/en/latest/


使用gunicorn部署flask项目

 

1、WSGI协议

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

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 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中输入你的启动配置,比如:

$ gunicorn -w 3 -b 127.0.0.1:8080 app:app
# 此处app:app中,第一个app为flask项目实例所在的启动模块,第二个app为生成的flask项目实例

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

6、绑定端口

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

  • 使用Nginx代理转发。
  • sudo启动gunicorn。
  • 安装额外的程序。

7、结束gunicorn服务进程

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

[[email protected]_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.

[[email protected]_0_12_centos ~]# kill -9 23035
[[email protected]_0_12_centos ~]# ps -ef | grep gunicorn

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