1.http的访问完整过程

1.1.建立连接:接收或拒绝连接请求(基于socket)
1.2.接收请求:接收客户端请求报文种对某资源的一次请求的过程
web访问响应4种模型(web I/O多个用户同时访问,如何处理)

1.单线程的I/O结构
只有一个线程/进程响应客户请求
问题:导致再有新的用户连接进来,就无法提供服务了只能等前一个用户处理完,就
会导致排队现象
2.多线程
提前建好多个线程
问题:客户端非常多,发起了1万个请求,这时候服务器端就会打开10000个线程/进程
-会消耗大量的资源,每个线程和进程要占内存
3.复用的I/O结构
进程/线程只有一个,但是可以接收多个用户的请求,把他们的请求放到一个连接复
用器里,这就是并发概念
一颗cpu,可以同时运行多个软件,时间片切片,其实最终还是串行处理的,这就是
复用的I/O处理逻辑
利用cpu的告诉处理能力,放到一个池里,一个连接器里,你先等一下,我帮你去拿
,然后发指令给cpu,这个处理非常快,让cpu去硬盘拿资源,让硬盘通过dma技术,
把文件找出来,如果本身就在内存里面,直接返回给用户就可以了,这个速度非常快
的,但是取资源很快,但是传资源就需要时间了,利用这个时间间隙,来接收别的用
户的请求,这样一个线程就可以感觉同时在响应很多用户的请求了
为什么叫I/O复用,就是可以不用一个进程/线程对一个用户,而是对很多用户,现在
服务器速度这么快,完全可以用一个进程/线程,可以面对多个用户的并发连接
4.复用的多线程I/O结构
但是单进程/线程并不能充分发挥cpu的性能,现在cpu都是多核的,而且现在一个核
还支持多线程,利用这样的技术,可以复用多个线程
# 目前来说apache支持多线程的I/O模型,也支持复用的多线程的I/O模型
# 早期的标准的2.2版本的apache支持多线程I/O模型
# 现在2.4版本的支持复用的多线程I/O模型-nginx也支持
# 几个cpu几个进程
# 高并发的情况下,复用的I/O模型是最有优势的,但是也有缺点
比较:
1.复用的I/O模型对服务器的消耗是比较小的,因为用一个进程响应多个用户的请求
,高并发是优势,线程不复用,相当于去一个饭店,有个服务员单独给你提供服务,
复用的I/O模型,服务员不仅给你这桌提供服务,还给其他桌的提供服务,响应比较
慢
访问量较小的时候,速度更快,访问质量更好,用户感受更好,并发量过大,用复用
的I/O模型,主要看追求什么
# 访问量不大的用apache,假如有一个进程出问题死了,进程容易出问题的,不影响
别的用户,复用的I/O模型,如果进程挂了,一堆的用户都会受到影响
2.# 不如多进程的I/O模型稳定
虽然说apache高并发不如nginx,但是为什么传统公司喜欢,这是有道理的,不是说n
ginx就完全替代apache
1.3 处理请求
服务器对清求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,
资源,首部核可选的主体部分对请求进行处理
常用的请求method:GET(常见),POST,HEAD,PUT,DELETE,TRACE,OPTIONS
1.4 访问资源
服务器获取请求报文种请求的资源web服务器,即存放了web资源的服务器,负责向请
求者提供对方请求的静态资源,或动态运行后生成的资源
1.5 构建响应报文
一旦web服务器识别出了资源,就执行请求方法种描述的动作,并返回响应报文。响
应报文中包含响应状态码,响应首部,如果生成响应主体的话,还包括响应主体
1.响应实体:如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。响
应报文中通常包括:
描述了响应主体MIME类型的Content-Type首部
描述了响应主体长度的Cotent-Length
实际报文的主体内容
2.URL重定向:web服务构建的响应非客户端请求的资源,而是资源另一个访问路径
3.MIME类型,web服务要负责确定响应主体的MIME类型,多种配置服务器的方法可将M
IME类型与资源管理起来
+ 魔法分类:Apache
web服务器可以扫描每个资源的内容,并将其与一个已知模式表(被称为魔法文
件)进行匹配,以决定每个文件的MIME类型,这样做可能比较慢,但是很方便,
尤其是文件没有标准扩展名的时候
+ 显示分类:可以对web服务器进行配置,实起不考虑文件的扩展名或内容,强
制特定文件或目录内容拥有某个MIME类型
+ 类型协商:有些web服务器经过配置,可以以多种文档格式来存储资源,在这
种情况下,可以配置web服务器,实起可以通过与用户的协商来决定使用哪种格
式(即相关的MIME类型)“最好”
# 可以通过chrom-检查,查看资源响应头
1.6 发送响应报文
web服务器通过连接发送数据时也会面临与接收数据一样的问题。服务商可能很多条
到各个客户端的连接,有些是空闲的,有些在向服务器发送数据,还有些在向客户端
回送响应数据。服务器要记录连接的状态,还要特别注意对持久连接的处理。对非持
久连接而言,服务器应该在发送了整条报文后,关闭自己这一端的连接,对持久连接
来说,连接可能仍保持打开状态,在这种情况下,服务器要正确的计算Content-Leng
th首部,不然客户端就无法知道响应什么时候结束
1.7 记录日志
最后,当事务结束时,web服务器会在日志文件中添加一个条目,来描述已执行的事务
用什么浏览器访问的,访问了什么资源,什么时候访问的
tail /var/log/httpd/access_log
# 一次请求,会自动获取浏览器的网站图标
# 图标文件名默认的favicon.ico
# wget http://www.jd.com 在html目录下执行
# 就能抓下来京东的图标文件
2.apache的组成
2.1常见http服务器程序(http服务基于c/s结构)
+ http apcache (最主流)
存在C10K(10K connects)并发问题
# 默认多线程I/O模型
+ nginx 解决C10K问题 (最主流)
# 有多少cpu核心就生成多少进程,实现并发,彻底解决C10K问题,处理个C20K-C30K没问题,但是稳定性不够强
+ lighttp
+ IIS .asp 应用程序服务器 (微软)
+ tomcat .jsp 应用程序服务器 (下面都是java的应用程序服务器)
# 现在web程序,都是java的天下了
+ jetty 开源的sevice容器,基于java的web容器
+ Resin CAUCHO公司,支持service和jsp的引擎
+ webshpere IBM公司
+ weblogic BEA,Oracle
+ jboss Redhat,IBM
+ oc4j oracle
HTTP服务器市场占有率统计:www.netcraft.com
第三方统计网站,每个月都会推出一个统计结果,一般都是在新闻里面
# 英语要好好学,卧槽,好多资料都是外国的
# 国内主要用nginx,nginx配置容易懂,不像apache相对艰涩难懂
# nginx有反向代理功能
2.2Apache介绍和特点
2.2.1 apache介绍
# 软件包叫http,软件名叫apache
20世界90年代初,美国国家超级计算机应用中心NCSA开发,1995年开源社区发布apache(a patchy server)
ASF:apache software foundation
阿帕奇基金会
FSF:free software foundation
自由软件基金会
2.2.2. apache特性
+ 高度模块化:core + modules
# 实现加密,加一个加密模块
+ DSO:Dynamic Shared Object动态加/卸载
# 需要加载,不需要不加载
+ MPM:multi-processing module 多路处理模块
# I/O模型可以定义的,可以用多线程也可以用复用的
2.2.3 apache功能
+ 虚拟主机:IP.port.FQDN
+ CGI:Commom Gateway Interface 通用网关接口
+ 反向代理
+ 负载均衡
+ 路径别名
+ 丰富的用户认证机制:basic,digest
+ 支持第三方模块
2.2.4 httpd-2.4新特性
# 6默认2.2 - 淘汰
# 7默认2.4.6
# 8默认2.4.37
# 官方目前最新2.4.41
+ MPM支持运行为DSO机制,以模块形式按需加载
+ event MPM生产环境可用
+ 异步读写机制
+ 支持每模块及每目录的单独日志级别定义
+ 每请求相关的专用配置
+ 增强版的表达式分析式
+ 毫秒级持久连接市场定义
+ 基于FQDN的虚拟主机不需要NameVirutalHhost指令
+ 新指令
+ 支持用户自定义变量
+ 更低的内存消耗
2.3 MPM:multi-processing module(多路处理模块)工作模式
- prefork模型:多进程I/O模型(apache传统的),每个进程响应一个请求,centos7默认模型,现在也支持复用的多线程的I/O模型
一个主进程:生成和回收n个子进程,创建套接字,不响应请求
多个子进程-工作进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求
(一个进程至少有一个线程)
prefork MPM:预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占内存,但是比较稳定,可以设置最大最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
优点:稳定
缺点:慢,占用资源,不适用于高并发场景
- worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型
一个主进程:生成m个子进程,每个子进程负责生n个线程,每个线程响应一个请求,并发响应请求m*n

优点:相比prefork占用的内存较少,可以同时处理更多的请求
缺点:万一一个线程死了就会影响周边的线程,因为一个进程里开启的多个线程,是共享资源的,相对来说比nginx更稳定,还有一点,如果用户请求来了,但是没有更多的线程可以消耗,还在持久连接,发完了还没断开,因为持久连接要满足两个条件之一,时间和资源个数,相当于线程呆着不干活,这样不是很好,消耗资源
这个问题在prefork模式也存在
- event:事件驱动模型(worker模型变种),centos8默认模型

一个主进程,生成m个子进程,每个子进程负责生n个线程,每个线程响应一个请求,并发响应请求:m*n,有专门的监控线程来管理这些keep-live类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,就允许释放。这样增强了高并发场景下的请求处理能力
缺点:没有线程安全控制,比如说监听线程或工作线程down了,也会影响其他线程
http2.4:event稳定版,centos7以后默认
http2.2:event测试版,centos6默认
3.Httpd安装和相关文件
3.1 rpm包安装httpd并启动httpd服务
版本说明:centos7以上,默认系统是http2.4,centos6默认2.2
安装方式
-
rpm:centos发行版,稳定,建议使用
ubuntu用apt安装即可
-
编译:定制或特殊需求-生产中用
范例:安装httpd2.4
1.dnf/yum -y install httpd
# 记得仔细看依赖的文件
Installing:
httpd x86_64 2.4.37-16.module_el8.1.0+256+ae790463 AppStream 1.7 M
Installing dependencies:
apr x86_64 1.6.3-9.el8 AppStream 125 k
apr-util x86_64 1.6.1-6.el8 AppStream 105 k
centos-logos-httpd noarch 80.5-2.el8 AppStream 24 k
httpd-filesystem noarch 2.4.37-16.module_el8.1.0+256+ae790463 AppStream 35 k
httpd-tools x86_64 2.4.37-16.module_el8.1.0+256+ae790463 AppStream 103 k
mod_http2 x86_64 1.11.3-3.module_el8.1.0+213+acce2796 AppStream 158 k
mailcap noarch 2.1.48-3.el8 base 39 k
Installing weak dependencies:
apr-util-bdb x86_64 1.6.1-6.el8 AppStream 25 k
apr-util-openssl x86_64 1.6.1-6.el8 AppStream 27 k
Enabling module streams:
httpd 2.4
# mailcap多用途的文件扩展 这个包提供了MIME的文件mime.types
# httpd-tools提供了客户端的工具
2.systemctl enable --now httpd
3.ss -ntl|grep :80
# 提供一个默认页面,78的默认页面不一样
4.ps aux 查看进程
root 37075 0.0 2.2 273820 10620 ? Ss 06:04 0:00 /usr/sbin/httpd
apache 37076 0.0 1.7 286036 8028 ? S 06:04 0:00 /usr/sbin/httpd
apache 37077 0.0 2.0 1343820 9416 ? Sl 06:04 0:00 /usr/sbin/httpd
apache 37078 0.0 2.0 1343820 9416 ? Sl 06:04 0:00 /usr/sbin/httpd
apache 37079 0.0 2.0 1474948 9416 ? Sl 06:04 0:00 /usr/sbin/httpd
# 有l字样的Sl就说明有线程,l标识多线程
一个master进程,多个worker进程,master进程是以root账户运行的,woker进程是以apache运行的
5.pstree 查看线程
pstree没有安装
yum provides pstree查看哪个包提供的
yum install psmisc
pstree
├─httpd─┬─httpd
│ ├─2*[httpd───64*[{httpd}]]
│ └─httpd───80*[{httpd}]
# 是一个多进程多线程的,最终是线程提供服务
# nginx只开一个进程,里面只有一个线程,但是一个线程就可以响应多个请求,采用的是复用I/O逻辑
# centos8的用到线程了,但是centos7的没有用到线程
3.2 http文件列表
rpm -ql http|less
/etc/httpd/conf/httpd.conf 核心配置文件
/usr/lib/systemd/system/httpd.service 起服务用的
/usr/lib/systemd/system/httpd.socket 也提供了socket
/usr/sbin/httpd 二进制主程序
/var/log/httpd 访问日志
/etc/httpd/conf.d/*.conf 子配置文件
/etc/httpd/conf.d/conf.moudles.d/模块加载配置文件
rpm -ql httpd-filesystem 这个包专门建文件夹
/etc/httpd
/etc/httpd/conf.d
/etc/httpd/conf.d/README
/usr/lib/systemd/system/httpd.service.d
/usr/lib/systemd/system/httpd.socket.d
/usr/share/httpd
/usr/share/httpd/icons
/var/www
/var/www/cgi-bin
/var/www/html
# 检查配置文件语法错误
httpd -t 一定会有一个错,没有ServerName
解决:servername行被注释掉了
取消servername注释,修改成和网站匹配的名字,没有网站就默认
解决http报没有servername的提示
注意:修改配置文件前一定要做备份,备份完后查看一下选项权限有没有变化
cp /etc/httpd/conf/httpd.conf{,.bak}
注意:每次修改过配置文件要重新载入systemctl reload httpd,不要重启服务,会导致用户断开连接
建议:改完配置文件后做语法检查
配置文件出错,会导致重启服务时,端口号关闭,这算线上事故的
服务单元文件:/usr/lib/systemd/system/httpd.service
其中的$OPTION来自/etc/sysconffig/httpd centos7上有8没了
服务的控制与启动
开机自动起/不起 systemctl {enable|disable} httpd.service
启停载入查看状态等 systemctl {start|stop|restart|status|reload} httpd.service
模块文件
/etc/httpd/modules
/usr/lib64/httpd/moudules
访问日志
/var/log/httpd
acess_log访问日志
error.log错误日志
主进程文件/etc/httpd/run/httpd.pid
httpd-manual帮助文档包
相当于提供了一个官网离线的帮助文档页面
装完以后要加载一下服务
IP/manual
要查看帮助,通常去查看官方文档
3.3 httpd配置文件的组成
主要组成
- Globel Environment全局设置 ServerName给哪个网站搭的 用谁的身份启动
- Main server configuration主服务器设置-服务器搭建网站的设置 存放网页的地方
- virtual host-虚拟主机功能-一个物理服务器上搭建多个网站-类似mysql的多实例-不存在端口冲突问题-主机头技术解决
配置文件格式:key-value
范例:centos8.0默认的配置文件
grep -Ev '^ *#|^$' /etc/httpd/conf/httpd.conf 去掉空行和任意空格带#的开头的行
3.4 编译安装httpd2.4
3.4.1编译说明和准备

ARP:apache portable Run-time libraries,Apache可移植运行库,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。早期的Apache版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不通的平台调用不通的处理函数随着Apache的进一步开发,Apache组织决定将这些通用的函数独立出来并发展成为一个新的项目。这样APR的开发就从Apache独立出来,Apache仅仅是使用APR。目前APR主要还是Apache使用,由于APR有较号的移植性,因此一些需要进行移植的C程序也开始使用APR,开源项目
yum histoy 查看历史记录
yum history info 2 查看都装了哪些包
apache名下上百个项目,window和linux以及macos三个团队,一共就300个团队,解决,将window和linux的ABI和API接口抽象出来做成APR接口间接的访问windows和linux,以后Apache的软件只要满足这个APR接口就可以了,这时候100个项目只需要100个团队了,当然还有两个windows和Linux团队,加起来也就102个团队,原本要200个团队,就大大减轻了开发成本,类似加了一个虚拟层,来屏蔽底层的不同
apr也是术语apache的项目,被单独做成一个项目了
apr.apache.org
版本需要相对稳定,因为上层都基于这个
所以httpd的编译安装依赖APR包,apr包的版本和httpd版本要匹配。如果系统自带的apr包版本不够,就要先编译安装对应版本的apr包
说明:安装httpd2.4,依赖于appr-1.4
log
2020.3.22 23:14
1.第一部分结束
2020.3.23 10:30
第二三部分结束