作为一个python开发者需要知道的关于服务器的知识

2,657 阅读6分钟
原文链接: python.jobbole.com

服务器的相关知识曾经让我非常困惑。我相信还有很多的Python开发者和我有着类似的遭遇。所以,请让我和你分享我知道的一切关于服务器的知识,来解开这些困惑。

HTTP: 统治万维网的协议

HTTP(超文本传输协议)是一种通信协议,它被用来发送和接收因特网上的网页以及其他数据文件。它是一套规则和相关参数的集合,这些规则和参数控制着网页和其他数据文件在因特网上的传输。

浏览器是一个HTTP客户端,因为它会发送请求到一个HTTP服务器(网页服务器),HTTP服务器随后把响应发送回客户端。HTTP监听的标准(和默认)端口是80端口,尽管其实可以使用任何的端口。这篇文章 对HTTP进行了非常好的解释。请务必浏览一下。如果你想要钻研一下HTTP,请查看HTTP 1.1 specs ,它已经被多种请求注解(RFCs(7230-7237))所替代。你可以在ietf搜索这些请求注解。

HTTP 服务器

因此,HTTP请求和响应有其特定的格式!当用户进入某个网站的时候,他们的浏览器与站点的网页服务器进行了连接(这个过程称之为请求)。服务器在文件系统中查询文件,并将其发送回用户的浏览器,浏览器会显示这些文件(这个过程称之为响应)。这便是HTTP协议的工作方式。看上去很简单?

动态网站并不基于文件系统中的文件,取而代之的是,当有请求到达的时候,由一个网站服务器上面运行的程序来处理。该程序会生成内容并将其返回给用户。它们可以做很多有用的事,比如显示BBS上的帖子,显示你的电子邮件,配置软件或是显示当前的时间。

不论客户端或者服务器是如何实现的,总有办法来生成有效的HTTP请求,让客户端正常工作,同样,服务器要能够理解发送给它的HTTP请求并且为所有到达的请求生成有效的HTTP响应。客户端和服务器都必须具有相互连接的能力(这种情况下会使用TCP进行可靠的连接),能够传输HTTP请求(客户端 -> 服务器)和HTTP响应(服务器 -> 客户端)。

HTTP服务器(是一个程序)会接受这些请求,并且会让你的python获取HTTP请求方法以及URI。HTTP服务器会处理很多来自图片和静态资源的请求。 那么它又是如何生成动态urls的呢?

@app.route('displaynews<name_of_category>',methods=['GET'])

在Flask中你可能使用过这个装饰器,Flask 是一个python微型框架。Flask会把来自浏览器的请求和该路由进行模式匹配。但是flask是如何解析来自浏览器的http请求的呢?HTTP服务器会把动态生成的urls传递给应用服务器。哇哦!等等。。应用服务器又是什么东西呢?

Apache的 HTTPD 和nginx是两个常用的python网站服务器。

应用服务器

大多数的HTTP服务器是由C或C++写成的,所以它们不能直接执行Python脚本——在服务器和程序之间,需要一个桥梁。这个桥梁,或者说是接口,定义了程序应该如何和服务器进行交互。这就是应用服务器。动态生成的urls从网站服务器传递到应用服务器。应用服务器对url进行匹配并执行该路由对应的脚本。然后它(应用服务器)把响应返回给网站服务器,网站服务器生成一个HTTP响应,并将其返回给客户端。

对于python来讲,有很多可以用的应用服务器。 这个链接 列出了不同的应用服务器。起初,pyhton开发者们使用低层网关来进行部署。

通用网关接口(CGI)

这个接口,通常被称之为“CGI”,是最古老的应用服务器,它几乎被任何网站服务器所天生支持,无需专门安装。使用CGI和网站服务器进行通信的程序,需要针对每一个请求单独开启。所以每一个请求都会启动一个全新的Python解释器——这还是需要花费一点时间的——因此让整个接口只能用在低负载的情况下。

如果你想要学习如何编写一个CGI。请按照JM Marshall的这篇教程 去做。

mod_python

mod_python是一个Apache HTTP 服务器模块,它在服务器上面集成了Python语言。在上世纪90年代和本世纪初期,大多数的Python web应用都运行在配置了 mod_python 的Apache 上。但是,mod_python并不是标准规范。在使用mod_python时会有一些问题 。Python web应用需要一种可持续的运作方式。

FastCgi and SCGI是另一种用来部署的低层网关。它们尝试解决CGI的性能问题。这些低层的网关接口不依赖特定语言。

WSGI的崛起

一个Web服务器网关接口(WSGI)服务器为运行Python web应用实现了服务器端的WSGI接口。 WSGI适合各种规模并且可以在多线程或多进程环境下工作,我们同样可以使用WSGI编写中间件。中间件对于会话处理,授权和其他很多任务都非常有用。你可以在 Armin的博客里面学到如何编写你自己的WSGI实现。这个链接给出了不同WSGI实现的比较。

Gunicorn and uWSGI Gunicorn 和 uWSGI

Gunicorn 和 uWSGI 是两个不同的应用服务器。Gunicorn ‘Green Unicorn’是一个为UNIX设计的Python WSGI HTTP服务器。配置非常简单,和多种web框架兼容,而且它足够的快。

digitalocean的这篇文章讲解了如何配置gunicorn和nginx。

uWSGI 是另一种备选的应用服务器。uWSGI是一个高性能,强大的WSGI服务器。uWSGI有很多可配置选项, digitalocean的这篇文章 讲解了如何配置uWSGI和nginx。

Apache vs Nginx

Anturis 在他的博客上已经非常清晰的阐述了两者之间的不同。这篇文章解释了apache和nginx是如何工作的。

总结一下:

  1. Apache 通过创建进程和线程来处理额外的连接。而Nginx被称为事件驱动,异步,并且非阻塞。
  2. Apache非常强大但是Nginx非常快。Nginx可以更快呈现静态内容。
  3. Nginx包含了先进的负载均衡以及缓存能力。
  4. Nginx比Apache轻量级的多。

organic agency对Apache和nginx进行了基准测试。结果可以在这里看到。

我用的是什么

我使用Nginx因为它很快、很轻巧,并且我发现配置它更容易。Gunicorn配置起来也很简单所以我用gunicorn。uWsgi也经常被用来替代gunicorn。

请和我分享一下你的python应用倾向于使用哪一种服务器呢?