http协议版本及其区别
http 0.9: 原型版本,功能简陋,只有一个get命令,服务器只能回应html格式数据
http 1.0: 每个tcp只能发送一个请求,发送数据完成,连接就关闭,如果还要请求其他资源,就必须重新建立连接,数据可以是任何格式,使用MIME技术来识别不同数据格式。
http 1.1: 引入了持久连接,即tcp连接默认不关闭,可以别多个请求复用,对于同一个域名,大多数浏览器允许同时建立6个持久连接引入了管道机制,即在同一个TCP连接里,客户端可以同时发送多个请求,进一步改进了HTTP协议的效率
http1.0和http1.1的区别:
1,宽带优化及网络连接的使用,http1.0 中有一些带宽浪费的现象,例如:客户端只是需要某个对象的一部分,而服务器却将整个对象传输过来了,不支持断点续传功能,http1.1 在请求头部引入了range头域,他允许只请求资源的某个部分,方便了开发者自由的选择和带宽优化
2,错误通知的管理,在http1.1 中新增了24个状态响应码,,如409表示请求的资源与资源当前状态冲突;410表示服务器上的某个资源被永久性的删除
3,host头处理,在http1.0 中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中URL没有传递主机名。但随着虚拟主机技术的发展,一台物理服务器上可以存在多个虚拟主机,它们共享一个IP地址。
而http1.1 的请求信息和响应信息都支持host头域,且请求消息中没有host头域会报告错误400
4,持久连接,http1.1 支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,弥补了http1.0 每次请求都要创建新连接的缺点
http1.0 和http1.1 存在的问题
1,在传输数据中,所有传输内容都是明文,客户端与服务器端都无法验证对方的身份,无法保证数据的安全性
2,在使用时,header里携带的内容过大,增加了传输的成本,并且每次请求header基本不怎么变化,尤其在移动端增加用户流量
3,虽然HTTP1.1支持了keep-alive,来弥补多次创建连接产生的延迟,但是keep-alive使用多了同样会给服务端带来大量的性能压力,可能会影响性能,因为它在文件被请求之后还保持了不必要的连接时长
浏览器访问网站的全过程
1,DNS解析:DNS将域名解析出网站的ip地址
2,tcp连接: 通过tcp协议三次握手建立连接
3,http请求:
1,建立连接,接收或拒绝连接请求
2,接收请求,接收客户端的请求
3,处理请求,服务器对请求报文进行解析,获取的请求的资源和请求方法,对请求进行处理
4,访问资源,服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源
5,构建响应报文,一旦Web服务器识别了资源,就执行请求方法中描述的动作,并返回响应报文。
6,发送响应报文
7,记录日志,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务
4,浏览器的渲染原理
Apache介绍
http 服务基于 C/S 结构
apache
http协议,应用层协议,默认端口号: tcp/80
apache特性:
高度模块化
DSO:Dynamic Shared Object 动态加载/卸载
MPM:multi-processing module 多路处理模块
MPM工作模式
MPM工作模式:prefork,worker,event
prefork: 多进程IO模型,每个进程响应一个请求,centos7使用
一个主进程: 生成和回收子进程,不响应请求
多个子进程: 工作work进程,每个子进程处理一个请求,系统初始时,预先生成多个空闲进程,等待请求
特点: 最稳定,但占用资源,不适合高并发场景
worker: 复用的多进程IO模型,多进程多线程,IIS使用
一个主进程: 生成多个子进程,每个字进程生成多个线程,每个线程响应一个请求,并发响应
特点: 响应更多请求,承受高并发,使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。
event:事件驱动模型,CentOS8 默认模型
一个主进程: 生成多个子进程,每个子进程负责生个多个线程,每个线程响应一个请求,并发响应。有一个专门的监控进程来管理keep-alive类型的线程,当有请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力
特点: 解决了keep-alive场景下,长期被占用的线程的资源浪费问题,单线程响应多请求,高并发,占据更少的内存
httpd安装:yum安装
yum install httpd -y
systemctl start httpd
curl 10.0.0.8
httpd安装: 编译安装
APR: Apaceh可移植运行库,主要为上层的应用程序提供一个可以跨越系统平台使用的底层支持接口库
安装httpd-2.4,依赖于apr-1.4+, apr-util-1.4+
安装过程
yum install -y gcc pcre-devel openssl-devel expat-devel autoconf libtool gcc-c++ wget make
wget http://us.mirrors.quenda.co/apache//httpd/httpd-2.4.41.tar.bz2
https://downloads.apache.org/apr/apr-1.7.0.tar.gz
wget https://downloads.apache.org/apr/apr-util-1.6.1.tar.gz
tar xvf httpd-2.4.41.tar.bz2 -C /opt/
tar xvf apr-1.7.0.tar.gz -C /opt/httpd-2.4.41/srclib/
tar xvf apr-util-1.6.1.tar.gz -C /opt/httpd-2.4.41/srclib/
cd /opt/httpd-2.4.41/srclib/
mv apr-1.7.0/ apr
mv apr-util-1.6.1/ apr-util
cd ..
./configure --prefix=/opt/httpd24 \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--with-included-apr \
--enable-modules=most \
--enable-mpms-shard=all \
--with-mpm=prefork
make && make install
echo 'PATH=/opt/httpd24/bin:$PATH' > /etc/profile.d/httpd.sh
useradd -s /sbin/nologin -r apache
vim /opt/httpd24/conf/httpd
user apache
group apache
source /etc/profile.d/httpd.sh
apachectl start
curl 10.0.0.8