Web服务器
文章目录
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程序的编写。将在接下来的时间里去完成这部分的内容吧!
参考资料:
- 《深入理解计算机系统》
- 2cto