目录
HTTP协议
HTTP的基本概念
HTTP(超文本传输协议)是一种用于在网络上传输超文本数据的应用层协议。它是互联网上最为广泛使用的协议之一,被用于在客户端和服务器之间传输数据,包括文本、图像、音频、视频等。
-
URL(Uniform Resource Locator): URL 是用于标识互联网上资源的地址。它由多个组件组成,包括协议(如 http、https)、主机名、端口号、路径等。例如,http://www.example.com/index.html。
-
请求(Request): 请求是由客户端发起的,用于向服务器获取某个资源的动作。HTTP 请求包括方法(如 GET、POST、PUT、DELETE 等)、URL、请求头和请求体。
-
响应(Response): 响应是服务器对客户端请求的回应,包含了请求的结果和相应的数据。HTTP 响应包括状态码、响应头和响应体。
-
方法(Method): 方法是 HTTP 请求的动作。常见的方法包括:
- GET:从服务器获取资源。
- POST:向服务器提交数据,用于创建新资源。
- PUT:向服务器提交数据,用于更新资源。
- DELETE:从服务器删除资源。
-
状态码(Status Code): HTTP 响应中的状态码用于表示服务器对请求的处理结果。常见的状态码包括:
- 200 OK:请求成功。
- 404 Not Found:请求的资源不存在。
- 500 Internal Server Error:服务器内部错误。
;状态码的分类
1xx:100-101 信息提示
2xx:200-206 成功
3xx:300-307 重定向
4xx:400-415 错误类信息,客户端错误
5xx:500-505 错误类信息,服务器端错误
;常见的状态码
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: 网关超时
-
请求头(Request Header)和响应头(Response Header): 头部包含了关于请求或响应的一些元信息,如内容类型、内容长度、授权等。
-
Cookies: Cookies 是服务器在客户端存储的小段信息,用于跟踪用户的会话状态和身份验证。
-
会话(Session): 会话是在客户端和服务器之间持续的交互,通常通过 Cookies 来维护。
-
缓存(Caching): 缓存是指在客户端或代理服务器上保存副本以减少对原始服务器的请求,提高性能。
-
代理服务器(Proxy): 代理服务器位于客户端和服务器之间,用于中转请求和响应,可以用于负载均衡、安全性增强等。
-
安全性(HTTPS): HTTPS 是通过 TLS(传输层安全协议)来加密通信内容的 HTTP 版本,用于保护数据的隐私和完整性。
访问浏览器的过程
1. 解析网址:
- 提取协议、域名、端口号和路径
2. DNS 解析:
- 查询域名对应的 IP 地址
3. 建立 TCP 连接:
- 客户端和服务器进行三次握手
4. 发起 HTTP 请求:
- 浏览器发送一个 HTTP 请求到服务器,该请求包括方法(如 GET、POST)、URL、请求头和可能的请求体。
{5. 服务器处理请求: 服务器接收到浏览器的请求后,根据请求的内容和路径,找到相应的资源或执行相应的操作。
6. 服务器返回响应: 服务器向浏览器返回一个 HTTP 响应,该响应包括状态码、响应头和响应体。响应体可能是 HTML、图片、文本等内容。}
7. 浏览器渲染:
- 解析 HTML、加载和渲染 CSS、JavaScript、图像
- 执行页面上的脚本
8. 显示页面: 渲染完毕后,浏览器会将页面显示给用户,用户可以看到网站的内容。
9. 关闭连接: 一旦页面完全渲染并显示,浏览器会关闭与服务器的连接,释放资源。
-
建立连接:
当客户端(通常是浏览器)要求访问某个 URL(统一资源定位符)时,它会建立与服务器的连接。这通常是通过 TCP(传输控制协议)来实现的。在连接建立之前,客户端和服务器会执行三次握手以确保双方可以通信。 -
接收请求:
一旦连接建立,服务器将开始接收来自客户端的请求。这个请求包括 HTTP 方法(如 GET、POST、PUT 等)、URL、请求头和请求体。请求头包含有关请求的元信息,例如客户端支持的内容类型、用户代理信息等。 -
处理请求:
服务器收到请求后,会根据请求的内容和方法来处理它。这可能涉及到验证用户身份、检查权限、查找资源等操作。服务器通常会将请求交给相应的处理程序来执行。 -
访问资源:
一旦服务器确定如何处理请求,它会根据请求的 URL 和路径找到相应的资源。这可以是一个 HTML 文件、图片、脚本等。服务器还可能需要从数据库或其他存储中检索数据,以生成响应。 -
构建响应报文:
服务器根据请求和访问的资源,构建一个 HTTP 响应报文。这个报文包括状态码、响应头和响应体。状态码表示服务器对请求的处理结果,响应头包含有关响应的元信息,响应体包含实际的内容。 -
发送响应报文:
一旦响应报文构建完成,服务器将通过之前建立的连接将响应发送回客户端。响应报文经过网络传输到客户端,确保数据的完整性和正确性。 -
记录日志:
在整个过程完成后,服务器通常会记录访问日志,记录请求的详细信息,包括访问时间、IP 地址、请求的 URL、响应状态码等。这有助于系统管理员和开发人员跟踪和分析访问模式和问题。
web的资源类型
一个网页由多个资源(文件)构成,打开一个页面,通常会有多个资源展示出来,但是每个资源都要单独请求。因此,一个"Web 页面”通常并不是单个资源,而是一组资源的集合
静态资源:指那些在服务器上存储为文件的内容,每次请求时不会发生变化。
不需要服务器端的处理就可以直接提供给客户端。静态资源通常包括图片、样式表(CSS)、脚本文件(JavaScript)、字体文件等。
动态资源:指那些在每次请求时都可以动态生成的内容。这些资源通常需要服务器端的处理来生成适当的内容以便根据用户的请求和数据来创建响应。
动态资源可以包括根据用户登录状态、数据库查询结果、表单提交等动态生成的内容。常见的动态资源包括动态网页、API 响应等。
WEB开发语言
html
HTML(超文本标记语言): HTML 是构建网页结构的标记语言。通过使用标签和元素,可以定义页面的内容、标题、段落、图像、链接等。HTML 提供了页面的基本结构和布局。
CSS
CSS(层叠样式表): CSS 用于控制网页的外观和样式。通过定义样式规则,可以指定文本、图像、布局等元素的颜色、字体、大小、间距等属性,从而使网页外观更加美观和一致。
js
JavaScript(JS): JavaScript 是一种用于开发交互式和动态功能的脚本语言。它可以在网页上创建响应用户操作的效果,如表单验证、动态内容加载、页面交互等。JS 可以使网页变得更加生动和互动。
HTTP协议版本
HTTP/0.9: 功能简陋,仅支持GET方法
HTTP/1.0: 相较以前版本可以支持POST、HEAD方法,简单,但不支持持久连接
HTTP/1.1: 更常用的版本,引入了持久连接,可以一次性处理多个请求。
HTTP/2: 更现代的版本,使用多路复用提高效率,还有头部压缩和服务器推送功能。
HTTP/3: 最新版本,使用UDP改进延迟,更快的加载速度。
HTTP报文结构
HTTP 请求报文的结构:
<HTTP 方法> <URL> <HTTP 版本>
<请求头部字段>
<请求正文>
- <HTTP 方法>:表示请求的方法,如 GET、POST、PUT 等。
- :表示请求的目标资源的 URL。
- <HTTP 版本>:表示使用的 HTTP 协议版本,如 HTTP/1.1。
- <请求头部字段>:包含请求的各种元信息,如用户代理、内容类型等。
- <请求正文>:包含请求的实际数据,例如 POST 请求中的表单数据。
HTTP 响应报文的结构:
<HTTP 版本> <状态码> <状态消息>
<响应头部字段>
<响应正文>
- <HTTP 版本>:表示使用的 HTTP 协议版本,如 HTTP/1.1。
- <状态码>:表示服务器对请求的处理结果,如 200(成功)、404(未找到)等。
- <状态消息>:对状态码的文本描述。
- <响应头部字段>:包含响应的各种元信息,如服务器类型、内容类型等。
- <响应正文>:包含响应的实际数据,例如返回的 HTML 内容或文件。
HTTP相关配置文件
配置文件:
/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:Apache 的 systemd 服务单元文件。
配置文件:/etc/sysconfig/httpd,可以设置 Apache 服务的环境变量和参数。
服务控制和启动:
通过 systemctl 命令进行服务的启动、停止、重启、状态查看、重新加载等操作。
apachectl 命令也提供了启动、停止、重启和检查配置的功能。
service httpd 命令也可以进行启动、停止、重启和检查配置。
站点网页文档根目录:
默认的站点网页文档根目录:/var/www/html,用于存放网站的静态文件和内容。
模块文件路径:
Apache 模块文件存放路径:/etc/httpd/modules 或 /usr/lib64/httpd/modules。
主服务器程序文件:
Apache 主服务器程序文件路径:/usr/sbin/httpd。
**设置默认主机名为www.magedu.org **
[root@centos7 ~]#vim /etc/httpd/conf/httpd.conf
#ServerName www.example.com:80
servername www.magedu.org
[root@centos7 ~]#httpd -t
Syntax OK
**include 子配置文件**
[root@centos7 ~]#grep -i include /etc/httpd/conf/httpd.conf
Include conf.modules.d/*.conf
IncludeOptional conf.d/*.conf
#Include和IncludeOptional功能相同,都可以包括其它配置文件;但是当无匹配文件时,include会报错,IncludeOptional会忽略错误
[root@centos7 httpd]#grep -i serverroot /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd" #Apache 服务器的根目录
[root@centos7 ~]#ls /etc/httpd/conf.modules.d/ #查看模块加载的配置文件
00-base.conf 00-lua.conf 00-optional.conf 00-systemd.conf 10-proxy_h2.conf
00-dav.conf 00-mpm.conf 00-proxy.conf 01-cgi.conf
**监听地址**
Listen [IP:]PORT # (1) 省略IP表示为本机所有IP (2) Listen指令至少一个,可重复出现多次
vim /etc/httpd/conf.d/test.conf
Listen 192.168.91.100:8080
Lsten 80
[root@localhost ~]#curl -i 192.168.91.101 #显示完整的响应头和实际内容。
**查看静态编译的模块:**httpd -l
[root@centos7 httpd]#rpm -ql httpd|grep basic
/usr/lib64/httpd/modules/mod_auth_basic.so
**查看静态编译及动态装载的模块:**httpd -M
[root@node2 httpd]#httpd -M|grep basic
auth_basic_module (shared)
**MPM (Multi-Processing Module)多路处理模块**
[root@centos7 ~]#vim /etc/httpd/conf.modules.d/00-mpm.conf
[root@centos7 ~]#grep Load /etc/httpd/conf.modules.d/00-mpm.conf
#one of the following LoadModule lines. See the httpd.conf(5) man
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
[root@centos7 ~]#httpd -M | grep mpm
AH00558: httpd: Could not reliably determine the server's fully qualified domain
name, using centos8.localdomain. Set the 'ServerName' directive globally to
suppress this message
mpm_prefork_module (shared)
**prefork模式相关的配置**
StartServers 100
MinSpareServers 50
MaxSpareServers 80
ServerLimit 2560 #最多进程数,最大值 20000
MaxRequestWorkers 2560 #最大的并发连接数,默认256
MaxConnectionsPerChild 4000 #子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个
请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)
MaxRequestsPerChild 4000 #从 httpd.2.3.9开始被MaxConnectionsPerChild代替
**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
I/O模型
Linux中的I/O:
-
阻塞 I/O: blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情。
-
非阻塞 I/O: nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。
-
多路复用 I/O: 使用 select、poll 或 epoll 等机制,将多个 I/O 事件合并成一个事件进行监听,当有事件就绪时,程序才会进行数据操作,避免了不必要的轮询。
-
异步 I/O: asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态
磁盘 I/O 和网络 I/O 的区别:
-
磁盘 I/O: 是指计算机与磁盘存储之间的数据传输,包括从磁盘读取数据和将数据写入磁盘。磁盘 I/O 主要涉及磁盘的读写速度、寻址时间和缓存等。
-
网络 I/O: 是指计算机之间通过网络进行数据交换的过程,包括从网络接收数据和将数据发送到网络。网络 I/O 主要涉及网络传输速度、延迟、带宽和协议等。
图解:
当用户发起http请求需要请求一个index. html 网页文件
客户端请求与服务器端建立连接,建立连接后, 会发送请求报文
服务端的网卡收到请求报文, 会将该报文复制到 内核空间, 内核空间分析报文后交给对应的程序
nginx 分析该报文, 将报文和自己的配置文件,一-一 比对,按照配置文件完成请求, 分析后发现 客户需要index. htm1
由于程序的权限问题, 没有资格直接调用磁盘上的文件,
程序会再将这个请求 再次转发给内核
内核得到后请求去磁盘上找文件,找到文件后复制给程序
程序会构建响应报文, 构建好后在交给内核空间
内核空间 得到响应报文后,再交给网卡发给客户|
多路复用I/O模型:
多路复用I/O(I/O multiplexing)模型是一种基于事件驱动的 I/O 处理模式。它利用操作系统提供的多路复用机制(如select、poll、epoll等)来同时监听多个 I/O 事件,当某个事件就绪时,通知应用程序进行处理。
通过多路复用I/O模型,可以在一个线程中同时处理多个客户端连接的 I/O 操作,而不需要为每个连接创建一个线程或进程,避免了资源开销和上下文切换的成本。
常见的多路复用I/O模型有:
- select:适用于连接数不太多的情况,轮询监听多个文件描述符上的 I/O 事件。
- poll:与select类似,但没有连接数的限制,并且不会修改传入的描述符集合。
- epoll:适用于连接数非常多的情况,通过事件驱动机制来处理 I/O 事件,可以在大并发情况下具有较高的性能优势。
select poll epoll
①Nginx服务使用异步非阻塞模式:请求不需要排队,会反馈任务的完成结果。
②Apache服务使用同步阻塞模式:请求需要排队,且不会主动返回结果。
优缺点
模型 | 描述 | 优点 | 缺点 |
---|---|---|---|
select | 最古老的模型 | 可以同时监视多个文件描述符 | 效率较低,不适用于大规模并发连接 |
poll | 类似于select | 效率相对更高,可以处理大量并发连接 | 随着文件描述符数量的增加,性能下降较明显 |
epoll | Linux特有模型 | 在高并发场景下性能表现更好,使用边缘触发方式,只在状态变化时通知 | 在非Linux系统上不可用,涉及到一些操作系统特定的细节和配置 |
区别
- | select | poll | epoll |
---|---|---|---|
操作方式 | 遍历 | 遍历 | 回调 |
底层实现 | 数组 | 链表 | 哈希表 |
IO效率 | 每次调用都进行线性遍历,时间复杂度为0(n) | 同左 | 事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪的fd放到rdlllist里,时间复杂度O(1) |
最大连接数 | 1024(x86)2048(x64) | 无上限 | 无上限 |
fd拷贝 | 每次调用select都需要把fd集合从用户拷贝到内核态 | 每次调用poll,都需要把fd集合从用户态拷贝到内核态 | 调用epoll ctl时拷贝进内核并保存,之后每次epoll wait不拷贝 |
配置虚拟主机
httpd 支持在一台物理主机上实现多个网站,即多虚拟主机
网站的唯一标识:
- IP相同,但端口不同
- IP不同,但端口均为默认端口
- FQDN不同, IP和端口都相同
多虚拟主机有三种实现方案:
- 基于ip:为每个虚拟主机准备至少一个ip地址
- 基于port:为每个虚拟主机使用至少一个独立的port
- 基于FQDN:为每个虚拟主机使用至少一个FQDN
实际操作
基于ip地址
[root@node2 conf.d]#vim /etc/httpd/conf.d/test.conf
<VirtualHost 192.168.91.101:80>
ServerAdmin support@jfedu.net
DocumentRoot "/var/www/html/accp"
ServerName www.accp.com
ErrorLog "logs/www.accp.com_error_log"
CustomLog "logs/www.accp.com_access_log" common
</VirtualHost>
<VirtualHost 192.168.91.188:80>
ServerAdmin support@jfedu.net
DocumentRoot "/var/www/html/accp"
ServerName www.accp.com
ServerAlias www.dummy-host.example.com
ErrorLog "logs/www.accp.com_error_log"
CustomLog "logs/www.accp.com_access_log" common
</VirtualHost>
<Directory "/var/www">
AllowOverride None
# Allow open access:
Require all granted
</Directory>
[root@localhost extra]#vim /etc/httpd/conf/httpd.conf
Listen 192.168.91.101:80
Listen 192.168.91.188:80
基于端口地址
[root@node2 conf.d]#vim /etc/httpd/conf.d/test.conf
<VirtualHost 192.168.187.101:80>
ServerAdmin support@jfedu.net
DocumentRoot "/var/www/html/csdn"
ServerName www.csdn.com
ErrorLog "logs/www.csdn.com_error_log"
CustomLog "logs/www.csdn.com_access_log" common
</VirtualHost>
<VirtualHost 192.168.187.101:8080>
ServerAdmin support@jfedu.net
DocumentRoot "/var/www/html/csdn"
ServerName www.csdn.com
ServerAlias www.dummy-host.example.com
ErrorLog "logs/www.csdn.com_error_log"
CustomLog "logs/www.csdn.com_access_log" common
</VirtualHost>
<Directory "/var/www">
AllowOverride None
# Allow open access:
Require all granted
</Directory>
[root@localhost extra]#vim /etc/httpd/conf/httpd.conf
Listen 192.168.187.101:80
Listen 192.168.187.188:80
基于域名
[root@node2 conf.d]#vim /etc/httpd/conf.d/test.conf
<VirtualHost 192.168.187.101:80>
ServerAdmin support@jfedu.net
DocumentRoot "/var/www/html/xz"
ServerName www.xz.com
ErrorLog "logs/www.xz.com_error_log"
CustomLog "logs/www.xz.com_access_log" common
</VirtualHost>
<VirtualHost 192.168.187.101:80>
ServerAdmin support@jfedu.net
DocumentRoot "/var/www/html/csdn"
ServerName www.csdn.com
ServerAlias www.dummy-host.example.com
ErrorLog "logs/www.csdn.com_error_log"
CustomLog "logs/www.csdn.com_access_log" common
</VirtualHost>
<Directory "/var/www">
AllowOverride None
# Allow open access:
Require all granted
</Directory>
mkdir -p /var/www/html/xz
mkdir -p /var/www/html/csdn
echo "<h1>www.xz.com</h1>" /var/www/html/kgc/index.html
echo "<h1>www.csdn.com</h1>" /var/www/html/accp/index.html
去添加host文件
apache的功能和特点
apache官网: www.apache.org
Apache 是一个开源的、跨平台的 Web 服务器软件,全名为 “Apache HTTP Server”。提供静态和动态内容的传输。
功能:
- 提供 Web 服务器功能,传输静态和动态内容到浏览器。
- 处理 HTTP 请求,传送网页、图像、脚本等。
- 支持多种编程语言和后端技术,处理动态生成内容。
- 支持虚拟主机,允许在同一台服务器上托管多个域名或网站。
- 提供安全功能,如 SSL/TLS 支持、访问控制、认证等。
- 记录访问日志和错误日志,帮助分析和排除问题。
- 支持性能优化,多线程和多进程处理并发请求。
- 具有模块化架构,可以根据需要启用或禁用功能。
特点:
- 开源:免费且源代码开放,有庞大的用户社区支持。
- 跨平台:可以运行在多种操作系统上,如 Linux、Windows 等。
- 灵活:支持多种编程语言和技术,适用于各种类型的项目。
- 高性能:能够处理并发请求,支持内容压缩和缓存。
- 安全性:提供多种安全功能,保护服务器和网站免受攻击。
- 虚拟主机:允许在同一服务器上托管多个网站和域名。
- 日志记录:记录访问和错误日志,有助于监控和分析。
Cookie和session
Cookie:
- Cookie 是服务器发送到用户浏览器并存储在用户本地计算机上的小段数据。
- Cookie 主要用于在用户访问不同页面或关闭浏览器后保持用户状态,如登录信息、用户偏好等。
- Cookie 存储在浏览器中,可以设置过期时间,可以被浏览器访问和修改,但是每个域名的 Cookie 是相互隔离的。
- Cookie 的数据以键值对的形式存储,可以通过 JavaScript 和服务器端代码进行读写。
Session:
- Session 是服务器端的数据存储机制,用于跟踪用户在一次会话中的状态。
- 当用户访问服务器时,服务器为每个用户创建一个唯一的 Session,它通常通过 Cookie 中的 Session ID 进行识别。
- Session 数据存储在服务器上,用户无法直接修改它,可以存储更敏感的用户数据。
- Session 的数据量不受 Cookie 大小限制,但可能会影响服务器内存和性能。
- Session 在用户关闭浏览器后会被销毁,或者可以设置过期时间来控制存储时间。
在 Web 开发中,通常使用 Cookie 来保持用户登录状态、存储用户偏好等,而使用 Session 来存储敏感信息、购物车内容等。使用 Cookie 和 Session 可以有效地管理用户状态,提供更好的用户体验和安全性。