因为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

正向代理服务器软件

  • cgi-proxy
  • phproxy (中断了)
  • glype
  • Internet censorship wiki: List of Web Proxies

反向代理服务器软件

  • apache mod_proxy
  • squid
  • HAProxy
  • perlbal
  • portfusion
  • pound

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

  • balance
  • delegate
  • pen
  • portfusion
  • pure load balancer
  • python director

转载于:https://www.cnblogs.com/louis-w/p/9413751.html

【Django】uWSGI和Gunicorn【转】相关推荐

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

    关于 WSGI.uwsgi和uWSGI的区别及基于 uWSGI和gunicorn 部署python web 简述 引言 最近基于 Flask Web框架在开发一个后端项目,在Web Server和 F ...

  2. 如何让nginx执行python代码_生产环境部署Python语言代码(django+uwsgi+nginx)

    本文主要向大家介绍了生产环境部署Python语言代码(django+uwsgi+nginx),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 基础环境不做介绍,在django开发w ...

  3. django+uwsgi+nginx部署

    最近线上部署运维工单系统,使用django+uwsgi+nginx部署,发现这篇文章,很详细,觉得不错,转载一下: 写了那么长时间的django,一直没跟nginx结合一下,访问的时候老是得加端口号, ...

  4. [转]Docker部署Django由浅入深系列(下): 八步部署Django+Uwsgi+Nginx+MySQL+Redis

    在上篇教程中,我们手动构建了两个容器,一个容器放Django + Uwsgi,另一个容器放Nginx,成功部署了一个简单的Django项目.然而在实际的生产环境中,我们往往需要定义数量庞大的 dock ...

  5. Django + Uwsgi + Nginx 实现生产环境部署1

    项目开发完毕后,需要将代码放到服务器上,这样用户才能访问.接下来我们一步一步来进行一波部署操作. 1. 简单粗暴 项目开发完毕,在部署之前需要再配置文件中将 ALLOWED_HOSTS配置设置为:当前 ...

  6. Django + Uwsgi + Nginx 实现生产环境部署

    uwsgi介绍 uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. 要注意 WSGI / u ...

  7. Docker部署Django由浅入深系列(中): 双容器部署Django + Uwsgi + Nginx

    本文是使用Docker部署Django由浅入深系列的中篇,我们将构建两个容器,一个容器放Django + Uwsgi,另一个容器放Nginx.我们将了解不同容器间是如何通信的,并学会正确配置uwsgi ...

  8. CentOS7.2 Django + uwsgi + Nginx 部(cǎi )署(kēng)指(zhī)南(lǜ)

    在此之前笔者也是使用 python manage.py runserver 来运行服务器,这只适用测试环境中使用.正式发布的服务,我们需要一个可以稳定而持续的服务器,比如apache, Nginx, ...

  9. 【django云服务器部署】django+uwsgi+nginx 部署的完整流程

    本篇博客完整地记录了我从购买服务器到完成部署的全过程,需要的朋友可以参考一下我的流程,看这一篇文章就能成功部署项目啦. 写这个的本意是为备忘( 保姆级步骤),同时由于我在最开始部署项目时,没有找到一个 ...

  10. Centos django+uwsgi+nginx部署

    Centos django+uwsgi+nginx部署 安装Python CentOS 7 Linux发行版默认包含Python 2.但是,Python 2将于2020年1月1日停产.尽管一些遗留应用 ...

最新文章

  1. C++中getline()的用法
  2. Spring、Spring MVC、Spring Boot三者的关系还傻傻分不清楚?
  3. 你花了多久弄明白架构设计?kafka日志清理
  4. 钱趣多风控新举措:源头选择与物理隔离
  5. kylin linux 安装教程,新手入门必备:kylin安装教程介绍!
  6. java process exit_Java Process exitValue()方法
  7. HashMap(摘)
  8. 12v电流表的正确接法_滑动变阻器的分压与限流接法
  9. gitlab汉化及关联LDAP
  10. windows端口被占用及广告弹窗处理
  11. 中台方法论及案例集合
  12. win10红警2黑屏_Windows10黑屏常见情况及解决办法
  13. 刚斩获头条美团的offer,Java开发面试题详解(带答案)
  14. JavaScript学习笔记(25) JavaScript.then()这个方法是什么意思?
  15. windows故障转移群集 文件服务器,为服务器故障转移群集中的 IIS Windows FTP - Windows Server | Microsoft Docs...
  16. 我用 python 做了款可开淘宝店赚钱的工具!
  17. YII模板(前台显示)详细分析
  18. RK3588平台开发系列讲解(进程篇)进程的简介
  19. ServU 11 以上版本的数据库用户关联 密码加密原理
  20. 南邮计算机学院专业英语教材,南邮专业英语翻译(自学)

热门文章

  1. java极简使用FastFDFS文件服务器上传图片
  2. ZZULIOJ 1188: 选票统计(一)(结构体专题)
  3. 初识云计算————云计算概念
  4. document操作自定义属性
  5. Aspose.Words for .NET使用教程:如何使用脚注和尾注并设置每页行字数
  6. vue单页面应用初始加载登录页_6 种 Vue 权限路由实现方式总结(最全)
  7. 分销系统如何加粉,三级分销政策,B2B2C分销规则
  8. 基于STM32F103C6T6HAL库控制SG90舵机
  9. 用 Seaborn 做数据可视化(1)——绘图功能(1)可视化统计关系:sns.relplot()
  10. aec一pc_什么是AEC声学回声消除器?