一、http协议
1.1 http相关协议
- 互联网:所有网络的母集
- 因特网:世界上最大的互联网网络
- 万维网:WWW万维网并非某种特殊的计算机网络,是一个大规模的、联机式的信息贮藏库
- URL:统一资源定位符
- HTTP:超文本传输协议
- HTML:超文本标记语言
1.2 访问浏览器的过程
浏览器是如何工作的?
1.浏览器的职责
2.DNS解析——2.1 为什么要进行DNS解析
——2.2 系统缓存查询
——2.3 路由器缓存、ISP缓存
——2.4 DNS递归查询
3.TCP连接——3.1 三次握手
——3.2 四次分手
4.HTTP请求
5.浏览器的渲染原理——5.1 构建DOM
——5.2 构建CSS树
——5.3 构建渲染树
——5.4 合成、绘制
1.3 http协议通信过程
HTTP(超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP的目的是提供一种远距离共享知识的方式,借助多文档进行进行实现超文本,连成互相参阅的WWW。
HTTP的发展是由蒂姆·伯纳斯-李(Tim Berners-Lee)于1989年在欧洲核子研究组织(CERN)所发起。HTTP的标准制定由万维网协会(W3C)和互联网工程任务组(IETF),最终发布了一些列的RFC,RFC 2616定义了HTTP协议中先进广泛使用的一个版本——HTTP 1.1版
1.4 HTTP相关技术
1.4.1 WEB开发语言
http:超文本传输协议属于应用层协议,其默认端口是80/tcp
WEB前端开发语言:
- html
- css
- JavaScript
1.4.2 MIME
MIME:多用途互联网邮箱扩展
文件 /etc/mime.types来自于mailcap包
MIME格式:type/subtype 主要类型/次要类型
范例:
text/plain
text/html
text/css
image/jpeg jpg jpeg
image/png
video/mp4
application/javascript
1.4.3 URI和URL
URI:统一资源标识分为URL和URN。
URN:统一资源命名。简单来说就是这个资源叫什么名字。
URL:统一资源定位符,用于描述某服务器特定资源位置。简单来说描述了自愿的具体位置。
两者的区别:
URN代表一个人的名称,URL代表一个人的住址。简而言之,URN定义某十五的身份,而URL提供查找该事物的方法。
格式:<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
解释:
scheme:方案,访问服务器以获取资源时要使用哪种协议
user:用户,某些方案访问资源时需要的用户名
password:密码,用户对应的密码,中间用:分隔
host:主机,资源宿主服务器的主机名或IP地址
port:端口,资源宿主服务器正在坚挺的端口号,很多方案有默认端口号
path:路径,服务器自愿的本地名,由一个/将其与前面的URL组建分隔
params:参数,制定输入的参数,参数为名/值对,多个参数用;分隔
query:查询,传递参数给程序,如数据库,用?分隔,用多个查询用&分隔
frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔
1.4.4 网站访问量
网站访问量统计的重要指标
- IP(独立IP):即Internet Protocol,指独立IP数。
- PV(访问量):即Page View,页面浏览量或点击量,PV并不是页面的访问者数量,而是网站被访问的页面数量。
- UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。
了解更多(网站统计):http://www.alexa.cn/rank/
1.4.5 HTTP工作机制
一次http事物包括:
- http请求:http request
- http响应:http response
web资源:一个web页面通常不是单个资源,而是一组资源的集合
资源类型:
- 静态资源:无需服务器做出额外处理,服务器端和客户端文件内容相同
常见文件后缀:.html,.txt,.jpg,.js,.css,.mp3,.avi
- 动态资源:服务器执行程序,返回执行的结果,服务器端和客户端的文件而你容不相同
常见文件后缀:.php,.jsp,asp
HTTP连接请求
提高HTTP连接性能
并行连接:通过多条TCP连接发起并发的HTTP请求
持久连接:keep-alive,重用TCP连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接
管道化连接:通过共享TCP连接,发起并发的HTTP请求
服用的连接:交替传诵请求和相应报文(实验阶段)
1.4.6 HTTP协议版本
HTTP常用的协议版本有0.9、1.0和1.1三种
0.9、1.0和1.1三者的区别
- 0.9:只有下载,没有上传
- 1.0:没有长链接
- 1.1:有长链接
HTTPS协议:HTTPS就是安全版的HTTP,目前大型网站基本实现全站HTTPS
HTTPS特点:
- HTTPS协议需要CA申请证书,大部分需要收费
- HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密
- HTTP和HTTPS使用的是不同的连接方式,而且端口不同,HTTP是80,HTTPS是443
- HTTPS可以有效的防止运营商劫持
- HTTPS实现过程降低用户访问速度,但经过合理优化和部署,HTTPS对速度的影响还是影响接受的
1.4.7 HTTP请求访问的完整过程
- 建立连接
- 接收请求
- 处理请求
- 访问资源
- 构建响应报文
- 发送响应报文
- 记录日志
一次完整的http请求处理过程
1. 建立连接
接收或拒绝连接请求
2. 接收请求
接收客户端请求报文中对某资源的一次请求的过程
Web访问相应模型(Web I/O)
这里I/O指的是INPUT/OUTPUT
HTTP请求的报文格式:
方法method 路径URL 版本 头部
举例:get a.jpg http/1.1
单进程I/O模型:启动一个进程处理用户请求,而且一次只能处理一个
多进程I/O模型:并启动多个进程,每个进程相应一个连接请求
复用I/O结构:启动一个进程,同时响应N个连接请求
复用的多进程I/O模型:启动M个进程,每个进程响应N个连接请求,同时接收M*N个请求(主流)
多路复用I/O结构来处理客户端的请求
3. 处理请求
服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分请求进行处理
常用的请求method:GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS
4. 访问资源:
服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源
5. 构建响应报文
web服务器除了识别资源以外就执行请求方法中描述的动作,并返回响应报文。响应报文中包含响应状态码、响应首部和响应主体,前提是生成响应主体。
6. 发送响应报文
web服务器通过链接数据时也会面临与接收数据一样的问题。服务器可能有很多条道各个客户端的连接,各个状态不一。服务器要记录这些状态,还要注意对持久连接的处理。在非持久连接的状态下,服务器发送完整条报文后,要关闭这一端的连接;在持久链接的状态下,可能仍然要保持着打开的状态。因此,服务器要正确的计算出Content-Length首部,不然客户端就无法知道相应什么时候结束
7. 记录日志
当事务结束时,web服务器会在日志文件中添加一个条目,来描述已执行的事务
1.5 http协议及报文头部结构
http事务:一次访问的过程
- 请求:request
- 响应:response
解决http协议无状态的方法
- cookie客户端存放
- session客户端存放
1.5.1 HTTP请求报文
报文由三个部分组成:开始行、首部行和实体主体
方法:
方法 | 说明 |
---|---|
GET | 获取资源。当前网络请求中,绝大部分使用的是GET方法 |
HEAD | 获取保温首部。主要用于确认URL的有效性以及资源更新的日期时间等 |
POST | 传输实体主体(比如传输用户名、密码等) |
PUT | 上传文件(比如写博客) |
PATCH | 对资源进行部分修改 |
DELETE | 删除文件 |
OPTIONS | 查询支持的方法(查看服务器可以支持那些方法) |
CONNECT | 要求与代理服务器通信时建立隧道(类似加密) |
TRACE | 追踪路径 |
URL:指明资源的具体位置
格式:<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
- scheme
- http 超文本传输协议
- https 安全的http协议
- ftp 文件传输协议
- user:账号
- password:密码
- host:主机名、域名或IP地址
- port:服务器端口号
- path:访问自愿的路径,相当于组件路径
- params:参数。制定一些参数。比如制定传输方式(不常用)
- query:查询参数
- frag:html资源片段。比如html文档过大的时候,drag定位到html的一部分
首部字段:使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容,HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:” 分隔
首部分类:
通用首部:请求报文和响应报文双方都会使用的首部
- Date:报文的创建时间
- Connection:连接状态。如keep-alive,close
- Via:显示报文经过的中间节点(代理,网关)
- Cache-Control:控制缓存。如缓存时长
- MIME-Version:发送端使用的MIME版本
- Warning:错误通知
请求首部:从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、请求内容相关优先级等信息
- Accept:通知服务器自己可接受的媒体类型
- Accept-Charset:客户端可接受的字符集,如gzip
- Accept-language:客户端可接受的语言
- Client-IP:请求的客户端IP
- Host:请求的服务器名称和端口号
- Referer:跳转至dangqianURI的前一个URL
- User-Agent:客户端代理,浏览器版本
- Expect:允许客户端列出某请求所要求的服务器行为(条件式请求首部)
- If-Modified-Since:自从指定的时间之后,请求的资源是否发生过修改(条件式请求首部)
- If-Unmodified-Since:和上方相反
- If-None-Match:本地缓存中存储的文档的Etag标签是否与服务器文档的Etag不匹配(条件式请求首部)
- If-Match:与上方相反
- Authorization:向服务器发送认证信息,如账号和密码(安全请求首部)
- Cookie:客户端向服务器发送cookie
- Proxy-Authorization:想代理服务器认证(代理请求首部)
响应首部:从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息
- 协商首部:某资源有多种表示方法时使用
- Accept-Ranges:服务器可接受的请求范围类型
- Vary:服务器查看的其他首部列表
- 安全响应首部
- Set-Cookie:向客户端设置cookie
- WWW-Authenticate:来自服务器对客户端的质询列表
- 信息性
- Age:从最初创建开始,相应持续市场
- Server:服务器程序软件名称和版本
实体首部:实体首部:针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的的信息
- 缓存相关:
- ETAG:实体的扩展标签
- ExPIRES:实体的过期时间
- Last-Modified:最后一次修改的时间
- Allow:列出对此资源实体可使用的请求方法
- Location:告诉客户端真正的尸体位于何处
- Content-Encoding:对主体执行的编码
- Content-Language:理解主体时最适合的语言
- Content-Location:实体真正所处的位置
- Content-Type:主体的对象类型,如text
扩展首部
实体:请求时附加的数据或响应时附加的数据
request报文格式
<method> <request-URL> <version>
<headers>
<entity-body>
举例:
GET / HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: www.magedu.com
User-Agent: HTTPie/0.9.4
1.5.2 响应报文
响应报文的开始行是状态行
状态行包括三项内容,即HTTP的版本,状态码,以及解释状态码的简单短语
response报文格式
<version> <status> <reason-phrase>
<headers>
<entity-body>
举例:curl -v 192.168.10.3 | head
HTTP/1.1 200 OK
Cache-Control: max-age=3, must-revalidate
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html; charset=UTF-8
Date: Thu, 07 Nov 2019 03:44:14 GMT
Server: Tengine
Transfer-Encoding: chunked
Vary: Accept-Encoding
Vary: Accept-Encoding, Cookie
1.5.2.1 状态码
三个数字,标记请求处理过程中发生的情况
http协议状态码分类
范围 | 说明 | |
---|---|---|
1xx | 100-101 | 信息提示 |
2xx | 200-206 | 成功 |
3xx | 300-307 | 重定向 |
4xx | 400-415 | 错误类信息(客户端错误) |
5xx | 500-505 | 错误类信息,服务器端错误 |
二、httpd安装组成
2.1 常见http服务器程序
httpd apache,存在C10K(10K connections)问题(国外主流)
nginx 解决C10K问题lighttpd(国内主流)
tomcat .jsp 应用程序服务器
2.2 apache介绍和特点
apache功能:
-
提供http协议服务
-
多个虚拟主机:IP、Port、FQDN
-
CGI:Common Gateway Interface,通用网关接口,支持动态程序
-
反向代理
-
负载均衡
-
路径别名
-
丰富的用户认证机制:basic,digest
-
支持第三方模块
apache特性:
- 高度模块化:core + modules
- DSO:Dynamic Shared Object 动态加载/卸载
- MPM:multi-processing module 多路处理模块
总结:apache功能多,稳定,善于处理静态资源。
2.2.1 MPM工作模式
prefork:多进程I/O模型,每个进程响应一个请求,CentOS 7 httpd默认模型一个主进程:生成和回收n个子进程,创建套接字,不响应请求多个子进程:工作 work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求。
优点:稳定
缺点:慢,占用资源,不适用于高并发场景
worker:复用的多进程I/O模型,多进程多线程
优点:相比prefork 占用的内存较少,可以同时处理更多的请求
缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)
event:事件驱动模型(worker模型的变种)
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
缺点:没有线程安全控制
MPM的趋势:event(主流)、prefork(少用)、worker(基本不用)
2.3 httpd安装和相关文件
2.3.1 包安装httpd并启动httpd服务
安装方式:
- 包安装: centos发行版,稳定,建议使用
- 编译:定制或特殊需求
举例:安装httpd 2.4
yum install httpd -y
2.3.2 httpd 2.4 相关文件
配置文件:
- /etc/httpd/conf/httpd.conf 主配置文件
- /etc/httpd/conf.d/*.conf 子配置文件
- /etc/httpd/conf.d/conf.modules.d/ 模块加载的配置文件
检查配置语法:httpd -t 或 apache2 -t
服务单元文件:/usr/lib/systemd/system/httpd.service
配置文件:/etc/sysconfig/httpd
服务控制和启动
- systemctl enable|disable httpd.service
- systemctl {start|stop|restart|status|reload} httpd.service
- apachectl start|stop|restart|configtest
- service httpd start|stop|restart|configtest
站点网页文档根目录:/var/www/html
模块文件路径:
- /etc/httpd/modules
- /usr/lib64/httpd/modules
主服务器程序文件:/usr/sbin/httpd
三、httpd常见配置
3.1 指定服务器名
3.2 包含其他配置文件
指令:
Include file-path|directory-path|wildcard
IncludeOptional file-path|directory-path|wildcard
说明:
- Include和IncludeOptional功能相同,都可以包括其它配置文件
- 但是当无匹配文件时,include会报错,IncludeOptional会忽略错误
include子配置文件
总目录
3.3 监听地址
格式:Listen [IP:]PORT
说明:
- 省略IP表示为本机所有IP
- Listen指令至少一个,可重复出现多次
举例:
Listen 192.168.91.100:8080
Lsten 80
vim /etc/httpd/conf.d/test.conf
Listen 8080
3.4 隐藏服务器版本信息
语法:ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
相关指令:
ServerTokens Prod[uctOnly] :Server: Apache
ServerTokens Major: Server: Apache/2
ServerTokens Minor: Server: Apache/2.0
ServerTokens Min[imal]: Server: Apache/2.0.41
ServerTokens OS: Server: Apache/2.0.41 (Unix)
ServerTokens Full (or not specified): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2 此为默认值
3.5 持久链接
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认开启持久连接
断开条件:
- 时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级
- 请求数量: 请求数达到指定值,也会断开
副作用:对并发访问量大的服务器,持久连接会使有些请求得不到响应
持久连接相关指令:
KeepAlive On|Off
KeepAliveTimeout 15 #连接持续15s,可以以ms为单位,默认值为5s
MaxKeepAliveRequests 500 #持久连接最大接收的请求数,默认值100
1. 首先进入到httpd文件夹下,编辑一下文件同时创建三个新文件,重新启动发现有报错
2. 检查错误来源,发现9527端口未绑定
3. 查看一下当下剩余的端口号有哪些
4. 再到文件里修改一下端口号,重启后生效
5. 开启第二台服务器,远程连接是否成功,同时安装telnet
3.6 DSO
DSO,加载动态模块配置,不需重启即生效动态模块所在路径: /usr/lib64/httpd/modules/
主配置 /etc/httpd/conf/httpd.conf 文件中指定加载模块配置文件
ServerRoot "/etc/httpd"
Include conf.modules.d/*.conf
配置指定实现模块加载格式: LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径:相对于ServerRoot(默认/etc/httpd)
查看静态编译的模块:httpd -l
查看静态编译及动态装载的模块:httpd -M
3.7 虚拟主机
httpd 支持在一台物理主机上实现多个网站,即多虚拟主机
网站的唯一标识:
- IP相同,但端口不同
- IP不同,但端口均为默认端口
- FQDN不同, IP和端口都相同
多虚拟主机有三种实现方案:
- 基于ip:为每个虚拟主机准备至少一个ip地址
- 基于port:为每个虚拟主机使用至少一个独立的port
- 基于FQDN:为每个虚拟主机使用至少一个FQDN,请求报文中首部 Host:www.kgc.com
3.7.1 基于IP地址
实际操作
1. 方法一:输入命令添加一块网卡,可以用ifconfig查看
1.1 方法二:在VM设置里手动添加一块网卡
2. 配置test相关配置项,重新启动httpd服务。
3. 配置项里的内容需要和您的网卡地址是一致的,请注意不要敲错
4. 进入html文件夹下,将文件输出到指定目录后,重新启动一下服务即可
5. 在第二台机器内,远程请求web服务器
3.7.2 基于端口地址
1. 配置配置项注意加上端口号,端口号不确定可以使用命令semanage -l port | grep http进行查看
2. 编辑完后,重新启动httpd服务即可