Web服务器

Web基础

Web客户端和服务器之间的交互用的是一个基于文本的应用层协议,叫做HTTP。
Web服务和常规的文件检索服务(例如FTP)有什么区别呢?主要的区别是Web内容可以用一种叫做HTTP的语言来编写。

Web内容

对于Web客户端和服务器而言,内容是与一个MIMKE类型相关的字节序列。下表展示了一些常用的MIME类型。

MIME类型 描述
text/html HTML页面
text/plain 无格式文本
application/postscript Postscript文档
image/gif GIF格式编码的二进制图像
image/jpeg JPEG格式编码的二进制图像

web服务器以两种不同的方式向客服端提供内容:

  • 静态内容:取一个磁盘文件,并将它的内容返回给客户端。
  • 动态内容:执行一个可执行文件,并将它的输出返回给客户端。
    运行时可执行文件产生的输出称为动态内容,而运行程序并返回它的输出到客户端的过程称为服务动态内容。

统一资源定位符:URL

http://www.google.com:80/index.html

表示因特网主机 www.google.com 上一个称为 index.html 的HTML文件,它是由一个监听端口80的Web服务器所管理的。 HTTP默认端口号为80

可执行文件的URL可以在文件名后包括程序参数, “?”字符分隔文件名和参数,而且每个参数都用“&”字符分隔开,如:

http://www.ics.cs.cmu.edu:8000/cgi-bin/adder?123&456

表示一个 /cgi-bin/adder 的可执行文件,带两个参数字符串为 123 和 456来调用它。

HTTP事务

因为HTTP是基于在因特网连接上传送的文本行,我们可以使用Unix的TELNET程序和因特网上的任何Web服务器执行事务。对于调试在连接上通过文本行来与客户端对话的服务器来说,TELNET十分便利。

HTTP请求

一个HTTP请求:一个请求行(request line) 后面跟随0个或多个请求报头(request header), 再跟随一个空的文本行来终止报头。

HTTP响应

一个HTTP响应:一个响应行(response line) 后面跟随0个或多个响应报头(response header),再跟随一个空的文本行来终止报头,最后跟随一个响应主体(response body)

一个响应行的格式是:

(verion) (status code) (status message)

status code 是一个三位的正整数,指明对请求的处理。状态消息给出与错误代码等价的英文描述。

状态代码 状态消息 描述
200 成功 处理请求无误
301 永久移动 内容移动到位置头中指明的主机上
400 错误请求 服务器不能理解请求
403 禁止 服务器无权访问所请求的文件
404 未发现 服务器不能找到所请求的文件
501 未实现 服务器不支持请求的方法
505 HTTP版本不支持 服务器不支持请求的版本

服务动态内容

一个称为CGI(Common Gateway Interface,通用网关接口)的实际标准的出现解决了这些问题。

客户端如何将程序参数传递给服务器

GET请求的参数在URI中传递, “?”字符分隔了文件名和参数,每个参数都用一个”&”分隔开,参数中不允许有空格,必须用字符串“%20”来表示。
HTTP POST请求的参数是在请求主体中而不是 URI中传递的。

服务器如何将参数传递给子进程

GET /cgi-bin/adder?123&456 HTTP/1.1

它调用 fork 来创建一个子进程,并调用 execve 在子进程的上下文中执行 /cgi-bin/adder 程序。在调用 execve 之前,子进程将CGI环境变量 QUERY_STRING 设置为”123&456”, adder 程序在运行时可以用unix getenv函数来引用它。

服务器如何将其他信息传递给子进程

环境变量 描述
QUERY_STRING 程序参数
SERVER_PORT 父进程侦听的端口
REQUEST_METHOD GET 或 POST
REMOTE_HOST 客户端的域名
REMOTE_ADDR 客户端的点分十进制IP地址
CONTENT_TYPE 只对POST而言,请求体的MIME类型
CONTENT_LENGTH 只对POST而言,请求体的字节大小

子进程将它的输出发送到哪里

一个CGI程序将它的动态内容发送到标准输出,在子进程加载并运行CGI程序之前,它使用UNIX dup2 函数将它标准输出重定向到和客户端相关连的已连接描述符。因此,任何CGI程序写到标准输出的东西都会直接到达客户端。

TINY Web服务器

由于时间的问题,这一节的内容来不及完成,在这一章节还将展示CGI程序的编写。将在接下来的时间里去完成这部分的内容吧!


参考资料:

  1. 《深入理解计算机系统》
  2. 2cto