python web开发之gunicorn 和 uWSGI 对比和配置

news2024/10/6 8:39:08

关于uWSGI的定义,在上一篇文章中写了,链接:WSGI/uwsgi/uWSGI详解

 python开发常见的容器就只有的uWSGI和Gunicorn,本文介绍两者的区别和配置

1. 共同点

在架构上,nginx负责动态的转发和静态文件的直接访问,gunicorn和uwsgi作为网关服务用来解析http请求,后面的flask只是个application而已,没有server的服务特征。

Gunicorn 和 uWSGI,Nginx都是基于perfork模型的WSGI服务器。(perfork是一种服务端编程模型,简单的说perfok就是master进程启动注册一堆信号处理函数, 使用master进程来监控worker进程状态, 避免了我们使用supervisor来监控进程, 还支持多种信号来控制worker的数量, 使得CPU能充分得到利用, 多个worker进程监听同一端口, 可以配置reuse_port参数在worker进程间负载均衡。)

Gunicorn与uWSGI都支持reuse_port选项, 在使用时可以通过压测来评估一下reuse_port是否能提升性能.

一般我们会在Gunicorn/uWSGI前面再加一层Nginx, 这样做的原因有一下几点:(nginx是通过多个进程轮流持锁的方式来避免epoll accept唤醒问题)

  • 做负载均衡
  • 静态文件服务器
  • 更安全
  • 高并发

2. 使用场景

gunicorn是长连接的,uwsgi要启用 –http-keepalive 模式才是长连接请求。

Gunicorn是使用Python实现的WSGI服务器, 直接提供了http服务, 并且在woker上提供了多种选择, gevent, eventlet这些都支持, 在多worker最大化里用CPU的同时, 还可以使用协程来提供并发支撑, 对于网络IO密集的服务比较有利.

在针对长连接的服务时, 最好开启reuse_port, 避免worker进程负载不均。

 uWSGI是使用C写的, worker进程的启动都是使用C语言系统接口来实现的, 在worker进程处理循环中, 解析了http请求后,使用python的C接口生成environ对象, 再把这个对象作为参数,塞到暴露出来的WSGI application函数中调用,而这一切都是在C程序中进行,只是在处理请求的时候交给python虚拟机调用application,完全使用C语言实现的好处是性能会好一些。

一般在uWSGI服务器前面使用Nginx作为负载均衡,如果使用http协议,请求在转发到uWSGI前已经在Nginx这里解析了一遍,转发到uWSGI又会重新解析一遍。uWSGI为了追求性能,设计了uwsgi协议,在Nginx解析完以后直接把解析好的结果通过uwsgi协议转发到uWSGI服务器,uWSGI拿到请求按格式生成environ对象,不需要重复解析请求。如果用Nginx配合uWSGI,最好使用uwsgi协议来转发请求。

除了是一个WSGI服务器,uWSGI还是一个开发框架,它提供了缓存、队列、rpc等等功能。一般也只是把uWSGI当作WSGI服务器来用。

3.gunicorn 配置

启动方式:
gunicorn -w 3 -b 127.0.0.1:5000 app:app -k gevent

对于高并发的场景下,如果支持unix domain socket 模式,最少可以省略tcp的计算校验,这样性能有不少的提升。gunicorn wsgi相比uwsgi的协议相比,可以使传输的协议层更加的紧凑。

如果是在项目里使用,配置较为齐全的,请参考上一篇链接python之gunicorn的配置

4.uWSGI 配置

启动方式:
/usr/local/bin/uwsgi  --gevent 500 --gevent-monkey-patch  --http 127.0.0.1:5000  --callable app --wsgi-file app.py --http-keepalive --master

uwsgi会启动两组端口port, 一个是5000 ,一个是5300x ,  端口5000是我们已知的,这个端口用来直接对外接收请求的,他在构建完一个请求协议包之后,会connect 到 5300x 端口, 平白的多消耗了一些网络io。这种模式是 rep req模型,我能想到的优点是,他避免了因为listen fd事件的到来把其他进程唤醒的问题。 也就是说,只有5000对外,5300x是真正的worker。 端口5000根据一定的算法来选择worker。 5000 和 5300x的数据交互方式是 可压缩可序列化的tcp报文,有兴趣的可以抓包看看。

如果是在项目里使用,配置较为齐全的,请参考: 链接

uwsgi相关配置

参考链接:

https://www.cnblogs.com/aaron-agu/p/12317970.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/783217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三、万物皆对象(2)

本章概要 类的创建 类型字段基本类型默认值方法使用 返回类型参数列表 程序编写 命名可见性使用其他组件static 关键字 小试牛刀 编译和运行 编码风格 类的创建 类型 如果一切都是对象,那么是什么决定了某一类对象的外观和行为呢?换句话说&#xff…

2023年华数杯数学建模竞赛ABC题思路代码论文资料汇总贴

下文包含:2023华数杯数学建模竞赛ABC题思路解析代码参考论文等及如何准备数学建模竞赛 C君将会第一时间发布选题建议、所有题目的思路解析、相关代码、参考文献、参考论文等多项资料,帮助大家取得好成绩。2023华数杯数学建模竞赛于8月3号下午6点正式开赛…

Origin科学绘图分析软件2023最新版下载安装教程

在科学研究和工程领域,数据的处理和分析是至关重要的一环,而Origin则是这方面的一款重要工具。Origin软件是由OriginLab公司开发的,主要用于各种科学数据的处理和分析,以及高质量的科学图形的创建。#乐享周末分享吧# 下载地址文末…

Spring Cloud Eureka 服务发现速度慢配置优化总结

文章目录 一、 Eureka-server 服务端缓存问题1.1 服务端缓存1.2 客户端从服务端获取实例数据的过程1.3 优化 二、客户端 Eureka-client 缓存导致2.1 Eureka客户端和服务端交互缓存2.2 Ribbon 缓存了EurekaClient的缓存2.3 优化 使用Eureka时,常常会发现服务发现慢&a…

Stable Diffusion 本地部署教程

1.前言: 最近看Stable Diffusion开源了,据说比Disco Diffusion更快,于是从git上拉取了项目尝试本地部署了,记录分享一下过程~ 这里是官网介绍:https://stability.ai/blog/stable-diffusion-public-release 2.必要前提…

jar 更新 jar包内的 class,以及如何修改class

一、提取Jar 内文件 #提取jar内的配置文件jar -xvf a.jar META-INF\plugin.xml-已解压: META-INF/plugin.xml#提取jar内的class文件, 提示:反编译为java文件,修改后再使用javac xxx.java编译为class,jar -xvf a.jar io.config.**…

三维测量技术在高端精密制造中的应用

科技创新是新时代的重要发展动力。三维测量技术以精密机械为基础,综合应用了电子技术、计算机技术、光学技术和数控技术等先进技术,可以对机械、汽车、航空、家具、工具原型等测量出高精度的几何零部件以及测量复杂形状的机械零部件,给各行业…

Autosar IOC机制(核间通信)

文章目录 一、IOC二、诊断代码实例一、IOC IOC和操作系统紧密相关,是操作系统实现的一部分 ①ECU间通信:通过通信协议栈定义好的API进行通信,通俗来讲就是通过总线(CAN/LIN/Flexlay)进行通信。 ②OS-Application内SWC间的通信:通过RTE处理。 ③OS-Application间的通信:通信…

【iOS】自定义字体

文章目录 前言一、下载字体二、添加字体三、检查字体四、使用字体 前言 在设计App的过程中我们常常会想办法去让我们的界面变得美观,使用好看的字体是我们美化界面的一个方法。接下来笔者将会讲解App中添加自定义字体 一、下载字体 我们要使用自定义字体&#x…

JQuery全部过滤选择器详细介绍下

文章目录 JQuery全部过滤选择器详细介绍-下属性过滤选择器● 属性过滤选择器-应用实例代码演示 子元素过滤选择器● 子元素过滤选择器基本介绍5. nth-child() 选择器详解如下:● 子元素过滤选择器示例-应用实例代码演示 表单属性过滤选择器● 此选择器主要对所选择的…

壹牛NFT数字艺术藏品数藏系统源码 全开源

这套源码小白大致测试了一下发现几点问题,uniapp少了几个文件不能编译只能用public/h5里面web端,后台账号密码似乎不正确,这类源码挺少的感兴趣的自己下来研究修复一下吧。 壹牛NFT数字艺术藏品数藏系统源码 全开源 这个版本新增了不少功能&#xff0c…

动态规划入门第2课,经典DP问题1 --- 线性

动态规划要点 阶段的2个方向:从上到下;从下到上。 动态规划要点 从递归到DP 动态规划要点 两个2个方向 优化的可能性 第1题 合唱队形 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形…

Apple M1 Pro macOS 切换中文输入法卡住

(macOS 在切换中文输入法时出现卡住的情况 1,切换为中文输入法后再次卡住2,杀死 简体中文输入方式的进程参考 将光标移到菜单栏的输入法切换为英文输入法 多次切换为英文输入法,可以切换为英文输入法 切换为英文输入法后电脑不卡顿了&#xf…

基于springboot+jpa+mysql+html网上商城系统

基于springbootjpamysqlhtml网上商城系统 一、系统介绍二、功能展示1.主页(客户)2.登陆(客户)3.注册(客户)4.购物车(客户)5.我的订单(客户)6.用户管理(管理员)7.分类管理&#xff08…

iOS--编译链接的过_1

iOS 开发中使用的是编译语言,所谓编译语言是在执行的时候,必须先通过编译器生成机器码,机器码可以直接在CPU上执行,所以执行效率较高,是使用 Clang / LLVM 来编译的。LLVM是一个模块化和可重用的编译器和工具链技术的集…

Java基本数据类型默认初始化值测试

1.基本数据类型为成员变量 public class Test {boolean b;char c;byte bt;short s;int i;long l;float f;double d;public static void main(String[] args) {Test t new Test();System.out.println("boolean类型默认值:" t.b);System.out.println(t.c…

Android 中 cgroup抽象层详解

源码基于:Android R 0. 前言 在之前的博文《Android中app freezer原理》一文中,我们看到冻结器的enable、freeze、unfreeze 都是通过 cgroup 的机制进行处理。 本文将介绍下 Android 中 cgroup 的抽象层基本信息和使用方式。 1. cgroups 简介 cgroups…

Linux常用命令——dump命令

在线Linux命令查询工具 dump 用于备份ext2或者ext3文件系统 补充说明 dump命令用于备份ext2或者ext3文件系统。可将目录或整个文件系统备份至指定的设备,或备份成一个大文件。 语法 dump(选项)(参数)选项 -0123456789:备份的层级; -b&…

layui框架学习(32:表单)

Layui中的分页模块laypage支持在指定的容器中显示分页信息,主要是指总页数、当前页面、上一页/下一页等信息,可以配合其它组件实现分页显示数据或者分页显示内容,事实上,Layui中的动态数据表格等模块都附带有显示分页功能。laypag…

hive之文件格式与压缩

hive文件格式: 概述: 为Hive表中的数据选择一个合适的文件格式,对提高查询性能的提高是十分有益的。Hive表数据的存储格式,可以选择text file、orc、parquet、sequence file等。 文本文件: 文本文件就是txt文件&…