一、Web服务器

Web服务基于HTTP协议,HTTP协议基于TCP/IP协议。

HTTP请求底层必然是套接字,也就是TCP协议,HTTP服务器就是监听端口的一个守护进程。

它负责HTTP连接的建立、根据HTTP协议解析请求等底层处理。

常见的Web服务器有Nginx(俄国造),Apache(Apache造),lighttpd(德国造),IIS(微软造)。

Nginx跟Apache等普通服务器是不一样的,Nginx有反向代理功能,这决定了它可以以一个“大管家”的身份凌驾于其它Web服务器之上。

如果只有Web服务器,那么只能访问静态资源。要想生成动态内容,就需要程序。

二、CGI

CGI即通用网关接口(Common Gateway Interface),是Web服务器和用户程序之间进行交流的一种接口。它是语言无关的。

它的缺点如下:

  • 效率低下:每一个连接 fork 一个进程处理。
  • 功能有限:CGI只能收到一个请求,输出一个响应。不方便对请求进行过滤,比如验证一下用户有没有登录。

三、fastCGI

CGI的缺点是效率低,fastCGI维护一个线程池,效率大大提高,不用每个请求都开辟销毁线程。它也是语言无关的。

四、WSGI

Python Web Server Gateway Interface,类似于CGI,但是它是语言相关的,它只适用于Python。WSGI是Web服务器和Web应用之间进行交流的一种接口

WSGI之于Python相当于Servlet之于Java。

下面举个例子(来自廖雪峰Python教程)

首先,实现一个请求处理函数,写在hello.py中

# hello.py

def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return '<h1>Hello, web!</h1>'

以上代码中:

  • application是处理一切请求的地方,它需要两个参数
  • environ是一个字典,包含请求参数、路径等信息
  • start_response是一个函数指针,它需要返回请求状态码和HTML头部,用于生成HTML的header部分,在我看来,这部分也是可以直接return str产生的,可能是WSGI认为这部分与回复体应该分开。
  • return的内容即为HTML中的内容

要让支持WSGI的服务器来调用上面的函数,最简单的WSGI服务器莫过于wsgiref,这是Python内置WSGI服务器。

# server.py
# 从wsgiref模块导入:
from wsgiref.simple_server import make_server
# 导入我们自己编写的application函数:
from hello import application # 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('', 8000, application)
print ("Serving HTTP on port 8000...")
# 开始监听HTTP请求:
httpd.serve_forever()

运行python server.py,打开浏览器访问localhost:8000即可看到结果。但是在python3中会抛出异常。

五、Servlet

Servlet机制是Java Web的标准,Java Web自成一家,没有采用CGI机制,毕竟CGI机制只有python,php,ruby这些脚本语言才用,Java不屑与之为伍。

狭义的Servlet指处理请求的Java类,广义的Servlet指Servlet运行的容器等与Servlet相关的一切东西。

Servlet统一了Java Web各个框架,像struts,spring MVC等框架底层都是Servlet。

同理,WSGI也统一了Python Web各个框架,像Django、Flask、web.py等框架底层都是WSGI,只要是实现了WSGI标准的Web服务器,Python Web框架都能在上面运行。

六、uWSGI

uWSGI是一个服务器,它实现了wsgi协议,从而它就相当于Python世界中的Tomcat,它可以运行一切Python Web程序(因为一切Python Web程序底层都按照wsgi协议来实现的)。

除了wsgi,uWSGI还定义了一种uwsgi协议用于跟其它服务器通信,比如通过uwsgi协议跟Nginx通信、跟Apache通信等。uwsgi只是一种数据传输协议,只有Nginx也支持uwsgi协议才能使得Nginx可以跟uWSGI对话。

七、Gunicorn

corn 玉米

unicorn 独角兽

Gunicorn是uWSGI的竞争者,它也是实现了WSGI协议、可以作为Python Web服务器的一种服务器,也相当于Python世界中的Tomcat。

相比uWSGI,Gunicorn更好用,部署更简单。

八、wsgiref

Python语言内置的wsgi服务器,可以用于测试

九、mod_wsgi

mod_wsgi是Apache的一个模块,跟mod_php一样。

Apache服务器本来不支持php,添加mod_php模块之后就支持php了。mod_wsgi也是一样,添加之后Apache就支持Python了。

现在已经很少使用mod_wsgi了,更多使用Gunicorn作为Python服务器。

十、为啥要用Nginx

Tomcat、uWSGI都是服务器,Nginx也是服务器,那么为啥用了前两者,还要用Nginx?

Tomcat、uWSGI处理动态,Nginx处理静态,像一些静态资源Tomcat也可以处理,但是肯定不如Nginx处理得快,所以Nginx就充当了一个大管家,这个大管家不仅善于处理静态内容,并且可以用于分发请求从而实现负载均衡。

Nginx的作用:

  1. 负载均衡,Nginx占用80端口,其它服务器可以占用多个非80端口;
  2. 拦截静态请求;
  3. 伪静态化并缓存,减少动态请求数量;
  4. 依赖于nginx强大的功能和性能,可以做访问控制,限速,限连接数等等;
  5. nginx缓存客户端发起的请求,直到收完整个请求,转发给Gunicorn,等Gunicorn处理完成后,拿到响应,再发给客户端,这个流程是nginx擅长处理,而Gunicorn不擅长处理的。

Nginx的作用是反向代理。正向代理指客户端通过代理服务器访问我的服务器,反向代理是客户端通过我的服务器上的代理服务器访问我的服务器上的服务器。

十一、Tornado(龙卷风)

Tornado是一个功能丰富、强大不可方物的库。

  1. 高性能的网络库,这可以和gevent,twisted,libevent等做对。提供了异步io支持,超时事件处理,在此基础上提供了tcpserver,httpclient,尤其是curlhttpclient在现有http客户端中肯定排第一。可以用来做爬虫,游戏服务器,据我所知业界已有使用tornado作为游戏服务器
  2. web框架,这可以和django,flask对。提供了路由,模板等web框架必备组件。与其他区别是tornado是异步的,天然适合长轮训,这也是friendfeed发明tornado的原因,

    当前flask也可以支持,但必须借住gevent等
  3. 较为完备的http服务器,这点可以和nginx,apache对比,但只支持http1.0,所以使用nginx做前段不仅是为了更好利用多核,也是让其支持http1.1
  4. 完备的wsgi服务器,这可以和gunicore,gevent wsgi server做对比,也就是说可以让flask运行在tornado之上,让tornado加速flask
  5. 提供了完备的websocket支持,这让html5的游戏等提供了便利。像知乎长轮训就是使用了websocket,但websocket手机支持的不是很好,前段时间不得不使用定时ajax发送大量请求,期待手机浏览器赶快奋起直追

参考资料

知乎关于Tornado的讨论

博客园关于Python部署

web服务器一些概念的更多相关文章

  1. web服务器/应用服务器/http服务器/中间件

    web服务器:只处理html静态页面不处理动态页面,如apache/nginx/iis等. 应用服务器:能处理html静态页面也能处理动态页面,如tomcat/weblogic/websphere/j ...

  2. IIS Web 服务器/ASP.NET 运行原理基本知识概念整理 转

    转http://www.cnblogs.com/loongsoft/p/7272830.html IIS Web 服务器/ASP.NET 运行原理基本知识概念整理  前言:      记录 IIS 相 ...

  3. IIS Web 服务器/ASP.NET 运行原理基本知识概念整理

     前言:      记录 IIS 相关的笔记还是从公司笔试考核题开始的,问 Application Pool 与 AppDomain 的区别?      促使我对进程池进了知识的学习,所以记录一下学习 ...

  4. JavaWeb--基本概念、Web服务器与Tomcat

    前言 Java Web 其实就是一个技术的总和,把Web看成一个容器而已主要使用JavaEE技术来实现.在加上各种中间件. 整个javaWeb阶段的内容通过实际的案例贯穿学习, 所涉及到的技术知识点会 ...

  5. web服务器和应用服务器概念比较

    转自:http://hi.baidu.com/lclkathy/blog/item/dae3be36763a47370b55a970.html 一 常见的WEB服务器和应用服务器 在UNIX和LINU ...

  6. 01_Weblogic课程之概念篇:代理服务器,web服务器,应用程序服务器,JNDI概念,JTA概念,Java消息服务,Java验证和授权(JAAS),Java管理扩展,Web客户机,客户机应用程序

     1 什么是服务器 Weblogic中服务器分为两种,一种是受管服务器,另外一种是管理服务器. Weblogic课程(Weblogic是Oracle公司的,最开始的是BEA公司的) 一 系统管理 ...

  7. nginx web服务器概念了解 配置

    服务器 服务器 服务器是一种提供高效计算的机器,与普通的PC主机相比,具有可观的稳定性,高并发性,可扩展性. 互联网任何一个应用都是以服务器为基础设施的,没有服务器我们就无法访问网络上的任何内容,只能 ...

  8. 一不小心写了个WEB服务器

    开场 Web服务器是啥玩意? 是那个托管了我的网站的机器么? No,虽然那个也是服务器,但是我们今天要说的Web服务器主要是指像IIS这样一类的,用于处理request并返回response的工具,没 ...

  9. 基于轻量型Web服务器Raspkate的RESTful API的实现

    在上一篇文章中,我们已经了解了Raspkate这一轻量型Web服务器,今天,我们再一起了解下如何基于Raspkate实现简单的RESTful API. 模块 首先让我们了解一下"模块&quo ...

随机推荐

  1. Java:java+内存分配及变量存储位置的区别

    Java内存区分 Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分 ...

  2. super-pow

    // https://discuss.leetcode.com/topic/50489/c-clean-and-short-solution class Solution { ; int powMod ...

  3. HTML中显示特殊字符,如尖括号 “<”,">"等等

    这几天,做个网页,之后进行解析,总是出错.最后发现是因为错误的使用了尖括号  “<”,">". 如下面的html代码: <body> 显示:<inpu ...

  4. 超酷的响应式dribbble设计作品瀑布流布局效果

    相信做设计的朋友肯定都知道dribbble.com,它是一个非常棒的设计师分享作品的网站,全世界数以万计的设计高手和行家都在这个网站上分享自己的作品,当然,如果你常在上面闲逛的话,经常得到一些免费的好 ...

  5. android 中的 window,view,activity具体关系

    通过讨论这个问题,我们能够见识到google是对面向对象模式的理解,能够理解android底层的一些调用.这也是一道很常见的面试题. 我们这篇文章就来解决这四个问题: Android  中view的显 ...

  6. C++设计模式实现--模板(Template)模式

    一. 问题 在面向对象系统的分析与设计过程中常常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,可是逻辑(算法)的框架(或通用的应用算法)是同样的.Template提 ...

  7. 【Word】Word 2010 设置边框底纹,粘贴漂亮的代码

    参考资料: http://jingyan.baidu.com/article/48206aea1a3401216bd6b310.html http://wenku.baidu.com/link?url ...

  8. 解决在ubuntu 12.10安装vmware-tools实现文件共享问题

    解决在ubuntu 12.10安装vmware-tools出现的“The path "" is not a valid path to linux-headers-3.5.0-17 ...

  9. Android Studio安装&&安装bug

    1.安装SDK:Android SDK安装 2.安装Android Studio 3.配置HTTP Proxy: 转自:Android Studio设置HTTP代理(可用) 因为大陆的内网的防火墙很厉 ...

  10. (数据挖掘-入门-3)基于用户的协同过滤之k近邻

    主要内容: 1.k近邻 2.python实现 1.什么是k近邻(KNN) 在入门-1中,简单地实现了基于用户协同过滤的最近邻算法,所谓最近邻,就是找到距离最近或最相似的用户,将他的物品推荐出来. 而这 ...