一、HTTP协议
1.http相关概念
-
互联网:是网络的网络,是所有类型网络的母集
-
因特网:世界上最大的互联网网络。即因特网概念从属于互联网概念。习惯上,大家把连接在因特网上的计算机都成为主机。
-
万维网:WWW(world wide web)万维网并非某种特殊的计算机网络,是一个大规模的、联机式的信息贮藏库,具有提供分布式服务的特点。
-
URL:万维网使用统一资源定位符(Uniform Resource Locator)来标志万维网上的各种文档,并使每个文档在整个因特网的范围内具有唯一的标识符URL。
-
HTTP:超文本传送协议(HyperText Transfer Protocol)。HTTP是处于应用层的协议,使用TCP传输层协议进行可靠的传送。
-
HTML:超文本标记语言(HyperText Markup Language)。
2.访问浏览器的过程
3.http协议通信过程
HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础设计HTTP最初的目的是为了提供一种远距离共享知识的方式,借助多文档进行关联实现超文本,连成相互参阅的WWW。
4.HTTP相关技术
4.1 WEB开发语言
WEB前端开发语言:
- html:Hyper Text Markup Language 超文本标记语言,编程语言,主要负责实现页面的结构。
- css:Cascading Style Sheet 层叠样式表,定义了如何显示(装扮) HTML 元素,比如:字体大小和颜色属性等。
- javascript:实现网页的动画效果,但是属于静态资源。
4.2 MIME
MIME : Multipurpose Internet Mail Extensions 多用途互联网邮件扩展
文件 /etc/mime.types ,来自于mailcap包
MIME格式:type/subtype 主要类型/次要类型
4.3 URI
URI: Uniform Resource Identifier 统一资源标识,分为URL 和 URN
- URN:Uniform Resource Naming,统一资源命名
- URL:Uniform Resorce Locator,统一资源定位符,用于描述某服务器某特定资源位置
两者区别: URN如同一个人的名称,而URL代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。URN仅用于命名,而不指定地URL组成。
点击查看代码
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
scheme:方案,访问服务器以获取资源时要使用哪种协议 http https fyp file
user:用户,某些方案访问资源时需要的用户名
password:密码,用户对应的密码,中间用:分隔
Host:主机,资源宿主服务器的主机名或IP地址
port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号
path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔
params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔
query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔
frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔
4.4 网站访问量
网站访问量统计的重要指标:
- PV(访问量): 即Page View,页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量。
- IP(独立IP):即Internet Protocol,指独立IP数。一天内来自相同客户机IP 地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标。
- UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。
4.5 HTTP 工作机制
提高HTTP连接性能:
- 并行连接:通过多条TCP连接发起并发的HTTP请求
- 持久连接:keep-alive,重用TCP连接,以消除连接和关闭的时延,以事务个数和时
间来决定是否关闭连接 - 管道化连接:通过共享TCP连接,发起并发的HTTP请求
- 复用的连接:交替传送请求和响应报文(实验阶段)
4.6 HTTP 协议版本及区别
- http/0.9 :只支持下载 ,方法只有get,不支持长连接
- http/1.0 :加入了多种方法,不止有get下载方法,还有POST上传等方法 ,不支持长连接
- http/1.1 :加入了长连接
5. HTTP 请求访问的完整过程
七个过程!(三次握手之后)very important !
一次完整的http请求处理过程:
建立连接
接收请求
处理请求
访问资源
构建响应报文
发送响应报文
记录日志
5.1 建立连接
接收或拒绝连接请求
5.2 接收请求
接收客户端请求报文中对某资源的一次请求的过程
- 单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
- 多进程I/O模型:并行启动多个进程,每个进程响应一个连接请求
- 复用I/O结构:启动一个进程,同时响应N个连接请求
- 复用的多进程I/O模型:启动M个进程,每个进程响应N个连接请求,同时接收M*N个请求
5.3 处理请求
服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理
常用请求Method: GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS
5.4 访问资源
服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源
5.5 构建响应报文
一旦Web服务器识别出了资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中 包含有响应状态码、响应首部,如果生成了响应主体的话,还包括响应主体
5.6 发送响应报文
Web服务器通过连接发送数据时也会面临与接收数据一样的问题。服务器可能有很多条到各个客户端的连接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。服务器要记录连接的状态,还要特别注意对持久连接的处理。
- 对非持久连接而言,服务器应该在发送了整条报文之后,关闭自己这一端的连接。
- 对持久连接来说,连接可能仍保持打开状态,在这种情况下,服务器要正确地计算Content-Length首部,不然客户端就无法知道响应什么时候结束
5.7 记录日志
最后,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务
6.http报文头部结构
6.1 请求报文 request
报文由三个部分组成,即开始行、首部行和实体主体 ,在请求报文中,开始行就是请求行。
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
6.1.1 开始行
方法:
方法: | |
---|---|
GET | 获取资源 (当前网络请求中,绝大部分使用的是 GET 方法) |
HEAD | 获取报文首部,主要用于确认 URL 的有效性以及资源更新的日期时间等 |
POST | 传输实体主体 (比如传输 用户名密码) |
PUT | 上传文件(比如写博客) |
PATCH | 对资源进行部分修改 |
DELETE | 删除文件 |
OPTIONS | 查询支持的方法(查看服务端可以支持哪些方法) |
CONNECT | 要求在与代理服务器通信时建立隧道(类似加密) |
TRACE | 追踪路径 |
url:
指明资源的具体位置
|
6.1.2 首部行
首部字段:使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容,HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:” 分隔
首部的分类:
- 通用首部:请求报文和响应报文两方都会使用的首部
- 请求首部:从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、请求内容相关优先级等信息
- 响应首部:从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息
- 实体首部:针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的的信息
- 扩展首部
6.1.3 实体主体
实体:请求时附加的数据或响应时附加的数据,例如:登录网站时的用户名和密码,博客的上传文章,论坛上的发言等
6.2 响应报文 response
响应报文的开始行是状态行。
状态行包括三项内容,即 HTTP的版本,状态码以及解释状态码的简单短语。
状态行包括三项内容,即 HTTP的版本,状态码以及解释状态码的简单短语。
response报文格式:
点击查看代码
<version> <status> <reason-phrase>
<headers>
<entity-body>
点击查看代码
范例: curl -v 192.168.91.100 |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
二、httpd安装组成
apache 服务名
httpd 安装包的名字
1.apache介绍和特点
apache 功能:
- 提供http协议服务
- 多个虚拟主机:IP、Port、FQDN
- CGI:Common Gateway Interface,通用网关接口,支持动态程序
- 反向代理
- 负载均衡
- 路径别名
- 丰富的用户认证机制:basic,digest
- 支持第三方模块
apache特性:
- 高度模块化:core + modules
- DSO:Dynamic Shared Object 动态加载/卸载
- MPM:multi-processing module 多路处理模块
2.http三种工作模式及特点
mpm(multi-processing module)多路处理模块:同一时间多个用户同时访问
httpd 支持三种MPM工作模式:
- prefoke
- work
- event
2.1 prefork
prefork:多进程I/O模型,每个进程响应一个请求,CentOS 7 httpd默认模型一个主进程:生成和回收n个子进程,创建套接字,不响应请求多个子进程:工作 work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求
- 优点:稳定
- 缺点:慢,占用资源,不适用于高并发场景
2.2 work
worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型
- 优点:相比prefork 占用的内存较少,可以同时处理更多的请求
- 缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)
2.3 event
event:事件驱动模型(worker模型的变种),CentOS8 默认模型
- 优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
- 缺点:没有线程安全控制
- httpd-2.4 相关文件
配置文件:
- /etc/httpd/conf/httpd.conf 主配置文件
- /etc/httpd/conf.d/*.conf 子配置文件
- /etc/httpd/conf.d/conf.modules.d/ 模块加载的配置文件
检查配置语法: httpd -t
站点网页文档根目录: /var/www/html
服务单元文件:
- /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
模块文件路径:
- /etc/httpd/modules
- /usr/lib64/httpd/modules
主服务器程序文件: /usr/sbin/httpd
三、httpd常见配置
1.指定服务器名
点击查看代码
[root@centos7 ~]#vim /etc/httpd/conf/httpd.conf //修改配置文件
#ServerName www.example.com:80
servername www.magedu.org //指定服务器名
2.监听地址
Listen [IP:]PORT
说明:
- 省略IP表示为本机所有IP
- Listen指令至少一个,可重复出现多次
点击查看代码
示例:
vim /etc/httpd/conf.d/test.conf //修改配置文件
Listen 8080 //监听端口8080
3.包含其他配置文件
指令:
- Include file-path|directory-path|wildcard
- IncludeOptional file-path|directory-path|wildcard
说明:
- Include和IncludeOptional功能相同,都可以包括其它配置文件
- 但是当无匹配文件时,include会报错,IncludeOptional会忽略错误
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 此为默认值
示例:
点击查看代码
[root@localhost ~]#curl -I 192.168.91.101
............................
Server: Apache/2.4.6 (CentOS)
[root@node2 httpd]#vim conf.d/test.conf //修改配置文件
Listen 8080
ServerTokens Prod //添加指令
[root@localhost ~]#curl -I 192.168.91.101
............................
Server: Apache //隐藏服务器版本信息
5.持久连接
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认开启持久连接
断开条件:
- 时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级
- 请求数量: 请求数达到指定值,也会断开
副作用:对并发访问量大的服务器,持久连接会使有些请求得不到响应
持久连接相关指令:
点击查看代码
KeepAlive On|Off
KeepAliveTimeout 15 //连接持续15s,可以以ms为单位,默认值为5s
MaxKeepAliveRequests 500 //持久连接最大接收的请求数,默认值100
6.DSO
Dynamic Shared Object,加载动态模块配置,不需重启即生效
查看静态编译的模块:httpd -l
查看静态编译及动态装载的模块:httpd -M
7.定义Main server的文档页面路径
7.1 修改主站点
格式:
点击查看代码
DocumentRoot "/path”
<directory /path>
Require all granted
</directory>
说明:
- DocumentRoot 指向的路径为URL路径的起始位置
- /path 必须显式授权后才可以访问
示例:
点击查看代码
[root@node1 ~]# vim /etc/httpd/conf/httpd.conf //编辑主配置文件
95 ServerName www.example.com:80 //开启,否则会报错
.....................
119 #DocumentRoot "/var/www/html" //注释掉
120 DocumentRoot "/opt" //把主站点改成/opt
121
122 <Directory "/opt">
123 Require all granted //给/opt文件夹授权,谁都可以访问
124 </Directory>
[root@node1 ~]# httpd -t //检查语法格式
Syntax OK
[root@node1 ~]# systemctl restart httpd //重启服务
[root@node1 ~]# cd /opt //切换到/opt目录下
[root@node1 opt]# echo "zhuzhandian" > index.html //生成页面
[root@node2 ~]# curl 192.168.204.10 //用7-2验证
zhuzhandian
7.2设置别名目录
alias 别名 类似于置换
格式:
点击查看代码
alias /URL/ /PATH/
url:路径
path:具体路径
示例:
点击查看代码
[root@node1 opt]# vim /etc/httpd/conf/httpd.conf //修改主配置文件
127 alias /news /data/cxk ///news是你的实际访问路径,访问192.168.204.10/news 等于访问系统下 /data/cxk目录下的文件
128
129 <Directory "/data">
130 Require all granted
131 </Directory>
[root@node1 opt]# httpd -t //检查语法
Syntax OK
[root@node1 opt]# systemctl restart httpd //重启服务
[root@node1 /]# mkdir data //创建/data目录
[root@node1 /]# cd /data //切换到data下
[root@node1 data]# mkdir cxk //创建cxk文件夹
[root@node1 data]# echo cxk > /data/cxk/index.html //生成页面
浏览器验证 192.168.204.10/news 会显示cxk
- 定义站点默认主页面文件
当我们访问服务器时,省略了最后的文件,默认自动会加上index.html,这个是可以修改的。
DirectoryIndex index.html
点击查看代码
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf //修改主配置文件
164: DirectoryIndex index.txt index.html //都没有会报错
- 虚拟主机
httpd 支持在一台物理主机上实现多个网站,即多虚拟主机。
多虚拟主机有三种实现方案:
- 基于ip:为每个虚拟主机准备至少一个ip地址
- 基于port:为每个虚拟主机使用至少一个独立的port
- 基于域名:为每个虚拟主机使用至少一个域名
9.1 基于端口
点击查看代码
192.168.204.10:80
192.168.204.10:80
[root@node1 cxk]# cp /usr/share/doc/httpd-2.4.6/httpd-vhosts.conf /etc/httpd/conf.d/ //复制模板
[root@node1 cxk]# cd /etc/httpd/conf.d //切换到子配置文件目录下
[root@node1 conf.d]# ls
autoindex.conf httpd-vhosts.conf README userdir.conf welcome.conf
[root@node1 conf.d]# mv httpd-vhosts.conf vhosts.conf //改名
[root@node1 conf.d]# ls
autoindex.conf README userdir.conf vhosts.conf welcome.conf
[root@node1 conf.d]# vim vhosts.conf //修改配置文件
<VirtualHost 192.168.204.10:80> //基于端口
DocumentRoot "/opt/cxk" //主站点
ServerName www.cxk.com //域名
ErrorLog "/opt/cxk/log/error-cxk.log" //错误日志地址
CustomLog "/opt/cxk/log/access-cxk.log" common
</VirtualHost>
<VirtualHost 192.168.204.10:9527> //基于端口
DocumentRoot "/opt/wyf" //主站点
ServerName www.wyf.com //域名
ErrorLog "/opt/wyf/log/error-wyf.log" //错误日志地址
CustomLog "/opt/wyf/log/access-wyf.log" common
</VirtualHost>
listen 9527 //监听端口
<Directory "/opt">
Require all granted //授权
</Directory>
[root@node1 conf.d]# cd /opt //切换到opt下
[root@node1 opt]# mkdir {cxk,wyf}/log -p //建立日志文件夹
[root@node1 opt]# echo ckx > cxk/index.html //生成页面,访问80端口显示cxk
[root@node1 opt]# echo wyf > wyf/index.html //生成页面,访问9527端口显示wyf
[root@node1 conf.d]# systemctl restart httpd //重启服务
[root@node1 opt]# tree //查看opt目录结构
.
├── cxk
│ ├── index.html
│ └── log
│ ├── access-cxk.log //http7个过程最后一步是记录日志,重启服务后自动生成
│ └── error-cxk.log
├── rh
└── wyf
├── index.html
└── log
├── access-wyf.log
└── error-wyf.log
`验证:`
[root@node2 ~]# curl 192.168.204.10:80
cxk
[root@node2 ~]# curl 192.168.204.10:9527
wyf
9.2 基于ip地址
点击查看代码
192.168.204.10
192.168.204.11
[root@node1 opt]# vim /etc/httpd/conf.d/vhosts.conf //编辑配置文件
<VirtualHost 192.168.204.10> //基于ip
DocumentRoot "/opt/cxk"
ServerName www.cxk.com
ErrorLog "/opt/cxk/log/error-cxk.log"
CustomLog "/opt/cxk/log/access-cxk.log" common
</VirtualHost>
<VirtualHost 192.168.204.11> //基于ip
DocumentRoot "/opt/wyf"
ServerName www.wyf.com
ErrorLog "/opt/wyf/log/error-wyf.log"
CustomLog "/opt/wyf/log/access-wyf.log" common
</VirtualHost>
<Directory "/opt">
Require all granted //授权
</Directory>
[root@node1 opt]# ifconfig ens33:0 192.168.204.11/24 //添加虚拟网卡
[root@node1 opt]# systemctl restart httpd //重启服务
`验证:`
[root@node2 ~]# curl 192.168.204.10
cxk
[root@node2 ~]# curl 192.168.204.11
wyf
9.3 基于域名
点击查看代码
www.cxk.com
www.wyf.com
[root@node1 opt]# vim /etc/httpd/conf.d/vhosts.conf //修改配置文件
<VirtualHost 192.168.204.10>
DocumentRoot "/opt/cxk"
ServerName www.cxk.com //基于域名
ErrorLog "/opt/cxk/log/error-cxk.log"
CustomLog "/opt/cxk/log/access-cxk.log" common
</VirtualHost>
<VirtualHost 192.168.204.10>
DocumentRoot "/opt/wyf"
ServerName www.wyf.com //基于域名
ErrorLog "/opt/wyf/log/error-wyf.log"
CustomLog "/opt/wyf/log/access-wyf.log" common
</VirtualHost>
<Directory "/opt">
Require all granted //授权
</Directory>
[root@node1 opt]# systemctl restart httpd //重启服务
`对面服务器设置:`
[root@node2 ~]# vim /etc/hosts //修改配置文件
192.168.204.10 www.cxk.com www.wyf.com
`验证:`
[root@node2 ~]# curl www.cxk.com
cxk
[root@node2 ~]# curl www.wyf.com
wyf