1、http协议
1.1 http相关概念
http 超文本传输协议
配置文件:vim /etc/httpd/conf/httpd.conf
互联网分为:局域网、城域网、广域网, 其中,因特网是最大的广域网。
1.2 访问浏览器的过程
在浏览器中输入www.baidu.com,会经过下面5个过程:
- 浏览器的职责
- DNS 域名解析
- TCP 连接:三次握手、四次挥手
- HTTP 请求
- 浏览器的渲染原理
1.3 http协议通信过程
客户端向服务端发出请求,需要192.168.91.100/a.jpg文件,实际浏览的文件夹是:
软件名 | 路径 |
---|---|
httpd | /var/www/html/a.jpg |
nginx | /usr/share/nginx/html/a.jpg |
处理请求的顺序: 网卡 ---> 内核 ---> 程序
程序在用户空间,用户空间 和 内核空间 都在内存里面
小拓展:
1、客户打开网页,如何处理?
- 首先看状态码,状态码的信息比较直接
- 再查看日志,分析报错信息
2、/etc/mime.types 在里面的就是查看;里面没有的 就是下载
1.4 URL⭐⭐⭐
URL 与 URN,同属于URI(小i)统一资源标识。
-
URN 统一资源命名符
描述了资源的名字
-
URL 统一资源定位符⭐⭐⭐
用于描述某服务器某特定资源位置,资源的具体位置
1.4.1 URL完整格式:
js
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
拆分:
scheme:方案,访问服务器以获取资源时要使用哪种协议⭐
user:用户,某些方案访问资源时需要的用户名
password:密码,用户对应的密码,中间用:分隔
Host:主机,资源宿主服务器的主机名或IP地址⭐
port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号⭐
path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔⭐
params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔
query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔
frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔
1.4.2 URL基本格式:⭐⭐⭐
js
协议://主机名:端口/路径
scheme host port path
1.5 网站访问量
- pv 访问量, 即Page View, 页面浏览量或点击量
- UV 独立访客
1.6 http的七个过程⭐⭐⭐
一次完整的http请求处理过程:
- 建立连接:三次握手
- 同意连接
- 处理请求:内核根据协议和端口号,找到相应的程序,程序根据自己的配置文件,分析处理客户的请求。
- 访问资源:分析出客户需要的资源后,再告诉内核,内核去找资源交给程序。
- 构建响应报文:程序拿到资源后,会构建响应报文。
- 发送响应报文:报文准备好后,会交给内核,内核交给网卡,网卡转发给客户端。
- 记录日志
小拓展:I/O结构是 input、output
1.7 http工作机制
1.7.1 串行和并行
- 串行:1对1 每次只处理一个问题,效率慢,基本不用。
- 并行:一起,对单个客户端,多次请求的优化,弊端是存在时延,如果第50个没有处理完,就不会开启第51个。
1.7.2 处理高并发的四个基本模型:
- 单线程I/O结构:串行,启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
- 多线程I/O结构:串行,并行启动多个进程,每个进程响应一个连接请求复用的I/O结构
- 复用I/O结构:启动一个进程,同时响应N个连接请求
- 复用的多线程I/O结构:启动M个进程,每个进程响应N个连接请求,同时接收M*N个请求
用的最多是第2个和第3个
1.7.3 提高HTTP连接性能:
- 并行连接:单个客户端多次请求,通过多条TCP连接发起并发的HTTP请求
- 持久连接:一次连接 多次下载,keep-alive,重用TCP连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接
- 管道化连接:通过共享TCP连接,发起并发的HTTP请求
- 复用的连接:交替传送请求和响应报文
使用持久连接来进行优化,持久连接就是一次连接(三次握手)多次下载。持久连接 要比 并行效果好,处理效率更高。
小拓展:
1、结束持久连接的条件:
- 时间限制
- 下载资源个数的限制
2、一个进程里面最少要有一个线程。
3、改完配置文件为什么要重启?
因为修改是改在磁盘上的,内存并不知道进行了修改,重启是为了让磁盘和内存一致。
1.8 http协议的版本及区别⭐⭐⭐
http发明的初衷是共享文件
- http 0.9 :只支持下载,方法只有get(下载),不支持长连接
- http 1.0 :加入了多种方法,不止有get(下载)、post(上传)等,不支持长连接
- http 1.1:加入了长连接,(长连接也就是持久连接)
http1.1目前是市场主流
1.9 http 报文
报文主要分为 请求报文 和 回复报文
1.9.1 http请求报文
首部字段 主要是一些提示信息、注释
方法:
方法 | 含义 |
---|---|
GET | 获取资源 当前网络请求中,绝大部分使用的是 GET方法 |
HEAD | 获取报文首部,主要用于确认 URL 的有效性以及资源更新的日期时间等 |
POST | 传输实体主体 (比如传输 用户名密码) |
PUT | 上传文件(比如写博客) |
PATCH | 对资源进行部分修改 |
DELETE | 删除文件 |
OPTIONS | 查询支持的方法(查看服务端可以支持哪些方法) |
CONNECT | 要求在与代理服务器通信时建立隧道(类似加密) |
TRACE | 追踪路径 |
小实验:
实验目的:模拟http请求的过程
js
关闭防火墙
下载telnet
telnet 192.168.125.100 80 //访问80端口
get /index.html HTTP/1.1 //通过http1.1版本下载文件
//方法 URL 版本
HOST:1.1.1.1 //首部字段,随便设,自己定义
1.9.2 响应报文(回复报文)
js
[root@7-3 ~]# curl -I 192.168.125.130
HTTP/1.1 200 OK
//版本 状态码 短语
Date: Mon, 27 May 2024 12:03:14 GMT //下面这些都是首部字段
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 23 May 2024 15:28:25 GMT
ETag: "8-61920b3ba079e"
Accept-Ranges: bytes
Content-Length: 8
Content-Type: text/html; charset=UTF-8
1.10 http 状态码⭐⭐⭐⭐⭐
js
1xx(信息类):表示接收到请求并且继续处理
2xx(响应成功):表示动作被成功接收、理解和接受
3xx(重定向类):为了完成指定的动作,必须接受进一步处理
4xx(客户端错误类):请求包含错误语法或不能正确执行
5xx(服务端错误类):服务器不能正确执行一个正确的请求
http协议常用的状态码
js
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: 网关超时
2、httpd安装组成
http基于C/S架构:
服务名:apache
安装软件名:httpd
2.1 常见http服务器程序
- httpd apache,存在C10K(10K connections)问题
- nginx 解决C10K问题 httpd
- tomcat .jsp 应用程序服务器
国外用apache、中国用nginx
2.2 apache简介
2.2.1 apeche功能
-
提供web服务(提供网页服务)
-
多个虚拟主机,用一台物理服务器,搭建多个网站
-
CGI:Common Gateway interface,通用网关接口,支持动态程序。用CGI接口协议可以进行转发。
tomcat擅长处理 动态资源
nginx 擅长处理 静态资源
-
反向代理:客户端访问代理,代理将请求转发给服务端。
反向代理,代理的是 服务端;
正向代理,代理的是 客户端
-
负载均衡
2.2.2 apache特性⭐
- 高度模块化:core + modules
- DSO:Dynamic Shared Object 动态加载/卸载
- MPM:multi-processing module 多路处理模块
2.3 MPM 三个工作模式及特点⭐⭐⭐
MPM 多路复用技术,处理高并发(同一时间多个用户同时访问)
长连接:处理 单个用户多次访问。
2.3.1 prefork
prefork: 多进程I/O模型,每个进程响应一个请求
系统初始时,预生成多个空闲进程,等待请求。
进程+子进程:
- 优点:稳定,服务周到
- 缺点:慢,占用资源,不适用于高并发场景
2.3.2 worker
worker:复用的多进程I/O模型,多进程多线程,一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n
- 优点:相比prefork 占用的内存较少,可以同时处理更多的请求
- 缺点:占用资源,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。
基本不用!
2.3.3 event
事件驱动模型,进程+子进程+线程
js
修改配置:
vim 00-mpm.conf
//修改用prefork 还是用event
- 优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀
- 缺点:没有线程安全控制 小拓展:怎么查看是哪种工作模式?
js
pstree -p |grep httpd
花括号代表 线程
2.4 httpd安装和相关文件
2.4.1 httpd相关文件
配置文件 | 路径 |
---|---|
主配置文件 | /etc/httpd/conf/httpd.conf |
子配置文件 | /etc/httpd/conf.d/*.conf |
模块加载的配置文件 | /etc/httpd/conf.d/conf.modules.d/ |
2.4.2 编译安装
js
#编译安装
./configure --prefix=$install_dir --sysconfdir=/etc/httpd --enable-ssl
make -j`lscpu | grep "^CPU(s)" | awk '{print $NF}'` && make install
一定要分清楚,是编译安装 还是yum安装
3、http常见配置
优化:
- 子配置文件
- 隐藏版本号
- 优化长连接
3.1 主配置文件
js
yum安装的,对应配置文件位置:
/etc/httpd/conf/httpd.conf
统计多少行配置文件:
wc -l /etc/httpd/conf/httpd.conf
353 /etc/httpd/conf/httpd.conf
统计不包括注释的配置:
grep -v "^#" /etc/httpd/conf/httpd.conf
3.2 httpd -t 检查格式命令
apache 最有用的选项:
js
httpd -t //检查格式的命令
小拓展:1、
js
nginx -g 'daemon off' //daemon off是后台运行
2、
js
vim /etc/httpd/conf/httpd.conf
ServerName www.example.com:80 //打开域名
httpd -t
3.3 监听端口
通式:Listen [IP:]端口号
1、如果省略IP,则默认为本机所有IP 2、Listen指令至少一个,可重复出现多次
js
vim /etc/httpd/conf/httpd.conf
listen 80 //监听80端口
systemctl restart httpd //改完配置,重启服务!!!
#修改子配置文件
cd /etc/httpd/conf.d
vim test.conf
listen 9527
systemctl restart httpd
#其他配置文件
grep -i include /etc/httpd/conf/httpd.conf //建议用include
IncludeOptional conf.d/*.conf //建议放在最后
说明:
- Include和IncludeOptional功能相同,都可以包括其它配置文件
- 但是当无匹配文件时,include会报错,IncludeOptional会忽略错误
3.4 隐藏服务器的版本信息(真正的调优)
js
[root@7-3 ~]# curl -I 192.168.125.130
HTTP/1.1 200 OK
Date: Mon, 27 May 2024 15:29:19 GMT
Server: Apache/2.4.6 (CentOS) //版本号会显示出来
Last-Modified: Thu, 23 May 2024 15:28:25 GMT
ETag: "8-61920b3ba079e"
Accept-Ranges: bytes
Content-Length: 8
Content-Type: text/html; charset=UTF-8
[root@7-3 ~]# vim /etc/httpd/conf/httpd.conf //编辑配置文件
servertokens prod //最下面加上规则配置,为什么要在最后面加,因为谁写在最后谁生效
[root@7-3 ~]# systemctl restart httpd //重启服务
3.5 持久连接
断开条件:
- 时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级
- 请求数量: 请求数达到指定值,也会断开
js
KeepAlive On|Off //打开、关闭持久连接
KeepAliveTimeout 15 #时间,连接持续15s,可以以ms为单位,默认值为5s
MaxKeepAliveRequests 500 #数量,持久连接最大接收的请求数,默认值100
3.6 DSO
Dynamic Shared Object,加载动态模块配置,不需重启即生效。
动态模块所在路径: /usr/lib64/httpd/modules/
查看静态编译的模块: httpd -l
查看动态装载的模块: httpd -M
3.7 prefork模式相关的配置
js
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代替
3.8 worker、event 模式相关的配置
js
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