文章目录
- 一、http协议
- http协议通信过程
- http相关技术
- 网站访问量
- HTTP工作机制
- HTTP协议版本
- HTTP请求访问的完整过程
- HTTP报文头部
- 响应报文
- 二、httpd安装组成
- apache介绍和特点
- 工作模式( MPM multi-processing module )
- Http相关文件
- Http编译安装
- httpd常见配置
- 虚拟主机
- 日志
- 基于用户的访问控制
一、http协议
http协议通信过程
HTTP(HyperText Transfer Protocol,超文本传输协议,默认端口:80/tcp)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础设计HTTP最初的目的是为了提供一种远距离共享知识的方式,借助多文档进行关联实现超文本,连成相互参阅的WWW(world wide web,万维网)。
http相关技术
1.web开发语言
html
Hyper Text Markup Language 超文本标记语言,编程语言,主要负责实现页面的结构
CSS
Cascading Style Sheet 层叠样式表, 定义了如何显示(装扮) HTML 元素,比如:字体大小和颜色属性等。样式通常保存在外部的 .css 文件中,用于存放一些HTML文件的公共属性,从而通过仅编辑一个简单的 CSS 文档,可以同时改变站点中所有页面的布局和外观。
js
javascript,实现网页的动画效果,但实属于静态资源。
2.MIME
MIME(Multipurpose Internet Mail Extensions)协议是一种互联网标准,用于在电子邮件和其他互联网应用中扩展消息格式。它为不同类型的数据在互联网上的传输和处理提供了一个标准化的框架。
一些常见的MIME类型包括:
- text/plain: 纯文本
- text/html: HTML文本
- image/jpeg: JPEG图像
- audio/mpeg:MP3音频
- video/mp4: MP4视频
- application/pdf: PDF文档
- application/octet-stream: 二进制数据
简单来说:如果文件的格式在上述类型中,我们可以直接打开,如果不在,电脑执行下载。
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:密码,用户对应的密码,中间用:分隔
- post:主机,资源宿主服务器的主机名或IP地址
- port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号
- path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔
- params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔
- query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔
- frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔
网站访问量
- IP(独立IP):即Internet Protocol,指独立IP数。
- PV(访问量): 即Page View, 页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量。
- UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的。
HTTP工作机制
一次http事务包括:
- http请求:http request
- http响应:http response
Web资源:web resource, 一个网页由多个资源(文件)构成,打开一个页面,通常会有多个资源展示出来,但是每个资源都要单独请求。因此,一个"Web 页面”通常并不是单个资源,而是一组资源的集合。则需要多个tcp链接。
资源类型:
-
静态文件:无需服务端做出额外处理,服务器端和客户端的文件内容相同。
常见文件后缀:.html, .txt, .jpg, .js, .css, .mp3, .avi -
动态文件:服务端执行程序,返回执行的结果,服务器端和客户端的文件内容不相同。
常见文件后缀:.php, .jsp ,.asp
提高HTTP连接性能
- 并行连接:通过多条TCP连接发起并发的HTTP请求
- 持久连接:keep-alive,重用TCP连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接
- 管道化连接:通过共享TCP连接,发起并发的HTTP请求
- 复用的连接:交替传送请求和响应报文
HTTP协议版本
1.http 0.9版本:原型版本,功能简陋,只能执行下载命令。
2.http 1.0版本:加入了多种方法,不仅仅能下载,还能上传,不支持长链接。
3.http1.1版本:引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,是运用最广泛的版本。
HTTP请求访问的完整过程
1.建立连接
2.接收请求
3.处理请求
4.访问资源
5.构建响应报文
6.发送响应报文
7.记录日志
1.建立连接:
客户端发送请求至服务端,服务端接受或拒绝连接请求。
2.接收请求:
接收客户端请求报文中对资源的一次请求的过程。
- 单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
- 多进程I/O模型:并行启动多个进程,每个进程响应一个连接请求
- 复用I/O结构:启动一个进程,同时响应N个连接请求
- 复用的多进程I/O模型:启动M个进程,每个进程响应N个连接请求,同时接收M*N个请求
3.处理请求:
服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理。
常用请求的方法:GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS
4.访问资源:
服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源。
5.构建响应报文:
一旦Web服务器识别除了资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中 包含有响应状态码、响应首部,如果生成了响应主体的话,还包括响应主体
1)响应实体:如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。响应报文中通常包括:
描述了响应主体MIME类型的Content-Type首部
描述了响应主体长度的Content-Length 实际报文的主体内容。
2)URL重定向:web服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径。
3)MIME类型: Web服务器要负责确定响应主体的MIME类型。多种配置服务器的方法可将MIME类型与资源管理起来。
6.发送响应报文:
Web服务器通过连接发送数据时也会面临与接收数据一样的问题。服务器可能有很多条到各个客户端的连接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。服务器要记录连接的状态,还要特别注意对持久连接的处理。对非持久连接而言,服务器应该在发送了整条报文之后,关闭自己这一端的连接。对持久连接来说,连接可能仍保持打开状态,在这种情况下,服务器要正确地计算Content-Length首部,不然客户端就无法知道响应什么时候结束。
7、记录日志:
最后,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务。
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:参数,但是这个不常用,指定一些参数,譬如指定传输方式
-
qurey:查询参数
-
frag:html资源片段,譬如html文档过大的时候,frag定位到html的一部分。
首部字段:
使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容,HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:” 分隔 。
实体:
请求时附加的数据或响应时附加的数据,例如:登录网站时的用户名和密码,博客的上传文章,论坛上的发言等。
响应报文
状态码:
三位数字,标记请求处理过程中发生的情况。
http协议状态码分类
1xx:100-101 信息提示
2xx:200-206 成功连接
3xx:300-307 重定向
4xx:400-415 错误类信息,客户端错误
5xx:500-505 错误类信息,服务器端错误
http协议常用的状态码
200: 成功,请求数据通过响应报文的entity-body部分发送;
301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;
302: 响应报文Location指明资源临时新位置
304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;
307: 浏览器内部重定向
401: 需要输入账号和密码认证方能访问资源;
403: 请求被禁止;
404: 服务器无法找到客户端请求的资源;
500: 服务器内部错误;
502: 代理服务器从后端服务器收到了一条伪响应,如无法连接到网关;
503: 服务不可用,临时服务器维护或过载,服务器无法处理请求,比如:php服务停止,无法处理php程序
504: 网关超时
二、httpd安装组成
apache介绍和特点
apache功能:
- 提供http协议服务
- 可以虚拟多个主机
- CGI:Common Gateway Interface,通用网关接口,支持动态程序
- 反向代理: 代理的是服务端 正向代理: 代理的是客户端
- 负载均衡
- 路径别名
- 丰富的用户认证机制:basic,digest
- 支持第三方模块
apache特性:
- 高度模块化:core + modules
- DSO:Dynamic Shared Object 动态加载/卸载
- MPM:multi-processing module 多路处理模块
工作模式( MPM multi-processing module )
**prefork:**多进程I/O模型,每个进程响应一个请求,CentOS 7 httpd默认模型一个主进程:生成和回收n个子进程,创建套接字,不响应请求多个子进程:工作 work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求。
Prefork MPM预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景。
优点:稳定,服务周到 。
缺点:慢,占用资源,不适用于高并发场景。
worker:复用的多进程I/O模型,多进程多线程。
worker MPM是一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程程来处理请求,当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,因此可以承受更高的并发。
优点:相比prefork 占用的内存较少,可以同时处理更多的请求
缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)
event:事件驱动模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n,有专门的监控线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力。
event MPM是Apache中最新的模式,每个进程响应多个请求,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力event只在有数据发送的时候才开始建立连接,连接请求才会触发工作线程,即使用了TCP的一个选项,叫做延迟接受连接TCP_DEFER_ACCEPT,加了这个选项后,若客户端只进行TCP连接,不发送请求,则不会触发Accept操作,也就不会触发工作线程去干活,进行了简单的防攻击(TCP连接)。
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。
缺点:没有线程安全控制。
Http相关文件
建议用yum安装
httpd相关文件
配置文件:
- /etc/httpd/conf/httpd.conf 主配置文件
- /etc/httpd/conf.d/*.conf 子配置文件
- /etc/httpd/conf.d/conf.modules.d/ 模块加载的配置文件
检查配置语法:http-t
服务单元文件:
- /usr/lib/systemd/system/httpd.service
- 配置文件:/etc/sysconfig/httpd
Http编译安装
APR概念说明
APR:Apache portable Run-time libraries,Apache可移植运行库,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。在早期的Apache版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不同的平台调用不同的处理函数随着Apache的进一步开发,Apache组织决定将这些通用的函数独立出来并发展成为一个新的项目。这样,APR的开发就从Apache中独立出来,Apache仅仅是使用 APR而已。
编译安装过程
安装编译所需的软件即调试依赖环境。
准备httpd软件包。
将apr导入到http包下面。
编译代码
cd httpd-2.4.46/
[root@centos7 ~]./configure --prefix=/apps/httpd \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork
make && make install
设置service服务,使得可以用systemd管理httpd服务。
至此编译安装完成。
httpd常见配置
指定服务器名
指定服务器名,一般要求服务器使用域名登录,一般不用IP地址,故需要给他指定域名。
在第95行设置你的域名。
主配置文件能读取子配置文件
情况模拟:一台服务器上可能会部署多个软件,全部写在主配置文件中,不仅会增加维护难度,如果一个配置出现错误,所有软件都不能提供服务,故出现了子配置文件。但如何让主配置文件知道子配置文件呢?
主配置文件中会有如下配置:
同样可以换成Include;Include和IncludeOptional功能相同,都可以包括其它配置文件,但是当无匹配文件时,include会报错,IncludeOptional会忽略错误。
监听地址
注意:
- 省略IP表示所有IP均可访问
- listen指令至少一个,可以重复出现多次。
隐藏服务器版本信息
语法
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)
在配置文件中写下上述语句即可形成该效果。
持久连接
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认开启持久连接。
默认开启持久连接,持久连接断开条件:
- 时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级。
- 请求数量: 请求数达到指定值,也会断开。
缺点:对并发访问量大的服务器,持久连接会使有些请求得不到响应。
建议:使用较短的持久连接时间
KeepAlive On|Off
KeepAliveTimeout 15 #连接持续15s,可以以ms为单位,默认值为5s
MaxKeepAliveRequests 500 #持久连接最大接收的请求数,默认值100
定义Main server的文档页面路径
DocumentRoot "/path”
<directory /path>
Require all granted
</directory>
说明:
- DocumentRoot指向的路径为URL路径的起始位置
- /path 必须显式授权后才可以访问
示例:
DocumentRoot "/data/html"
<directory /data/html>
Require all granted
</directory>
URL和磁盘本地路径的映射关系
http://HOST:PORT/test/index.html --> /data/html/test/index.html
别名
格式
alias /URL/ /PATH/
定义站点默认主页面文件
当我们访问服务器时 省略了最后的文件, 默认自动会加上 index.html 。这个是可以修改的,如果找不到在这一行的文件,会404报错。
虚拟主机
httpd 支持在一台物理主机上实现多个网站,即多虚拟主机
网站的唯一标识:
- IP相同,但端口不同
- IP不同,但端口均为默认端口
- FQDN不同, IP和端口都相同
多虚拟主机有三种实现方案:
- 基于ip:为每个虚拟主机准备至少一个ip地址
- 基于port:为每个虚拟主机使用至少一个独立的port
- 基于FQDN:为每个虚拟主机使用至少一个FQDN,请求报文中首部
模版文件在 该路径下/usr/share/doc/httpd-2.4.6/httpd-vhosts.conf
基于端口号
基于IP地址
基于域名
基于客户端IP地址实现访问控制
基于客户端 IP 地址实现访问控制
针对各种资源,可以基于以下两种方式的访问控制:
- 客户端来源地址
- 用户账号
基于客户端的IP地址的访问控制:
-
无明确授权的目录,默认拒绝
-
允许所有主机访问:Require all granted
-
拒绝所有主机访问:Require all denied
-
控制特定的IP访问:
- Require ip IPADDR:授权指定来源的IP访问
- Require not ip IPADDR:拒绝特定的IP访问
-
控制特定的主机访问:
- Require host HOSTNAME:授权特定主机访问
- Require not host HOSTNAME:拒绝
- HOSTNAME:
- FQDN:特定主机
- domin.tld:指定域名下的所有主机
白名单(多个语句只要有一个成功则成功)
<Directory "/data">
<RequireAny>
Require all denied
require ip 192.168.232.20
</RequireAny>
</Directory>
黑名单,不能有失败,至少有一个成功匹配才成功,失败优先。
<Directory "/data">
<RequireAll>
Require all granted
require not ip 192.168.91.101
</RequireAll>
</Directory>
日志
httpd有两种日志格式
- 访问日志
- 错误日志
如果访问不成功,先去看日志中的状态码,快速定位错误。
这是定义的日志格式的名字。
%h #客户端IP地址
%l #远程用户,启用mod_ident才有效,通常为减号"-”
%u #验证(basic,digest)远程用户,非登录访问时,为一个减号"-”
%t #服务器收到请求时的时间
%r #First line of request,即表示请求报文的首行;记录了此次请求的"方法”,"URL”以及协议版本
%>s #响应状态码
%b #响应报文的大小,单位是字节;不包括响应报文http首部
%{Referer}i #请求报文中首部"referer”的值;即从哪个页面中的超链接跳转至当前页面的
%{User-Agent}i #请求报文中首部"User-Agent”的值;即发出请求的应用程序
%{VARNAME}i #请求中发送到服务器的 VARNAME 头部行的内容
基于用户的访问控制
认证质询:WWW-Authenticate,响应码为401,拒绝客户端请求,并说明要求客户端需要提供账号和密码。
认证:Authorization,客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源。
使用htpasswd模块
-c 自动创建文件,仅应该在文件不存在时使用
-b 非交互方式创建用户,命令后面可以接密码
-p 明文密码
-d CRYPT格式加密,默认
-m md5格式加密
-s sha格式加密
-D 删除指定用户
操作