uWSGI和Gunicorn

因为nginx等优秀的开源项目,有不少本来不是做服务器的同学也可以写很多服务器端的程序了。但是在聊天中会发现,大家虽然写了不少代码,但是对wsgi是什么,gunicorn是什么,反向代理又是什么并不了解,也就是说对基本概念并没有一个全局的了解。

服务器

到了服务器组你会发现原来有各种各样的服务器,那些叫法很多是有历史沉淀的,不需要太深究能对上号就行,因为本来也是乱七八糟的。

HTTP服务器

如果网站是HTML/CSS/JS(不包括node.js这种SSJS)组成的,那么这是一个静态的网站。

用户访问这个网站的时候,HTTP请求被浏览器发送,经过DNS等被送到网站的服务器。服务器处理HTTP请求,将浏览器能够处理的响应返回给用户的浏览器。所以这个场景下的服务器一般被称为HTTP服务器,常见的有Apache的httpd和Nginx。

Application服务器

如果你的网站是动态的,比如是用Django写的。

那么客户端上来的请求要能够被Djano的Application处理。WSGI就是这样的一个协议:它是一个Python程序和用户请求之间的接口。WSGI服务器的作用就是接受并分析用户的请求,调用相应的python对象完成对请求的处理,然后返回相应的结果。

WSGI服务器的选择很多,包括uWSGI和gunicorn。它们都可以处理所有的请求,包括确实应该由python对象处理的,也包括不该python对象处理的,比如静态的图像,css,js等文件。所以理论上你可以把整个动态网站都用WSGI服务器承载起来,也就是整个应用完全跑在Application服务器上。

代理服务器

代理无非是A来做B干的事情。在服务器语境下,代理就是一台服务器干另外一台服务器的事情。这个是平常不会有很多人聊到的,多说两句。

前向代理服务器

大多数的代理都是前向代理。假设网络上有三台机器:

  • X:你的电脑
  • Y:代理服务器,proxy.eg.org
  • Z:你实际想访问的服务器,www.eg.org

没有代理的情况下,访问是 X--->Z,但是在某些情况下,访问者会先让代理服务器从实际放内容的服务器把数据取回来,也就是X--->Y,然后Y---->Z,最后X---->Y 。

这里说的某些情况下典型的包括(作为天朝网民你居然没有领悟我很失望):

X的网络管理员封了Z

  • Z可能是一个臭名昭著的病毒网站:familypostcard2008.com
  • Z可能是一个让你上班精力分散的网站:Facebook.com
  • Z可能是一个让你明白真相的网站:Hmmmm

Z的网络管理员封了X

  • Z可能是一个论坛或者blog什么的,X在对它进行扫描
反向代理服务器

没有代理的情况下,访问仍然是 X--->Z,但是在某些情况下,Z的管理者决定限制资源被直接访问。用户必须现在Y上做访问,Y再访问Z。整个流程是X--->Y,然后Y---->Z,最后X---->Y 。

没错,细心的你注意到了,前向和反向代理服务器的流程都是X-->Y-->Z。没办法,代理就是这么个意思。它们两者的核心区别在于,用户对反向代理服务器的存在是无感的。换句话说,X不需要做特别的配置甚至不需要察觉Y的存在,就可以使用Y这个反向代理。这种请求方无感而被请求方反过来提供代理服务就是“反向”的意义所在。

使用反向代理的典型场景当然是Z希望所有发给自己特定请求都从Y过一遍:

  1. Z可能是一个超大的网站,每天有全世界各地的用户在访问。于是Z搭建了一个反向代理,把某个地域的用户的访问导入到离他最近的服务器上去处理。没有错,这就是CDN。
  2. Z可能是一个坏坏的网站。它的拥有者希望把坏坏的数据放到特定的服务器,然后核心数据放到别的服务器。比如黄色网站,一般那些色情的内容放在一些专门的服务器上,即使被查封,也不会对其业务产生决定性的影响。

继续我们前面的例子,很快你会发现uWSGI等应用服务器处理静态文件的请求的performance很废材,于是开始寻找直接用nginx来处理静态内容的办法。那么你就需要区分哪些请求是请求的静态页面,哪些是请求的动态内容。

然后你就会发现,原来nginx不止是一个HTTP服务器,它还是一个反向代理服务器:它可以把请求重定向到uWSGI或者任何别的服务器,然后把下游服务器的响应集成再返回给用户。于是你就可以配置对静态内容的请求直接在nginx完成,而动态内容的请求发送给uWSGI服务器。

负载均衡服务器

在我自己的心中,负责均衡服务器不过是反向代理的一种(你看CDN我也觉得是反向代理的一种),但是很多地方这种服务器是被拿出来专门讨论的。

随着你的网站访问量不断增大,你用一个nginx集中所有的请求再分发就显得性能不够了。这个时候你可以配置专门用于进行请求分发处理的负载均衡服务器,比如HAProxy,而负载均衡服务器背后是集群。

缓存服务器

随着网站访问量的继续增大,你的VPS流量又扛不住了。你调查发现有一些多媒体文件被经常请求,这个时候你部署了缓存服务器。

“缓存"这个经常被提到的术语,核心就是把常用的信息放在一个读取成本很低地方(比如内存中或者是虚拟内存中),从而避免每次查找它的时候昂贵的操作。比如HTTP缓存解决的是在服务器上找信息的过程,而Redis或者Memcached这些缓存则是解决在数据库里面找信息的过程。

那,我们为什么需要uwsgi或者gunicorn?

一句话:因为你需要有东西在服务器上运行Python,但是Python不是处理所有的请求都很强。

那么是选uWSGI还是Gunicorn?我觉得都可以,还是那句老话,不是它们好不好的问题,是你够不够好的问题,毕竟代码都摆在那里的。

不过Gunicorn可以多说几句。它的崛起在我看来是有时代背景的:在过去,我们部署一个应用的时候,几乎总是要分布在多台机器的(比如4台HTTP服务器把动态请求分发到两台Application服务器上,并且它们都访问一个数据库服务器)。但是随着机器的能力在增强,而互联网应用的覆盖面从业务逻辑极其复杂的银行业电信业到了送盒饭选泡面的小行业,越来越多的Application服务器和Web服务器合体了(以django圈子举例,有httpd+mod_wsgi或者Nginx+mod_uwsgi)。而且很多时候这种小应用的数据库也host在同一台机器上。

Gunicorn(从Ruby下面的Unicorn得到的启发)应运而生:依赖Nginx的代理行为,同Nginx进行功能上的分离。由于不需要直接处理用户来的请求(都被Nginx先处理),Gunicorn不需要完成相关的功能,其内部逻辑非常简单:接受从Nginx来的动态请求,处理完之后返回给Nginx,由后者返回给用户。

由于功能定位很明确,Gunicorn得以用纯Python开发:大大缩短了开发时间的同时,性能上也不会很掉链子。同时,它也可以配合Nginx的代理之外的别的Proxy模块工作,其配置也相应比较简单。

配置上的简单,大概是它流行的最大的原因。

Good Refs

正向代理服务器软件

反向代理服务器软件

TCP上的反向代理服务器软件

转自:https://lenciel.com/2013/08/why-you-need-something-like-gunicorn/

时间: 2024-10-31 06:28:34

uWSGI和Gunicorn的相关文章

如何使用Nginx和uWSGI或Gunicorn在Ubuntu上部署Flask Web应用

我在很多的博客中都看过有关Flask应用的部署,也有很多博主在开博后都记录了部署的教程,因为其中的坑可以说不少.一开始我在网上看到相比较与Ubuntu,CentOS因为更新少作为服务器的操作系统会更加稳定.所以在第一次购买云服务器时,我选择了CentOS,后来由于CentOS不同发行版的Nginx缘故,我又换成了Ubuntu的镜像 首先呢,我们先来了解下关于Web服务器与Web应用还有WSGI之间的联系 一.介绍 WSGI(Web Server Gateway Interface),翻译为Pyt

Python Web开发 - WSGI & uWSGI协议

WSGI协议 首先弄清下面几个概念:WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通信的规范.server和application的规范在PEP 3333中有具体描述.要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有Bottle, Flask, Djang

Gunicorn 配置参数

在之前的文章中有记录WSGI容器的作用,以及我们知道常见的容器就只有的uWSGI和Gunicorn,在之前的文章中有记录他们的特性及优缺点,在这就不在多做描述.接下来将着重记录一下Gunicorn的一些配置: config -c CONFIG, --config CONFIG Gunicorn配置文件路径,路径形式的字符串格式,如: gunicorn -c gunicorn.conf manager:app 1 bind -b ADDRESS, --bind ADDRESS Gunicorn绑定

知名网络后端开源软件集合

缓存系统:memcached(group cache).redis.mongodb.Couchbase(CouchDB.Membase.CouchOne) http缓存:varnish.nginx.traficserver.squid 负载均衡:lvs.f5.nginx 代理:nginx 集群操作系统(运行在单机系统上):Mesos 集群管理:Kubernetes Web服务器:nginx.lighthttpd.apache.tengine WSGI实现: uWSGI.gunicorn Web框

用Python的Supervisor进行进程监控以及自动启动

做服务器端开发的同学应该都对进程监控不会陌生,最近恰好要更换 uwsgi 为 gunicorn,而gunicorn又恰好有这么一章讲进程监控,所以多研究了下. 结合之前在腾讯工作的经验,也会讲讲腾讯的服务器监控是怎么做的.同时也会讲下小团队又该怎么敏捷的解决. 下面按照监控的方法依次介绍. 一.按照进程名监控 在腾讯内部所有server都是要打包发布的,而在打包过程中是需要填写要监控的进程名,然后在crontab中定时通过ps查询进程是否存在. 这种方法是比较简单的方法,但是考虑到很多进程会在启

Django、Tornado、Web.py比较与选用

本人目前并没使用Tornado与Web.py的经验,也没有做过专门的研究.本文的内容主要是对网上主流的做了归纳与综合. 开发blog django省力,定义models, 写个前台基本就搞定了. tornado灵活, 不用异步特性单纯作个轻框架写法和webpy也差不多. webpy作者都走了那么久了, 这类单人主导的项目没经历正常过度,等一些现有应用迁出完毕,少量维护者出离, 项目本身就正式宣告死亡了, 完全不该考虑了. Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用

web.py源码分析: application

本文主要分析的是web.py库的 application.py 这个模块中的代码.总的来说, 这个模块主要实现了WSGI兼容的接口,以便应用程序能够被WSGI应用服务器调用 .WSGI是 Web Server Gateway Interface 的缩写,具体细节可以查看 WSGI的WIKI页面 接口的使用 使用web.py自带的HTTP Server 下面这个例子来自官方文档的 Hello World ,这个代码一般是应用入口的代码: import web urls = ("/.*",

day 61 Django part-1 django的安装,以及初学者三件套

老师的笔记: day61 1.前情回顾 1. pymysql 使用: 安装 pip install pymysql 导入 import pymysql 具体使用: 1. 创建连接 conn = pymysql.connect(host="lcoalhost", port=3306, user="", password="", database="", charset="utf8") 2. cursor =

Web框架和Django基础

核心知识点 1.web应用类似于一个socket客户端,用来接收请求 2.HTTP:规定了客户端和服务器之间的通信格式. 3.一个HTTP包含两部分,header和body,body是可选,\r\n分隔头部,\r\n\r\n分隔头部和身体. 4.WSGI:定义了用python编写的web服务程序和web应用程序的接口格式. 5.python标准库提供的独立的协议叫wsgiref,django也是使用它作为环境. 6.Django的目录结构(基本的:settings.py urls.py wsgi