一、相关介绍:
- 互联网:是网络的网络,是所有类型网络的母集
- 因特网:世界上最大的互联网网络。即因特网概念从属于互联网概念。习惯上,大家把连接在因特网上的计算机都成为主机。
- 万维网: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:又叫做超文本标记语言,是一种规范,也是一种标准,它通过标记符号来标记要显示的网页中的各个部分。网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏览器如何显示其中的内容。HTML文件可以使用任何能够生成txt文件的文本编辑器来编辑,生成超文本标记语言文件,只用修改文件名后缀为“.html”或“.htm”即可。
静态网页:在网站设计中,纯粹HTML格式的网页通常被称为“静态网页”,静态网页是标准的HTML文件,它的文件扩展名是.htm、.html。静态网页是网站建设的基础,早期的网站一般都是由静态网页制作的。静态网页也可以出现各种动态的效果,如.GIF格式的动画、FLASH、滚动字幕等。这些“动态效果”只是视觉上的,与下面将要介绍的动态网页是不同的概念。
动态网页:所谓的动态网页,是指跟静态网页相对的一种网页编程技术。静态网页,随着HTML代码的生成,页面的内容和显示效果就基本上不会发生变化了——除非是修改页面代码。而动态网页则不然,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。动态网页URL的后缀不是.htm、.html、.shtml、.xml等静态网页的常见网页制作格式,而是以.aspx、.asp、.jsp、.php、.perl、.cgi等形式为后缀,并且在动态网页网址中有一个标志性的符号——“?”。
动态网页是基本的html语法规范与Java、PHP、C#等高级程序设计语言、数据库编程等多种技术的融合,以期实现对网站内容和风格的高效、动态和交互式的管理。因此,从这个意义上来讲,凡是结合了HTML以外的高级程序设计语言和数据库技术进行的网页编程技术生成的网页都是动态网页。
二.访问浏览器的过程:
http请求的完整过程简述:
1、域名解析:使用DNS协议进行域名解析
2、建立连接:发起TCP三次握手
3、发起http请求:建立TCP连接成功后,浏览器发起http请求
4、响应http请求:服务端响应http请求,浏览器得到返回response
5、解析response:浏览器解析response,并请求其它的资源(如js、css等)
6、浏览器渲染展示页面:浏览器根据内核对页面进行渲染展示
7、断开连接:TCP四次挥手
三.http 协议通信过程:
HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础设计HTTP最初的目的是为了提供一种远距离共享知识的方式,借助多文档进行关联实现超文本,连成相互参阅的WWW(world wide web,万维网)
四.HTTP 相关技术:
1.WEB开发语言:
http: Hyper Text Transfer Protocol 应用层协议,默认端口: 80/tcp
2.WEB前端开发语言 :
- html:
Hyper Text Markup Language 超文本标记语言,编程语言,主要负责实现页面的结构
- CSS:
Cascading Style Sheet 层叠样式表, 定义了如何显示(装扮) HTML 元素,比如:字体大小和颜色属性等。样式通常保存在外部的 .css 文件中,用于存放一些HTML文件的公共属性,从而通过仅编辑一个简单的 CSS 文档,可以同时改变站点中所有页面的布局和外观。
- js:
javascript,实现网页的动画效果,但实属于静态资源
Java和javascript的关系: 周杰和周杰伦的关系
3.MIME:
MIME : Multipurpose Internet Mail Extensions 多用途互联网邮件扩展
MIME 类型通常仅包含两个部分:
类型(type)和子类型(subtype),中间由斜杠
/
分割,中间没有空白字符。类型 代表数据类型所属的大致分类,例如
video
或text
子类型 标识了 MIME 类型所代表的指定类型的确切数据类型。以
text
类型为例,它的子类型包括:plain
(纯文本)、html
(HTML 源代码)、calender
(iCalendar/.ics
文件)
文件 :/etc/mime.types ,来自于mailcap包
MIME格式:
type/subtype —— 主要类型/次要类型
范例:
text/plain #文本文件的默认值
text/html #所有的 HTML 内容都应该使用这种类型
text/css #在网页中要被解析为 CSS 的任何 CSS 文件必须指定 MIME 为 text/css
image/jpeg jpg jpeg #图片类型
image/png #音频与视频类型
video/mp4
application/javascript
4.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:方案,访问服务器以获取资源时要使用哪种协议
user:用户,某些方案访问资源时需要的用户名
password:密码,用户对应的密码,中间用:分隔
Host:主机,资源宿主服务器的主机名或IP地址
port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号
path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔
params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔
query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔
frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔
URL示例:
5.网站访问量:
网站访问量统计的重要指标
IP(独立IP):即Internet Protocol,指独立IP数。一天内来自相同客户机IP 地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标
PV(访问量): 即Page View, 页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量
UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的
6.HTTP工作机制:
6.1.一次http事务包括:
http请求:http request
http响应:http response
6.2.Web资源:
web resource, 一个网页由多个资源(文件)构成,打开一个页面,通常会有多个资源展示出来,但是每个资源都要单独请求。因此,一个"Web 页面”通常并不是单个资源,而是一组资源的集合。
6.3.资源类型:
静态文件:无需服务端做出额外处理,服务器端和客户端的文件内容相同。
常见文件后缀:.html, .txt, .jpg, .js, .css, .mp3, .avi。
动态文件:服务端执行程序,返回执行的结果,服务器端和客户端的文件内容不相同。
常见文件后缀:.php, .jsp ,.asp。
6.4.HTTP连接请求 :
串行和并行连接 :
串行,持久连接和管道 :
6.5.提高HTTP连接性能:
并行连接:通过多条TCP连接发起并发的HTTP请求
持久连接:keep-alive,重用TCP连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接
管道化连接:通过共享TCP连接,发起并发的HTTP请求
复用的连接:交替传送请求和响应报文(实验阶段)
6.6.HTTP 协议版本:
HTTP 已经演化出了很多版本,它们中的大部分都是向下兼容的
- HTTP/0.9:已过时。只接受 GET 一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持 POST 方法,所以客户端无法向服务器传递太多信息。
- HTTP/1.0:这是第一个在通讯中指定版本号的 HTTP 协议版本,至今仍被广泛采用,特别是在代理服务器中。
- HTTP/1.1:引入了持久连接,即TCP连接默认不关闭,可以被多个请求复用,能很好地配合代理服务器工作。还支持管道方式机制,即在同一个TCP连接里面,客户端可以同时发送多个请求,以便降低线路负载,提高传输速度。
- HTTP/2.0:完全多路复用,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应。引入了头信息压缩机制,使用gzip或compress压缩后再发送。支持服务端推送,允许服务器未经请求,主动向客户端发送资源。
三者区别:
0.9 只有get 只有下载 没有上传(put)
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协议:
为解决安全问题,网景在1994年创建了HTTPS,并应用在网景导航者浏览器中。 最初,HTTP是与SSL一起使用的;在SSL逐渐演变到TLS时(其实两个是一个东西,只是名字不同而已),最新的HTTPS也由在2000年五月公布的RFC 2818正式确定下来。HTTPS就是安全版的HTTP,目前大型网站基本实现全站HTTPS
HTTPS特点:
HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费
HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的
HTTP和HTTPS使用的是不同的连接方式,端口不同,前者是80,后者是443
HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题
HTTPS 实现过程降低用户访问速度,但经过合理优化和部署,HTTPS 对速度的影响还是可以接受的
HTTP2协议:
http/2.0:2015年,HTTP2.0是SPDY的升级版
头信息和数据体都是二进制,称为头信息帧和数据帧
复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免了"队头堵塞",此双向的实时通信称为多工(Multiplexing)
引入头信息压缩机制(header compression),头信息使用gzip或compress压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送同样字段,只发送索引号,提高速度
HTTP/2 允许服务器未经请求,主动向客户端发送资源,即服务器推送(server push)
6.7:HTTP 请求访问的完整过程:
一次完整的http请求处理过程 :
建立连接
接收请求
处理请求
访问资源
构建响应报文
发送响应报文
记录日志
1、建立连接:
接收或拒绝连接请求
2、接收请求:
接收客户端请求报文中对某资源的一次请求的过程
Web访问响应模型(Web I/O)
单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
多进程I/O模型:并行启动多个进程,每个进程响应一个连接请求
复用I/O结构:启动一个进程,同时响应N个连接请求
复用的多进程I/O模型:启动M个进程,每个进程响应N个连接请求,同时接收M*N个请求
3、处理请求:
服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理
常用请求Method: 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类型
与资源管理起来
魔法分类:Apache web服务器可以扫描每个资源的内容,并将其与一个已知模式表(被称为魔法文件)进行匹配,以决定每个文件的MIME类型。这样做可能比较慢,但很方便,尤其是文件没有标准扩展名时
显式分类:可以对Web服务器进行配置,使其不考虑文件的扩展名或内容,强制特定文件或目录内容拥有某个MIME类型
类型协商: 有些Web服务器经过配置,可以以多种文档格式来存储资源。在这种情况下,可以配置Web服务器,使其可以通过与用户的协商来决定使用哪种格式(及相关的MIME类型)"最好"
6、发送响应报文
Web服务器通过连接发送数据时也会面临与接收数据一样的问题。服务器可能有很多条到各个客户端的连接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。服务器要记录连接的状态,还要特别注意对持久连接的处理。对非持久连接而言,服务器应该在发送了整条报文之后,关闭自己这一端的连接。对持久连接来说,连接可能仍保持打开状态,在这种情况下,服务器要正确地计算Content-Length首部,不然客户端就无法知道响应什么时候结束
7、记录日志
最后,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务
6.8.http协议及报文头部结构:
方法:
GET: 获取资源 当前网络请求中,绝大部分使用的是 GET 方
HEAD: 获取报文首部,主要用于确认 URL 的有效性以及资源更新的日期时间等
POST: 传输实体主体 (比如传输 用户名密码)
PUT: 上传文件(比如写博客)
PATCH: 对资源进行部分修改
DELETE:删除文件
OPTIONS:查询支持的方法(查看服务端可以支持哪些方法)
CONNECT:要求在与代理服务器通信时建立隧道(类似加密)
TRACE:追踪路径
url:指明资源的具体位置
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
- scheme
ftp 文件传输协议
https 安全的http协议
http 超文本传输协议
user:帐号
password:密码
host:主机名 或 域名 或 ip地址
port: 服务器端口号
path:访问资源的路径,相当于组件路径
params:参数,但是这个不常用,指定一些参数,譬如指定传输方式
qurey:查询参数
frag:html资源片段,譬如html文档过大的时候,frag定位到html的一部分
首部字段:使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容,HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:” 分隔
通用首部:请求报文和响应报文两方都会使用的首部
Date: 报文的创建时间
Connection:连接状态,如keep-alive, close
Via:显示报文经过的中间节点(代理,网关)
Cache-Control:控制缓存,如缓存时长
MIME-Version:发送端使用的MIME版本
Warning:错误通知
请求首部:从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、请求内容相关优先级等信息
Accept:通知服务器自己可接受的媒体类型
Accept-Charset: 客户端可接受的字符集
Accept-Encoding:客户端可接受编码格式,如gzip
Accept-Language:客户端可接受的语言
Client-IP: 请求的客户端IP
Host: 请求的服务器名称和端口号
Referer:跳转至当前URI的前一个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>
6.9.响应报文:
response报文格式 :
<version> <status> <reason-phrase>
<headers>
<entity-body>
6.9.1状态码:
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介绍和特点:
20世纪90年代初,美国国家超级计算机应用中心NCSA开发,1995年开源社区发布apache
apache 名字来源,流传最广的解释是(也是最显而易见的):这个名字来自于一个事实:当Apache在1995年初开发的时候,它是由当时最流行的HTTP服务器NCSA HTTPd 1.3的代码修改而成的,因此是"一个修补的(a patchy)”服务器。然而,在Apache服务器官方网站的FAQ中是这么解释的:"Apache这个名字是为了纪念名为Apache的美洲原住民印第安人的一支,众所周知他们拥有高超的作战策略和无穷的耐性。”贝伦多夫说:"我选择阿帕奇这个名字是取其积极含义。阿帕奇族是最后一个屈服于美国政府的民族。当时我们担心大公司迟早会参与竞争并‘教化’这块最早的网络之地,所以在我看来,阿帕奇是个很好的名称,也有人说这个词一语双关-因为正如Apache(与"a patchy"谐音)的名字所表明的那样,他们确实是在给服务器打补丁。”
软件基金会:
ASF:apache software foundation
FSF:Free Software Foundation
apache 功能:
提供http协议服务
多个虚拟主机:IP、Port、FQDN
CGI:Common Gateway Interface,通用网关接口,支持动态程序
反向代理
负载均衡
路径别名
丰富的用户认证机制:basic,digest
支持第三方模块
apache特性:
高度模块化:core + modules
DSO:Dynamic Shared Object 动态加载/卸载
MPM:multi-processing module 多路处理模块
3.MPM multi-processing module 工作模式:
3.1.prefork
prefork : 多进程I/O模型,每个进程响应一个请求,CentOS 7 httpd默认模型一个主进程:生成和回收n个子进程,创建套接字,不响应请求多个子进程:工作 work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求.
Prefork MPM预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
优点:稳定
缺点:慢,占用资源,不适用于高并发场景
yum 安装默认 prefork
3.2.worker:
worker : 复用的多进程I/O模型,多进程多线程,IIS使用此模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n
worker MPM 是一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程程来处理请求,当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,因此可以承受更高的并发。
优点:相比prefork 占用的内存较少,可以同时处理更多的请求
缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)
3.3.event:
event:事件驱动模型(worker模型的变种),CentOS8 默认模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n,有专门的监控线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力
event MPM是Apache中最新的模式,2012年发布的apache 2.4.X系列正式支持event 模型. 属于事件驱动模型(epoll),每个进程响应多个请求,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力event只在有数据发送的时候才开始建立连接,连接请求才会触发工作线程,即使用了TCP的一个选项,叫做延迟接受连接TCP_DEFER_ACCEPT,加了这个选项后,若客户端只进行TCP连接,不发送请求,则不会触发Accept操作,也就不会触发工作线程去干活,进行了简单的防攻击(TCP连接)
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
缺点:没有线程安全控制
httpd-2.4:event 稳定版,centos7 以后默认
httpd-2.2:event 测试版,centos6 默认
4.Httpd 安装和相关文件:
4.1.包安装httpd并启动httpd服务:
版本说明:
CentOS 7 以上,默认系统是httpd 2.4,CentOS 6 版默认为httpd 2.2
Ubuntu 18.04 默认 Apache/2.4.29
安装方式:
包安装: centos发行版,稳定,建议使用
编译:定制或特殊需求
范例:安装httpd 2.4
yum install httpd -y
4.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
4.3httpd 命令:
检查配置语法:httpd -t
在配置文件更改开启:
查看版本:httpd -v
六、httpd常见的配置:
1.指定服务器名:
[root@localhost sysconfig]#httpd -t
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
Syntax OK
[root@localhost sysconfig]#vim /etc/httpd/conf/httpd.conf
ServerName www.example.com:80
[root@localhost sysconfig]#httpd -t
Syntax OK
2.包含其它配置文件:
Include file-path|directory-path|wildcard
IncludeOptional file-path|directory-path|wildcard
#
- Include和IncludeOptional功能相同,都可以包括其它配置文件
- 但是当无匹配文件时,include会报错,IncludeOptional会忽略错误
include 子配置文件 :
总目录 :
3.监听地址:
Listen [IP:]PORT
说明:
(1) 省略IP表示为本机所有IP
(2) Listen指令至少一个,可重复出现多次
#可以监听一个端口或多个端口
监听所有的此端口——9527
也可以不写在主配置,写在子配置内
注意需要以 .conf 结尾 test.conf
注意要重启httpd服务
4.隐藏服务器版本信息:
servertokens prod
#语法
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 此为默认值
实验:
在配置文件添加此语句
注意要重启服务:
看不到版本号了
5.持久连接
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认开启持久连接
断开条件:
时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级
请求数量: 请求数达到指定值,也会断开
副作用:对并发访问量大的服务器,持久连接会使有些请求得不到响应
折衷:使用较短的持久连接时间
持久连接相关指令:
KeepAlive On|Off
KeepAliveTimeout 15 #连接持续15s,可以以ms为单位,默认值为5s
MaxKeepAliveRequests 500 #持久连接最大接收的请求数,默认值100
6.DSO (Dynamic Shared Object)
Dynamic Shared Object,加载动态模块配置,不需重启即生效动态模块所在路径:
/usr/lib64/httpd/modules/
查看静态编译的模块 :httpd -l
查看静态编译及动态装载的模块: httpd -M
7.MPM (Multi-Processing Module)多路处理模块 :
httpd 支持三种MPM工作模式:prefork, worker, event,但只能使用一种,不能一起使用。
8.prefork模式相关的配置:
StartServers 100
MinSpareServers 50
MaxSpareServers 80
ServerLimit 2560 #最多进程数,最大值 20000
MaxRequestWorkers 2560 #最大的并发连接数,默认256
MaxConnectionsPerChild 4000 #子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个
请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)
MaxRequestsPerChild 4000 #从 httpd.2.3.9开始被MaxConnectionsPerChild代替
9.worker和event 模式相关的配置:
ServerLimit 16 #最多worker进程数 Upper limit on configurable number of
processes
StartServers 10 #Number of child server processes created at startup
MaxRequestWorkers 150 #Maximum number of connections that will be processed
simultaneously
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25 #Number of threads created by each child process
10.定义Main server的文档页面路径:
DocumentRoot "/path”
<directory /path>
Require all granted
</directory>
说明:
DocumentRoot指向的路径为URL路径的起始位置
/path 必须显式授权后才可以访问
在配置文件下添加: vim /etc/httpd/conf/httpd.conf
修改地址并授权
建立好目录
在文件中添加内容
重启服务
测试:
还可以设置别名,访问test文件相当于访问/opt/lxc
11.定义站点默认主页面文件:
DirectoryIndex index.txt index.html
谁在前面就默认访问谁
12.虚拟主机:
httpd 支持在一台物理主机上实现多个网站,即多虚拟主机
网站的唯一标识:
IP相同,但端口不同
IP不同,但端口均为默认端口
FQDN不同, IP和端口都相同
多虚拟主机有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址
基于port:为每个虚拟主机使用至少一个独立的port
基于FQDN:为每个虚拟主机使用至少一个FQDN,请求报文中首部 Host
12.1.基于ip地址 :
listen 9527
KeepAlive On
KeepaliveTimeout 300
MaxKeepAliveRequests 2
<Directory "/opt/html">
# Allow open access:
Require all granted
</Directory>
<VirtualHost 192.168.91.3>
ServerAdmin support@jfedu.net
DocumentRoot "/opt/html/3"
ServerName www.accp.com
ErrorLog "logs/3_error_log"
CustomLog "logs/3_access_log" common
</VirtualHost>
<VirtualHost 192.168.91.6>
ServerAdmin support@jfedu.net
DocumentRoot "/opt/html/6"
ServerName www.accp.com
ErrorLog "logs/6_error_log"
CustomLog "logs/6_access_log" common
</VirtualHost>
编辑配置文件:vim /etc/httpd/conf.d/test.conf
创建目录
写入内容
重启http服务
测试:
12.2.基于端口:
listen 9527
KeepAlive On
KeepaliveTimeout 300
MaxKeepAliveRequests 2
<Directory "/opt/html">
# Allow open access:
Require all granted
</Directory>
<VirtualHost 192.168.91.3:80>
ServerAdmin support@jfedu.net
DocumentRoot "/opt/html/3"
ServerName www.accp.com
</VirtualHost>
<VirtualHost 192.168.91.6:9527>
ServerAdmin support@jfedu.net
DocumentRoot "/opt/html/6"
ServerName www.accp.com
</VirtualHost>
更改配置文件
12.3.基于域名:
listen 9527
KeepAlive On
KeepaliveTimeout 300
MaxKeepAliveRequests 2
<Directory "/opt/html">
# Allow open access:
Require all granted
</Directory>
<VirtualHost 192.168.91.3>
ServerAdmin support@jfedu.net
DocumentRoot "/opt/html/3"
ServerName www.lxcg.com
</VirtualHost>
<VirtualHost 192.168.91.6>
ServerAdmin support@jfedu.net
DocumentRoot "/opt/html/6"
ServerName www.lxcgg.com
</VirtualHost>
更改配置文件
没有域名解析,在配置文件中添加域名解析
13.基于客户端 IP 地址实现访问控制:
13.1.黑名单:
不能有失效,至少有一个成功匹配才成功,即失败优先
<RequireAll>
Require all granted
Require not ip 172.16.1.1 #拒绝特定ip
</RequireAll>
13.2.白名单:
多个语句有一个成功,则成功,即成功优先
<RequireAny>
Require all denied
Require ip 172.16.1.1 #允许特定IP
</RequireAny>
实验:
<directory /mnt>
<RequireAll>
Require all granted #默认允许所有
Require not ip 192.168.91.1 #除了真机不可以访问
</RequireAll>
</directory>
alias /test /mnt/html
配置文件
测试:
其他可以访问
真机无法访问