一、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. EasyUI Pagination 分页的两种做法

    EasyUI 的 datagrid 支持服务器端分页,但是官方的资料比较少,以下总结了两种 datagrid 的服务器端分页机制,可根据情况具体使用. 一:使用 datagrid 默认机制 后台: p ...

  2. PHP语言基础之MySql 05 By ACReaper

    PHP的基本语法学完后,我们马上学下PHP如何和MySql进行交互.PHP和MySql进行交互的API可以分为两类,一类是面向过程的,一类是面向对象的,面向对象的我们等复习完面向对象再介绍,现在先介绍 ...

  3. Informatica 常用组件Lookup缓存之三 重建查找高速缓存

    如果您认为查找源在 PowerCenter 上次构建高速缓存时已更改,则可指示 PowerCenter 重建查找高速缓存. 重建高速缓存时,PowerCenter 会覆盖现有永久高速缓存文件而创建新的 ...

  4. 在CentOS 7上使用Yum源安装和卸载 MongoDB 3.4

    在CentOS 7上使用Yum源安装和卸载 MongoDB 3.4 1.配置Yum源 vim /etc/yum.repos.d/mongodb-org-3.4.repo [mongodb-org-3. ...

  5. jQuery图片上传前先在本地预览

    js代码: /* *名称:图片上传本地预览插件 v1.1 *作者:周祥 *时间:2013年11月26日 *介绍:基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持saf ...

  6. Element table使用技巧详解

    1.控制table某些行数不显示 下载附件的需求,有些行有附件,有些没有,所以需要过滤,重点是:Array.filter()使用 <el-card :body-style="{ pad ...

  7. myeclipse创建maven android项目

    一.搭建环境 1.安装android maven插件,我在网上找了半天.没有找到这个插件,于是选择了在线安装.选择myeclipse 的 [help]->[install form catalo ...

  8. js正则表达式/replace替换变量方法

    转自:http://www.blogjava.net/pingpang/archive/2012/08/12/385342.html 1. javascript 正则对象替换创建和用法:/patter ...

  9. iOS开发系列课程预告

    近期在Mac和iOS上做开发,认为应该写一点东西分享给感兴趣的童鞋们.在此之前.以前有非常多同行们都在埋怨苹果Objective-C的复杂和难以上手,为此也有非常多人对今年(2014年)刚推出的Swi ...

  10. ios Mac 地址获取

    //mac address #include <sys/socket.h> // Per msqr #include <sys/sysctl.h> #include <n ...