PUB:20160309 Let’s Build A Web Server. Part 1

@StdioA 翻译的不错,轻松诙谐。继续加油将本系列搞定!
This commit is contained in:
wxy 2016-08-08 21:16:39 +08:00
parent d0189a1cc5
commit d34a8f088d

View File

@ -1,4 +1,4 @@
搭个 Web 服务器:第一部分
搭个 Web 服务器(一)
=====================================
一天,有一个正在散步的妇人恰好路过一个建筑工地,看到三个正在工作的工人。她问第一个人:“你在做什么?”第一个人没好气地喊道:“你没看到我在砌砖吗?”妇人对这个答案不满意,于是问第二个人:“你在做什么?”第二个人回答说:“我在建一堵砖墙。”说完,他转向第一个人,跟他说:“嗨,你把墙砌过头了。去把刚刚那块砖弄下来!”然而,妇人对这个答案依然不满意,于是又问了第三个人相同的问题。第三个人仰头看着天,对她说:“我在建造世界上最大的教堂。”当他回答时,第一个人和第二个人在为刚刚砌错的砖而争吵。他转向那两个人,说:“不用管那块砖了。这堵墙在室内,它会被水泥填平,没人会看见它的。去砌下一层吧。”
@ -9,17 +9,17 @@
我相信,如果你想成为一个更好的开发者,你**必须**对日常使用的软件系统的内部结构有更深的理解包括编程语言、编译器与解释器、数据库及操作系统、Web 服务器及 Web 框架。而且,为了更好更深入地理解这些系统,你**必须**从头开始,用一砖一瓦来重新构建这个系统。
子曾经用这几句话来表达这种思想:
子曾经用这几句话来表达这种思想:
>“不闻不若闻之。”
>“不闻不若闻之。I hear and I forget.
![](https://ruslanspivak.com/lsbasi-part4/LSBAWS_confucius_hear.png)
>“闻之不若见之。”
>“闻之不若见之。I see and I remember.
![](https://ruslanspivak.com/lsbasi-part4/LSBAWS_confucius_see.png)
>“知之不若行之。”
>“知之不若行之。I do and I understand.
![](https://ruslanspivak.com/lsbasi-part4/LSBAWS_confucius_do.png)
@ -59,7 +59,7 @@ Hello, World!
client_connection.close()
```
将以上代码保存为 webserver1.py或者直接从 GitHub 上下载这个文件。然后,在命令行中运行这个程序。像这样:
将以上代码保存为 webserver1.py或者直接从 [GitHub][1] 上下载这个文件。然后,在命令行中运行这个程序。像这样:
```
$ python webserver1.py
@ -72,15 +72,15 @@ Serving HTTP on port 8888 …
说真的,快去试一试。你做实验的时候,我会等着你的。
完成了?不错现在我们来讨论一下它实际上是怎么工作的。
完成了?不错现在我们来讨论一下它实际上是怎么工作的。
首先我们从你刚刚输入的 Web 地址开始。它叫 URL这是它的基本结构
首先我们从你刚刚输入的 Web 地址开始。它叫 [URL][2],这是它的基本结构:
![](https://ruslanspivak.com/lsbaws-part1/LSBAWS_URL_Web_address.png)
URL 是一个 Web 服务器的地址,浏览器用这个地址来寻找并连接 Web 服务器,并将上面的内容返回给你。在你的浏览器能够发送 HTTP 请求之前,它需要与 Web 服务器建立一个 TCP 连接。然后会在 TCP 连接中发送 HTTP 请求,并等待服务器返回 HTTP 响应。当你的浏览器收到响应后就会显示其内容在上面的例子中它显示了“Hello, World!”。
我们来进一步探索在发送 HTTP 请求之前,客户端与服务器建立 TCP 连接的过程。为了建立链接,它们使用了所谓“套接字”。我们现在不直接使用浏览器发送请求,而在命令行中使用 telnet 来人工模拟这个过程。
我们来进一步探索在发送 HTTP 请求之前,客户端与服务器建立 TCP 连接的过程。为了建立链接,它们使用了所谓“套接字socket”。我们现在不直接使用浏览器发送请求,而在命令行中使用 `telnet` 来人工模拟这个过程。
在你运行 Web 服务器的电脑上,在命令行中建立一个 telnet 会话,指定一个本地域名,使用端口 8888然后按下回车
@ -94,7 +94,7 @@ Connected to localhost.
![](https://ruslanspivak.com/lsbaws-part1/LSBAWS_socket.png)
在同一个 telnet 会话中,输入 GET /hello HTTP/1.1,然后输入回车:
在同一个 telnet 会话中,输入 `GET /hello HTTP/1.1`,然后输入回车:
```
$ telnet localhost 8888
@ -106,11 +106,11 @@ HTTP/1.1 200 OK
Hello, World!
```
你刚刚手动模拟了你的浏览器!你发送了 HTTP 请求,并且收到了一个 HTTP 应答。下面是一个 HTTP 请求的基本结构:
你刚刚手动模拟了你的浏览器(的工作)!你发送了 HTTP 请求,并且收到了一个 HTTP 应答。下面是一个 HTTP 请求的基本结构:
![](https://ruslanspivak.com/lsbaws-part1/LSBAWS_HTTP_request_anatomy.png)
HTTP 请求的第一行由三部分组成HTTP 方法GET因为我们想让我们的服务器返回一些内容以及标明所需页面的路径 /hello还有协议版本。
HTTP 请求的第一行由三部分组成HTTP 方法(`GET`,因为我们想让我们的服务器返回一些内容),以及标明所需页面的路径 `/hello`,还有协议版本。
为了简单一些,我们刚刚构建的 Web 服务器完全忽略了上面的请求内容。你也可以试着输入一些无用内容而不是“GET /hello HTTP/1.1”但你仍然会收到一个“Hello, World!”响应。
@ -120,19 +120,19 @@ HTTP 请求的第一行由三部分组成HTTP 方法GET因为我们想
![](https://ruslanspivak.com/lsbaws-part1/LSBAWS_HTTP_response_anatomy.png)
我们来解析它。这个响应由三部分组成:一个状态行 HTTP/1.1 200 OK后面跟着一个空行再下面是响应正文。
我们来解析它。这个响应由三部分组成:一个状态行 `HTTP/1.1 200 OK`,后面跟着一个空行,再下面是响应正文。
HTTP 响应的状态行 HTTP/1.1 200 OK 包含 HTTP 版本号HTTP 状态码以及 HTTP 状态短语“OK”。当浏览器收到响应后它会将响应正文显示出来这也就是为什么你会在浏览器中看到“Hello, World!”。
HTTP 响应的状态行 HTTP/1.1 200 OK 包含 HTTP 版本号HTTP 状态码以及 HTTP 状态短语“OK”。当浏览器收到响应后它会将响应正文显示出来这也就是为什么你会在浏览器中看到“Hello, World!”。
以上就是 Web 服务器的基本工作模型。总结一下Web 服务器创建一个处于监听状态的套接字,循环接收新的连接。客户端建立 TCP 连接成功后,会向服务器发送 HTTP 请求,然后服务器会以一个 HTTP 响应做应答,客户端会将 HTTP 的响应内容显示给用户。为了建立 TCP 连接,客户端和服务端均会使用套接字。
现在,你应该了解了 Web 服务器的基本工作方式,你可以使用浏览器或其它 HTTP 客户端进行试验。如果你尝试过、观察过,你应该也能够使用 telnet人工编写 HTTP 请求,成为一个人形 HTTP 客户端。
现在,你应该了解了 Web 服务器的基本工作方式,你可以使用浏览器或其它 HTTP 客户端进行试验。如果你尝试过、观察过,你应该也能够使用 telnet人工编写 HTTP 请求,成为一个人形 HTTP 客户端。
现在留一个小问题:“你要如何在不对程序做任何改动的情况下,在你刚刚搭建起来的 Web 服务器上适配 Django, Flask 或 Pyramid 应用呢?
现在留一个小问题:“你要如何在不对程序做任何改动的情况下,在你刚刚搭建起来的 Web 服务器上适配 Django, Flask 或 Pyramid 应用呢?
我会在本系列的第二部分中来详细讲解。敬请期待。
顺便,我在撰写《搭个 Web 服务器:从头开始》。这本书讲解了如何从头开始编写一个基本的 Web 服务器,里面包含本文中没有的更多细节。订阅邮件列表,你就可以获取到这本书的最新进展,以及发布日期。
顺便,我在撰写一本名为《搭个 Web 服务器:从头开始》的书。这本书讲解了如何从头开始编写一个基本的 Web 服务器,里面包含本文中没有的更多细节。订阅邮件列表,你就可以获取到这本书的最新进展,以及发布日期。
--------------------------------------------------------------------------------
@ -140,11 +140,11 @@ via: https://ruslanspivak.com/lsbaws-part1/
作者:[Ruslan][a]
译者:[StdioA](https://github.com/StdioA)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://linkedin.com/in/ruslanspivak/
[1]: https://github.com/rspivak/lsbaws/blob/master/part1/webserver1.py
[2]: http://en.wikipedia.org/wiki/Uniform_resource_locator