目录
7. MPM (Multi-Processing Module)多路处理模块
一、http协议相关
在了解http协议前先介绍一个设备间通信聊天的案例:
192.168.190.100:
[root@localhost ~]# yum install nc -y #安装nc工具
[root@localhost ~]# nc -l 8000 #监听8000端口
192.168.190.101:
[root@localhost ~]# nc 192.168.190.100 8000 #主机2去访问主机1(服务端)的8000端口就可以聊天了
注:分析端口作用。以80端口为例,如果在四层传输层角度来看:为tcp 80端口;如果在七层应用层角度:①看成协议则为http协议。②看成程序则可能是apache或者nginx。需要站在不同的角度来分析,访问tcp80端口传到应用层,http协议产生相应的程序。
注:nc(netcat)是一个用于处理网络连接的命令行工具,它在Linux系统中非常实用,主要用途有:端口扫描、监听端口、文件传输、简单的网络调试等。 虽然nc可以接收消息,但是无法同时接收大量消息。如果消息过多则需要排队,即消息队列。
1. 相关概念
HTTP(Hypertext Transfer Protocol)是一种用于传输超文本数据(如 HTML)的应用层协议。它是Web开发中最为重要的协议之一,用于客户端和服务器之间的通信。
- 互联网:是网络的网络,是所有类型网络的母集
- 因特网:世界上最大的互联网网络。即因特网概念从属于互联网概念。习惯上,大家把连接在因特网上的计算机都成为主机。
- 万维网:WWW(world wide web)万维网并非某种特殊的计算机网络,是一个大规模的、联机式的信息贮藏库,使用链接的方法能非常方便地从因特网上的一个站点访问另一个站点(超链技术),具有提供分布式服务的特点。万维网是一个分布式的超媒体系统,是超文本系统的扩充,基于B/S架构实现。
- URL:万维网使用统一资源定位符(Uniform Resource Locator)来标志万维网上的各种文档,并使每个文档在整个因特网的范围内具有唯一的标识符URL。
- HTTP:为解决"用什么样的网络协议来实现整个因特网上的万维网文档”这一难题,就要使万维网客户程序(以浏览器为主,但不限于浏览器)与万维网服务器程序之间的交互遵守严格的协议,即超文本传送协议(HyperText Transfer Protocol)。HTTP是处于应用层的协议,使用TCP传输层协议进行可靠的传送。因此,需要特别提醒的是,万维网是基于因特网的一种广泛因特网应用系统,且万维网采用的是HTTP(80/TCP)和 HTTPS(443/TCP)的传输协议,但因特网还有其他的网络应用系统(如:FTP、SMTP等等)。
- HTML:为了解决"怎样使不同作者创作的不同风格的万维网文档,都能在因特网上的各种主机上显示出来,同时使用户清楚地知道在什么地方存在着链接”这一问题,万维网使用超文本标记语言(HyperText Markup Language),使得万维网页面的设计者可以很方便地用链接从页面的某处链接到因特网的任何一个万维网页面,并且能够在自己的主机品目上将这些页面显示出来。HTML与txt一样,仅仅是是一种文档,不同之处在于,这种文档专供于浏览器上为浏览器用户提供统一的界面呈现的统一规约。且具备结构化的特征,这是txt所不具备的强制规定。
2. 访问浏览器的过程
3. http协议通信过程
(1)建立连接:客户端(如浏览器)向服务器发起连接请求。这通常是通过TCP连接来实现的。
(2)发送请求:客户端构建一个HTTP请求,其中包括请求方法(GET, POST, PUT, DELETE 等)、资源路径、HTTP版本、请求头和可选的请求体(对于POST或PUT请求)。然后将该请求发送到服务器。
(3)处理请求:服务器收到请求后,会解析请求并根据请求的内容执行相应的操作,比如获取资源、存储数据等。
(4)生成响应:服务器根据请求执行相应操作后,会生成一个HTTP响应。响应包括HTTP版本、状态码、响应头和响应体。
(5)发送响应:服务器将响应发送回客户端。
(6)关闭连接:一旦响应传输完成,客户端和服务器会断开连接,除非在HTTP/1.1中使用了持久连接(keep-alive)。
4. http相关技术
4.1 WEB开发语言
html:Hyper Text Markup Language 超文本标记语言,编程语言,主要负责实现页面的结构。虽然不是一种传统的编程语言,但它是Web页面结构的基础语言,用于定义网页内容。
css:Cascading Style Sheet 层叠样式表, 定义了如何显示(装扮) HTML 元素,比如:字体大小和颜色属性等。样式通常保存在外部的 .css 文件中,用于存放一些HTML文件的公共属性,从而通过仅编辑一个简单的 CSS 文档,可以同时改变站点中所有页面的布局和外观。 同样不算是传统的编程语言,但用于定义网页的样式和布局。
js:javascript,实现网页的动画效果,但实属于静态资源。用于前端开发,可以通过浏览器执行,也可用于服务器端(Node.js)。
4.2 MIME
MIME(Multipurpose Internet Mail Extensions)是一种互联网标准,最初用于电子邮件系统,后来被广泛应用于HTTP协议中。MIME类型在HTTP协议中扮演着重要的角色,它指示了一份数据的性质和格式。这对于Web浏览器正确地显示内容或者执行适当的操作至关重要。
MIME类型通常由两部分组成:主类型和子类型,用斜杠分隔。例如,"text/html" 中,"text" 是主类型,"html" 是子类型。
以下是一些常见的MIME类型示例:
- text/html:HTML文档
- image/jpeg:JPEG图像
- application/json:JSON数据
- audio/mpeg:MP3音频文件
- video/mp4:MP4视频文件
- application/pdf:PDF文档
- application/xml:XML数据
通过MIME类型,Web服务器可以告知客户端如何处理接收到的数据,比如将其显示为一个网页、作为下载文件、以特定方式播放音频/视频等。
4.3 URI(i) 和 URL uri
URI: Uniform Resource Identifier 统一资源标识,分为URL 和 URN
-
URN:Uniform Resource Naming,统一资源命名
示例: P2P下载使用的磁力链接是URN的一种实现
magnet:?xt=urn:btih:660557A6890EF888666(只是描述了资源的名字,并没有明确该资源在哪里)
-
URL:Uniform Resorce Locator,统一资源定位符,用于描述某服务器某特定资源位置
两者区别:
-
URN如同一个人的名称,而URL代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。URN仅用于命名,而不指定地URL组成
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
# ://为固定格式
- scheme:方案,访问服务器以获取资源时要使用哪种协议,比如ftp、http、https
- user:用户(虚拟),某些方案访问资源时需要的用户名
- password:密码,用户对应的密码,中间用:分隔
- Host:主机,资源宿主服务器的主机名或IP地址
- port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号
- path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔
- params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔。?代表查询
- query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔
- frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔
4.4 网站访问量
网站访问量统计的重要指标:
- IP(独立IP):即Internet Protocol,指独立IP数。一天内来自相同客户机IP 地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标
- PV(访问量): 即Page View, 页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量
- UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的
4.5 http工作机制
一次http事务包括:
- http请求:http request
- http响应:http response
关键特点:
- 状态无关性:每个请求都是独立的,服务器不会保留有关客户端的状态信息。
- 灵活性:支持多种类型的数据传输,如文本、图像、视频等。
- 无连接:默认情况下,HTTP是无连接的,每个请求/响应对都需要单独的连接。
- 简单性:HTTP使用简单的文本格式,易于阅读和调试。
安全性:
HTTP在传输过程中的数据是明文的,因此容易受到窃听和篡改的风险。为了提高安全性,可以使用HTTPS协议,通过SSL/TLS加密来保护数据传输的安全性。
4.6 http协议版本
① 0.9:只有get,只有下载,没有上层
② 1.0 没有长连接可以下载和上传
③ 1.1 支持长连接和上传
HTTP1.0和HTTP1.1的区:
- 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-NoneMatch等更多可供选择的缓存头来控制缓存策略
- 带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如:客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),方便了开发者自由的选择以便于充分利用带宽和连接
- 错误通知的管理,在HTTP1.1中新增24个状态响应码,如409(Conflict)表示请求的资源与资源当前状态冲突;410(Gone)表示服务器上的某个资源被永久性的删除
- Host 头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)
- 长连接,HTTP 1.1支持持久连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,弥补了HTTP1.0每次请求都要创建连接的缺点
HTTP1.0和1.1的问题:
- HTTP1.x在传输数据时,每次都需要重新建立连接,无疑增加了大量的延迟时间,特别是在移动端更为突出
- HTTP1.x在传输数据时,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份,无法保证数据的安全性
- HTTP1.x在使用时,header里携带的内容过大,增加了传输的成本,并且每次请求header基本不怎么变化,尤其在移动端增加用户流量
- 虽然HTTP1.x支持了keep-alive,来弥补多次创建连接产生的延迟,但是keep-alive使用多了同样会给服务端带来大量的性能压力,并且对于单个文件被不断请求的服务(例如图片存放网站),keepalive可能会极大的影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间
HTTPS协议:
HTTPS(HyperText Transfer Protocol Secure)是一种用于安全传输数据的通信协议,它是HTTP的安全版。HTTPS通过在HTTP下加入SSL/TLS协议(Secure Socket Layer/Transport Layer Security),从而实现对传输过程中数据的加密和身份认证,提供了更安全的数据传输方式。HTTPS协议的广泛应用对于保护用户隐私和安全至关重要,特别是在进行敏感信息传输和用户认证时。因此,许多网站和应用程序都已经或正在过渡到使用HTTPS协议。
HTTPS特点:
- HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费
- HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的
- HTTP和HTTPS使用的是不同的连接方式,端口不同,前者是80,后者是443
- HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题
- HTTPS 实现过程降低用户访问速度,但经过合理优化和部署,HTTPS 对速度的影响还是可以接受的
HTTP2协议:
- 头信息和数据体都是二进制,称为头信息帧和数据帧
- 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免了"队头堵塞",此双向的实时通信称为多工(Multiplexing)
- 引入头信息压缩机制(header compression),头信息使用gzip或compress压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送同样字段,只发送索引号,提高速度
- HTTP/2 允许服务器未经请求,主动向客户端发送资源,即服务器推送(server push)
4.7 http请求访问的过程
① 建立连接
② 接收请求
③ 处理请求
④ 访问资源
⑤ 构建响应报文
⑥ 发送响应报文
⑦ 记录日志
① 内核 收到 请求后 会根据报文中 端口号信息, 找到处理该请求的进程 你要 找的端口号是80
② 会将请转交给80端口上的 进程(nginx)nginx进程会根据请求对照 配置文件进行处理
③ nginx 进程分析完要去找资源, 由于他是进程 他没有资格直接使用磁盘上的资源, 所以需要内核协助获取资源(a.jpg)
④ 内核去磁盘上找资源, 找到以后再给 nginx 进程
⑤ nginx进程拿到资源后会构建响应报文,构建完成后 再 发给内核
⑥ 内核 再把 响应网卡 , 网卡再发给客户机
接收客户端请求报文中对某资源的一次请求的过程,Web访问响应模型(Web I/O):
- 单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
- 多进程I/O模型:并行启动多个进程,每个进程响应一个连接请求
- 复用I/O结构:启动一个进程,同时响应N个连接请求
- 复用的多进程I/O模型:启动M个进程,每个进程响应N个连接请求,同时接收M*N个请求
5. http协议及报文头部结构
5.1 http请求报文
HTTP请求报文是由客户端发送到服务器的数据块,用于请求特定资源或执行特定操作。
5.2 响应报文
HTTP响应报文是服务器发送给客户端的数据块,用于传输请求资源或执行操作的结果。
5.2.1 状态码
HTTP响应报文中的状态码用于表示服务器对请求的处理结果。
http协议状态码分类:
1xx:100-101 信息提示
2xx:200-206 成功
3xx:300-307 重定向
4xx:400-415 错误类信息,客户端错误
5xx:500-505 错误类信息,服务器端错误
http协议常用的状态码:
200: 成功,请求数据通过响应报文的entity-body部分发送;OK
301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
302: 响应报文Location指明资源临时新位置 Moved Temporarily
304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified
307: 浏览器内部重定向
401: 需要输入账号和密码认证方能访问资源;Unauthorized
403: 请求被禁止;Forbidden
404: 服务器无法找到客户端请求的资源;Not Found
500: 服务器内部错误;Internal Server Error,比如:cgi程序没有执行权限
502: 代理服务器从后端服务器收到了一条伪响应,如无法连接到网关;Bad Gateway
503: 服务不可用,临时服务器维护或过载,服务器无法处理请求,比如:php服务停止,无法处理php程序
504: 网关超时
二、httpd安装组成
http服务基于C/S结构
1. 常见http服务器程序
- httpd apache,存在C10K(10K connections)问题
- nginx 解决C10K问题lighttpd
- IIS .asp 应用程序服务器
- tomcat .jsp 应用程序服务器
- jetty 开源的servlet容器,基于Java的web容器
- Resin CAUCHO公司,支持servlets和jsp的引擎
- webshpere:IBM公司
- weblogic:BEA,Oracle
- jboss:RedHat,IBM
- oc4j:Oracle
2. apache介绍和特点
Apache是一款开源的跨平台Web服务器软件,最初由美国国家超级计算应用中心(NCSA)开发,后来由Apache软件基金会维护。它是目前全球使用最广泛的Web服务器软件之一,被广泛应用于互联网上的网站和应用程序。
apache 功能:
- 提供http协议服务
- 多个虚拟主机:IP、Port、FQDN
- CGI:Common Gateway Interface,通用网关接口,支持动态程序
- 反向代理
- 负载均衡
- 路径别名
- 丰富的用户认证机制:basic,digest
- 支持第三方模块
apache特性:
- 高度模块化:core + modules
- DSO:Dynamic Shared Object 动态加载/卸载
- MPM:multi-processing module 多路处理模块
2.1 多路处理模块工作模式
① prefork:多进程I/O模型,每个进程响应一个请求,CentOS 7 httpd默认模型一个主进程:生成和回收n个子进程,创建套接字,不响应请求多个子进程:工作 work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求。
Prefork MPM预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景。
- 优点:稳定
- 缺点:慢,占用资源,不适用于高并发场景
② worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型。一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n。
worker MPM是一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程程来处理请求,当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,因此可以承受更高的并发。
- 优点:相比prefork 占用的内存较少,可以同时处理更多的请求
- 缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)
③ event:事件驱动模型(worker模型的变种),CentOS8 默认模型。
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n,有专门的监控线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力。
- 优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
- 缺点:没有线程安全控制
3. httpd安装和相关文件
3.1 包安装httpd并启动httpd服务
版本说明:
- CentOS 7以上,默认系统是httpd 2.4,CentOS 版默认为httpd 2.2
- Ubuntu 18.04默认 Apache/2.4.29
安装方式:
- 包安装: centos发行版,稳定,建议使用
- 编译:定制或特殊需求
范例:安装httpd 2.4
yum install httpd -y
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常见配置
1. 指定服务器名
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
95 #ServerName www.example.com:80
96 ServerName www.fql.com:80
[root@localhost ~]# httpd -t
Syntax OK
2. 包含其它配置文件
如果不想修改主配置文件,可以在子配置文件中。
指令:
Include file-path|directory-path|wildcard
IncludeOptional file-path|directory-path|wildcard
说明:
- Include和IncludeOptional功能相同,都可以包括其它配置文件
- 但是当无匹配文件时,include会报错,IncludeOptional会忽略错误
include 子配置文件:
[root@localhost ~]# grep -i include /etc/httpd/conf/httpd.conf
Include conf.modules.d/*.conf
#模块子配置文件也可以写
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
# Possible values include: debug, info, notice, warn, error, crit,
# If you include a trailing / on /webpath then the server will
# To parse .shtml files for server-side includes (SSI):
# (You will also need to add "Includes" to the "Options" directive.)
AddOutputFilter INCLUDES .shtml
IncludeOptional conf.d/*.conf
#通常写在这边,必须要在/etc/httpd/conf.d/文件夹下以.conf结尾的文件
总目录:
[root@localhost ~]# grep -i serverroot /etc/httpd/conf/httpd.conf
# with "/", the value of ServerRoot is prepended -- so 'log/access_log'
# with ServerRoot set to '/www' will be interpreted by the
# ServerRoot: The top of the directory tree under which the server's
# ServerRoot at a non-local disk, be sure to specify a local disk on the
# same ServerRoot for multiple httpd daemons, you will need to change at
ServerRoot "/etc/httpd"
#主文件夹
主配置文件非注释行:
[root@localhost ~]# grep -i "^[a-z]" /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd" #主目录主站点
Listen 80 #监听端口
Include conf.modules.d/*.conf #模块子配置文件
User apache #以apache身份运行
Group apache #组
ServerAdmin root@localhost #主机名
ServerName www.example.com #域名
DocumentRoot "/var/www/html" #主站点
ErrorLog "logs/error_log" #错误日志
LogLevel warn #日志级别
AddDefaultCharset UTF-8 #字符集
EnableSendfile on #提高静态文件的传输性能
IncludeOptional conf.d/*.conf #用于包含其他配置文件
3. 监听地址
格式:
Listen [IP:]PORT
(1) 省略IP表示为本机所有IP
(2) Listen指令至少一个,可重复出现多
示例:
① 修改主配置文件
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
42 Listen 80
#监听本机的所有80端口
Listen 192.168.190.100:80
#监听ip100的80端口,可用于多网卡
② 子配置文件也可以
[root@localhost ~]# curl 192.168.190.102:9527
curl: (7) Failed connect to 192.168.190.102:9527; 拒绝连接
#未配置监听9527端口,无法访问该端口
[root@localhost ~]# vim /etc/httpd/conf.d/test.conf
Listen 9527 #这里对字母大小写不敏感,可以写成listen
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# curl 192.168.190.102:9527
#配置监听9527端口,可以访问该端口
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 此为默认值
示例:
① 修改httpd主配置文件
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
43 ServerTokens Prod
[root@localhost ~]# systemctl restart httpd
② 版本信息前后对比
[root@localhost opt]# curl 192.168.190.103 -I
HTTP/1.1 200 OK
Date: Wed, 28 Feb 2024 08:55:45 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Wed, 28 Feb 2024 08:55:30 GMT
ETag: "4-6126d4e0d09bc"
Accept-Ranges: bytes
Content-Length: 4
Content-Type: text/html; charset=UTF-8
[root@localhost opt]# curl 192.168.190.103 -I
HTTP/1.1 200 OK
Date: Wed, 28 Feb 2024 08:56:18 GMT
Server: Apache #版本号已隐藏
Last-Modified: Wed, 28 Feb 2024 08:55:30 GMT
ETag: "4-6126d4e0d09bc"
Accept-Ranges: bytes
Content-Length: 4
Content-Type: text/html; charset=UTF-8
5. 持久连接
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认开启持久连接。即一次连接多次下载。在早期没有长连接的情况下,每次下次资源都需要一次三次握手,这个过程就很繁琐缓慢。通过长连接可以通过一次三次握手下载多个资源。
默认开启持久连接,持久断开条件:(服务端发起断开)
- 时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级
- 请求数量:请求数达到指定值,也会断开
缺点:对并发访问量大的服务器,持久连接会使有些请求得不到响应
优化方法:使用较短的持久连接时间
持久连接相关指令:
KeepAlive On|Off #默认开启
KeepAliveTimeout 15 #连接持续15s,可以以ms为单位,默认值为5s
MaxKeepAliveRequests 500 #持久连接最大接收的请求数,默认值100
示例:模拟连接断开
① 子配置文件
[root@localhost ~]# vim /etc/httpd/conf.d/test.conf
Listen 9527 #监听9527端口
KeepAlive On #开启长连接
KeepAliveTimeout 300 #300秒超时
MaxKeepAliveRequests 1 #下载超过1个资源断开
[root@localhost ~]# systemctl restart httpd.service
② 服务端主目录添加文件
服务端192.168.190.102:
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# echo hello 7-2 > a
[root@localhost html]# echo bye 7-2 > b
[root@localhost html]# ls
a b
客户端192.168.190.101:
[root@localhost ~]# curl 192.168.190.102/a
hello 7-2
[root@localhost ~]# curl 192.168.190.102/b
bye 7-2
③ 客户端下载超过1个资源测试
[root@localhost ~]# telnet 192.168.190.102 9527
Trying 192.168.190.102...
Connected to 192.168.190.102.
Escape character is '^]'.
GET /a HTTP/1.1
HOST:www.pc.com
HTTP/1.1 200 OK
Date: Thu, 29 Feb 2024 07:00:12 GMT
Server: Apache
Last-Modified: Thu, 29 Feb 2024 06:47:29 GMT
ETag: "a-6127fa219419d"
Accept-Ranges: bytes
Content-Length: 10
hello 7-2
GET /b HTTP/1.1
HOST:www.pc.com
HTTP/1.1 200 OK
Date: Thu, 29 Feb 2024 07:01:17 GMT
Server: Apache
Last-Modified: Thu, 29 Feb 2024 06:47:38 GMT
ETag: "8-6127fa29487f7"
Accept-Ranges: bytes
Content-Length: 8
Connection: close
bye 7-2
Connection closed by foreign host.
#下载第二个资源断开
④ 将超时时间修改为30秒,持续查看连接状态
[root@localhost ~]# telnet 192.168.190.102 9527
Trying 192.168.190.102...
Connected to 192.168.190.102.
Escape character is '^]'.
GET /a HTTP/1.1Connection closed by foreign host.
#会超时自动断开,不过超时时间不一定是精确的
6. DSO (Dynamic Shared Object)
加载动态模块配置,不需重启即生效动态模块所在路径:/usr/lib64/httpd/modules/
主配置 /etc/httpd/conf/httpd.conf 文件中指定加载模块配置文件:
ServerRoot "/etc/httpd"
Include conf.modules.d/*.conf
配置指定实现模块加载格式:
LoadModule <mod_name> <mod_path>
示例:查看模块加载的配置文件
[root@centos7 ~]#ls /etc/httpd/conf.modules.d/
00-base.conf 00-lua.conf 00-optional.conf 00-systemd.conf 10-h2.conf
README
00-dav.conf 00-mpm.conf 00-proxy.conf 01-cgi.conf 10-proxy_h2.conf
[root@centos7 ~]#cat /etc/httpd/conf.modules.d/00-base.conf
查看静态编译的模块:
[root@localhost ~]# httpd -l
Compiled in modules:
core.c #核心模块
mod_so.c #mod模块
http_core.c #http核心模块
查看静态编译及动态装载的模块:
[root@localhost ~]# httpd -M
优化不需要的模块:
[root@localhost conf.modules.d]# vim /etc/httpd/conf.modules.d/00-base.conf
#注释掉不需要的模块即可
7. MPM (Multi-Processing Module)多路处理模块
httpd 支持三种MPM工作模式:prefork,worker,event。三种模块只能使用一种。
[root@localhost ~]# grep Load /etc/httpd/conf.modules.d/00-mpm.conf
# one of the following LoadModule lines:
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
#LoadModule mpm_event_module modules/mod_mpm_event.so
8. prefork模式相关的配置
StartServers 100 #一开始开启100个进程
MinSpareServers 50 #如果一直空闲要最少预留50个进程
MaxSpareServers 80 #如果空闲,最大预留80个进程
ServerLimit 2560 #最多进程数,最大值 20000
MaxRequestWorkers 2560 #最大的并发连接数,默认256
MaxConnectionsPerChild 4000 #子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个
请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)
MaxRequestsPerChild 4000 #从 httpd.2.3.9开始被MaxConnectionsPerChild代替
9. worker和event 模式相关的配置
ServerLimit 256 #服务器可以创建的最大子进程数。每个子进程都可以处理一个连接。默认值是256。
StartServers 5 #服务器启动时创建的子进程数。这些子进程会一直运行,等待处理连接。默认值是5。
MaxRequestWorkers 256 #服务器可以同时处理的最大请求数。这个值应该小于或等于ServerLimit * ThreadsPerChild。默认值是256。
simultaneously
MinSpareThreads 25 #服务器在空闲时保持的最小线程数。如果线程数低于这个值,服务器会创建新的线程。默认值是25。
MaxSpareThreads 75 #设置了服务器在空闲时保持的最大线程数。如果线程数超过这个值,服务器会关闭一些线程。默认值是75。
ThreadsPerChild 25 #每个子进程可以创建的线程数。这个值应该小于或等于MaxRequestWorkers / ServerLimit。默认值是25。
示例:指定开启进程数
查看进程树:
[root@localhost ~]# pstree -p | grep httpd
|-httpd(5887)-+-httpd(5890)
| |-httpd(5891)
| |-httpd(5900)
| |-httpd(5909)
| `-httpd(5910)
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
StartServers 10
[root@localhost ~]# systemctl restart httpd
修改配置后再次查看:
[root@localhost ~]# pstree -p | grep httpd
|-httpd(5982)-+-httpd(5983)
| |-httpd(5984)
| |-httpd(5985)
| |-httpd(5986)
| |-httpd(5987)
| |-httpd(5988)
| |-httpd(5990)
| |-httpd(5991)
| |-httpd(5992)
| `-httpd(5993)
10. 定义Main server的文档页面路径
修改默认主站点目录,配置如下:
DocumentRoot "新目录"
<directory "新目录">
Require all granted #授权
</directory>
示例:
① 修改主配置文件
[root@localhost html]# vim /etc/httpd/conf/httpd.conf
121 DocumentRoot "/data/html/"
122 <Directory "/data/html">
123 Require all granted
124 </Directory>
[root@localhost html]# systemctl restart httpd
② 新建站点目录下web文件
[root@localhost ~]# cd /data/html/
[root@localhost html]# echo new 7-2 > index.html
③ 访问服务端
[root@localhost ~]# curl 192.168.190.102
new 7-2
#主页面目录已更换
定义别名:
① 修改配置文件
[root@localhost html]# vim /etc/httpd/conf/httpd.conf
121 DocumentRoot "/data/html/"
122 <Directory "/data/html">
123 Require all granted
124 </Directory>
125 alias /test /data/html/
[root@localhost html]# systemctl restart httpd
② 访问服务端
[root@localhost ~]# curl 192.168.190.102/test/
new 7-2
11. 定义站点默认主页面文件
当我们访问服务器时,省略了最后的文件,默认会自动加上index.html,这个是可以修改的。
11.1 修改主页面文件
① 修改配置文件
[root@localhost html]# vim /etc/httpd/conf/httpd.conf
#DirectoryIndex index.html
DirectoryIndex index.txt index.html
[root@localhost html]# systemctl restart httpd
② 添加新默认文件
[root@localhost html]# cd /data/html/ #前面修改了Main server路径默认/var/www/html/
[root@localhost html]# ls
index.html
[root@localhost html]# echo txt > index.txt
③ 访问
[root@localhost ~]# curl 192.168.190.102
txt
11.2 针对目录和RRL实现访问控制
options指令:
后跟1个或多个以空白字符分隔的选项列表,在选项前的+,-表示增加或删除指定选项
常见选项:
- Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
- FollowSymLinks:允许访问符号链接文件所指向的源文件
- None:全部禁用
- AI:全部允许
Options:可以写在 目录里 <>也可以写在外面
示例:
指明不在在页面返回索引列表:
① 修改子配置文件
[root@localhost html]# vim /etc/httpd/conf.d/test.conf
ServerName localhost:80
<Directory "/data/html/">
# Allow open access:
Require all granted
options Indexes
</Directory>
alias /test /data/html/
[root@localhost ~]# httpd -t
Syntax OK
[root@localhost ~]# systemctl restart httpd
② 确定主目录没有index文件,拷贝其他类型文件
[root@localhost ~]# cd /data/html/
[root@localhost html]# ls
[root@localhost html]# cp /etc/shadow .
[root@localhost html]# cp /etc/fstab .
[root@localhost html]# cp /etc/passwd .
[root@localhost html]# ls
fstab passwd shadow
③ 浏览器访问服务端
允许访问链接:
① 修改子配置文件
[root@localhost html]# vim /etc/httpd/conf.d/test.conf
ServerName localhost:80
<Directory "/data/html/">
# Allow open access:
Require all granted
options Indexes FollowSymLinks
</Directory>
alias /test /data/html/
[root@localhost ~]# httpd -t
Syntax OK
[root@localhost ~]# systemctl restart httpd
② 指定主目录添加软链接
[root@localhost html]# cd /data/html/
[root@localhost html]# ls
fstab passwd shadow
[root@localhost html]# ln -s /opt ./abc
[root@localhost html]# ls
abc fstab passwd shadow
③ 访问页面,访问软链接
12. 虚拟主机
httpd 支持在一台物理主机上实现多个网站,即多虚拟主机
网站的唯一标识:
- IP相同,但端口不同
- IP不同,但端口均为默认端口
- FQDN不同, IP和端口都相同
多虚拟主机有三种实现方案:
- 基于ip:为每个虚拟主机准备至少一个ip地址
- 基于port:为每个虚拟主机使用至少一个独立的port
- 基于FQDN:为每个虚拟主机使用至少一个FQDN,请求报文中首部 Host:www.kgc.com
12.1 基于ip地址
访问不同的ip得到不同的页面
① 修改子配置文件
[root@localhost ~]# systemctl restart httpd
<Directory "/data/html">
Require all granted
</Directory>
<VirtualHost 192.168.190.102>
ServerAdmin support@jfedu.net
DocumentRoot "/data/html/102"
ServerName www.accp.com
</VirtualHost>
<VirtualHost 192.168.190.202>
ServerAdmin support@jfedu.net
DocumentRoot "/data/html/202"
ServerName www.accp.com
</VirtualHost>
[root@localhost ~]# systemctl restart httpd
② 编辑指定目录web文件
[root@localhost ~]# cd /data/html
[root@localhost html]# mkdir {102,202}
[root@localhost html]# echo 102 > 102/index.html
[root@localhost html]# echo 202 > 202/index.html
③ 新增虚拟网卡
[root@localhost ~]# ifconfig ens33:0 192.168.190.202/24
④ 访问服务端主页
[root@localhost ~]# curl 192.168.190.102
102
[root@localhost ~]# curl 192.168.190.202
202
12.2 基于端口地址
访问不同的端口得到不同的页面
① 修改子配置文件
[root@localhost ~]# systemctl restart httpd
listen 9527
<Directory "/data/html">
Require all granted
</Directory>
<VirtualHost 192.168.190.102:80>
ServerAdmin support@jfedu.net
DocumentRoot "/data/html/102"
ServerName www.accp.com
</VirtualHost>
<VirtualHost 192.168.190.102:9527>
ServerAdmin support@jfedu.net
DocumentRoot "/data/html/202"
ServerName www.accp.com
</VirtualHost>
[root@localhost ~]# systemctl restart httpd
② 访问服务端主页
[root@localhost ~]# curl 192.168.190.102
102
[root@localhost ~]# curl 192.168.190.102:9527
202
12.3 基于域名
访问不同的域名得到不同的页面(常用)
① 编辑子配置文件
[root@localhost ~]# vim /etc/httpd/conf.d/test.conf
<Directory "/data/html">
Require all granted
</Directory>
<VirtualHost 192.168.190.102>
ServerAdmin support@jfedu.net
DocumentRoot "/data/html/102"
ServerName www.abc.com
</VirtualHost>
<VirtualHost 192.168.190.102>
ServerAdmin support@jfedu.net
DocumentRoot "/data/html/202"
ServerName www.efg.com
</VirtualHost>
[root@localhost ~]# systemctl restart httpd
② 客户端添加域名解析
[root@localhost ~]# vim /etc/hosts
192.168.190.102 www.abc.com www.efg.com
③ 访问服务器主页
[root@localhost ~]# curl www.abc.com
102
[root@localhost ~]# curl www.efg.com
202
四、Cookie和session
1. Cookie
Cookie基于HTTP协议,也叫Web Cookie或浏览器Cookie,是服务器发送到用户浏览器并保存在客户端本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能。
Cookie主要用于以下三个方面:
- 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
- 个性化设置(如用户自定义设置、主题等)
- 浏览器行为跟踪(如跟踪分析用户行为等)
Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。当服务器收到HTTP请求时,服务器可以在响应头里面添加一个Set-Cookie选项。浏览器收到响应后通常会保存下Cookie,之后对该服务器每一次请求中都通过Cookie请求头部将Cookie信息发送给服务器。服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息.另外,Cookie的过期时间、域、路径、有效期、适用站点都可以根据需要来指定。
2. session
会话(Session)是指一段时间内,客户端与服务器之间的交互过程。在Web开发中,会话通常用于跟踪用户在网站上的活动,并且在不同页面间保持用户的状态信息。
在Web应用程序中,会话通常包括以下几个重要的概念:
- 会话标识符(Session ID):在客户端和服务器之间建立会话时,会话标识符会被创建并在客户端和服务器之间传递。通常情况下,会话标识符被存储在客户端的Cookie中,或者通过URL重写的方式传递给服务器。
- 状态信息(Session Data):服务器端会话状态信息包括了用户的登录状态、购物车内容、用户偏好设置等,这些信息被存储在服务器的内存、数据库或文件系统中。
- 会话管理(Session Management):会话管理涉及到会话的创建、维护、销毁等操作。这包括了会话的开始、认证、授权、数据存储、过期处理等过程。
3. cookie和session的对比
- cookie通常是在服务器生成,但也可以在客户端生成,session是在服务器端生成的
- session 将数据信息保存在服务器端,可以是内存,文件,数据库等多种形式,cookie 将数据保存在客户端的内存或文件中
- 单个cookie保存的数据不能超过4K,每个站点cookie个数有限制,比如IE8为50个、Firefox为50个、Opera为30个;session存储在服务器,没有容量限制
- cookie存放在用户本地,可以被轻松访问和修改,安全性不高;session存储于服务器,比较安全
- cookie有会话**cookie和持久cookie**,生命周期为浏览器会话期的会话cookie保存在缓存,关闭浏览器窗口就消失,持久cookie被保存在硬盘,知道超过设定的过期时间;随着服务端session存储压力增大,会根据需要定期清理session数据
- session中有众多数据,只将sessionID这一项可以通过cookie发送至客户端进行保留,客户端下次访问时,在请求报文中的cookie会自动携带sessionID,从而和服务器上的的session进行关联
五、Web相关工具
1. weget相关工具
格式:
wget [OPTION]... [URL]...
常用选项:
-q 静默模式
-c 断点续传
-P /path 保存在指定目录
-O filename 保存为指定文件名,filename 为 - 时,发送至标准输出
--limit-rate= 指定传输速率,单位K,M等
2. curl
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证, 下载文件断点续传,上载文件断点续传, http代理服务器管道( proxy tunneling),还支持IPv6,socks5代理服务器,通过http代理服务器上传文件到FTP服务器等,功能十分强大。
格式:
curl [options] [URL...]
选项:
-A/--user-agent <string> 设置用户代理发送给服务器
-e/--referer <URL> 来源网址
--cacert <file> CA证书 (SSL)
-k/--insecure 允许忽略证书进行 SSL 连接
--compressed 要求返回是压缩的格式
-H/--header "key:value” 自定义首部字段传递给服务器
-i 显示页面内容,包括报文首部信息
-I/--head 只显示响应报文首部信息
-D/--dump-header <file>将url的header信息存放在指定文件中
--basic 使用HTTP基本认证
-u/--user <user[:password]>设置服务器的用户和密码
-L 如果有3xx响应码,重新发请求到新位置
-O 使用URL中默认的文件名保存文件到本地
-o <file> 将网络文件保存为指定的文件中
--limit-rate <rate> 设置传输速度
-0/--http1.0 数字0,使用HTTP 1.0
-v/--verbose 更详细
-C 选项可对文件使用断点续传功能
-c/--cookie-jar <file name> 将url中cookie存放在指定文件中
-x/--proxy <proxyhost[:port]> 指定代理服务器地址
-X/--request <command> 向服务器发送指定请求方法
-U/--proxy-user <user:password> 代理服务器用户和密码
-T 选项可将指定的本地文件上传到FTP服务器上
--data/-d 方式指定使用POST方式传递数据
-s --silent Silent mode
-b name=data 从服务器响应set-cookie得到值,返回给服务器
-w <format> 显示相应的指定的报文信息,如:%{http_code},%{remote_ip}等
-m, --max-time <time> 允许最大传输时间
3. 压力测试工具
httpd的压力测试工具:
- ab, webbench, http_load, seige(ab 来自httpd-tools包)
- Jmeter 开源
- Loadrunner 商业,有相关认证
- tcpcopy:网易,复制生产环境中的真实请求,并将之保存
命令格式:
ab [OPTIONS] URL
选项:
-n:总请求数
-c:模拟的并发数
-k:以持久连接模式测试