web基础与HTTP协议

web基础与HTTP协议

1、web基础

1.1web概念

  • 网页:纯文本格式文件 编写语言为HTML,在用户的浏览器中被"翻译"成网页形式显示出来。
  • 网站:由多个页面构成的,每个网页之间互相连接,通过超链接方式连接。
  • 域名:浏览网页时输入的网址,例如:www.baidu.com
  • HTTP/HTTPS:HTTP是传输网页的通信协议,而HTTPS是安全传输的通信协议
  • URL:万维网使用统一资源定位符来标志万维网上的各种文档,并使每个文档在整个因特网的范围内具有唯一的标识符
  • HTML:编写网页的语言,使用HTML超文本标记语言
  • 超链接:将多个网页连接起来,可以互相切换,可以指定各种网页,只需加入url地址
  • 发布:将制作好的网页上传到服务器供用户访问的过程,部署上云端,申请域名与IP地址映射,方便用户访问。

1.2web版本

(1)Web1.0:以编辑为特征,网站提供给用户的内容是编辑处理后的,然后用户阅读网站提供的内容 这个过程是网站到用户的单向行为

(2)Web2.0:更注重用户的交互作用,用户既是网站内容的消费者(浏览者),也是网站内容的制造者 加强了网站与用户之间的互动,网站内容基于用户提供,网站的诸多功能也由用户参与建设,实现了网站与用户双向的交流与参与Web2.0特征 用户分享、以兴趣为聚合点的社群、开放的平台,活跃的用户

1.3静态资源与动态资源

1.3.1静态资源

静态资源指的是在服务器上保存的文件,其内容在请求和传输过程中不发生变化。

静态资源可以是图片、CSS样式表、JavaScript文件、HTML文件等。

静态资源的请求一般是通过URL直接访问,当客户端发送请求时,服务器直接将这些文件返回给客户端,不进行任何处理。

1.3.2动态资源

动态资源则是在服务器端通过执行脚本或程序生成的内容,需要占用服务器的资源。

服务器会根据请求中的参数和数据,执行相应的脚本或程序来生成动态内容,然后将生成的内容返回给客户端。

动态资源可以是动态网页、API接口等。

1.3.3动态网页语言

  • PHP
  • JSP
  • Pyrhon
  • Ruby

2、HTTP

2.1HTTP概念

HTTP超文本传输协议是互联网上应用最为广泛的一种网络协议,它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。
HTTP版本

  • HTTP 0.9:1991,原型版本,功能简陋,只有一个命令GET,只能回应HTML格式,已被淘汰。
  • HTTP 1.0:每个TCP连接只能发送一个请求,发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建 一个连接引入了POST命令和HEAD命令头信息
    是 ASCII 码,后面数据可为任何格式。服务器回应时会告诉客户端,数据是什么格式。
  • HTTP 1.1:持久连接,即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。对于同一个域名,大多数浏览器允许同时建立6个持久连接引入了管道机制,即在同一个TCP连接里,客户端可以同时发送多个请求,进一步改进了HTTP协议的效率
  • HTTP/2.0:完全多路复用,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应。引入了头信息压缩机制,使用gzip或compress压缩后再发送。支持服务端推送,允许服务器未经请求,主动向客户端发送资源。
    HTTP1.0和HTTP1.l之间的区别

(1) 缓存处理

在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略。例如Entitytag,If-Unmodified-Since,If-Match,If-None-Match等更多可供选择的缓存头来控制缓存策略。
(2)带宽优化及网络连接的使用

HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206 (Partial Content) , 这样就方便了开发者自由的选择以便于充分利用带宽和连接
(3)错误通知的管理 在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示 服务器上的某个资源被永久性的删除
(4)Host头处理

在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的RZ并没有传递主机名(hostname)。但随着虚拟主机技术的发展, 在一台物理服务器上可以存在多个虚拟主机(Multi-homed

web Servers),并且它们共享一个Ie地址。

HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有inost头域会报告一个错误(400 Bad Request )
(5)长连接

HTTP1.1支持长连接和请求的流水线处理,在一个TCP连接上可以传送多个HTT请求和响应,减少了建立和关闭连接的消耗和延迟。在HTTP1.1中默认开启connection:keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点

2.2HTTP方法

HTTP 支持几种不同的请求命令,这些命令被称为 HTTP 方法(HTTP method)。

每条 HTTP 请求报文都包含一个方法, 告诉服务器要执行什么动作,包括:获取一个页面,运行一个网关程序,删除一个文件等。

最常用的获取资源的方法是 GET、POST、PUT。

  • GET请求会向数据库发索取数据的请求,从而来获取信息,该请求不会产生副作用。无论进行多少次操作,结果都是一样的。
  • PUT请求是向服务器端发送数据的,从而改变信息,无论进行多少次PUT操作,其结果并没有不同,与GET不同。
  • POST请求同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,几乎目前所有的提交操作都是用POST请求的。
  • DELETE请求顾名思义,就是用来删除某一个资源的。

GET 和 POST 比较
GET 方法

  • 从指定的服务器上获得数据
  • GET请求能被缓存
  • GET请求会保存在浏览器的浏览纪录里
  • GET请求有长度的限制
  • 主要用于获取数据
  • 查询的字符串会显示在URL后缀中,不安全

POST 方法

  • 提交数据给指定服务器处理
  • POST请求不能被缓存
  • POST请求不会保存在浏览器的浏览纪录里
  • POST请求没有长度限制
  • 查询的字符串不会显示在URL中,比较安全

2.3HTTP状态码

HTTP 状态码(HTTP Status Code)是用以表示网页服务器 HTTP 响应状态的 3 位数字代码,当浏览器请求某一 URL 时, 服务器根据处理情况返回相应的处理状态。

HTTP 常见状态码:

2.4HTTP请求流程分析

用户在浏览器输入URL访问时,发起HTTP请求报文,请求中包括请求行、请求头、请求体,服务器收到请求后返回响应报文,包括状态行、响应头、响应体。

2.4.1请求报文

  • 请求行:请求行由请求方法、URL 以及协议版本三部分组成。
  • 请求头:请求头为请求报文添加了一些附加信息,由"名/值"对组成,每行一对,名和值之间使用冒号分隔。
  • 空行:请求头部的最后会有一个空行,表示请求头部结束,接下来为请求体,这一行非常重要,必不可少。
  • 请求体:请求体是请求提交的参数,GET 方法已经在 URL 中指明了参数,所以提交时没有数据。POST 方法提交的参数在请求体中。
    常用的请求头:

2.4.2响应报文

  • 状态行:状态行由协议版本,状态码,状态码描述三部分组成。
  • 响应头:响应头与请求头部类似,为响应报文添加了一些附加信息。
  • 空行:响应头部的最后会有一个空行,表示响应头部结束。
  • 响应体:服务器返回的相应 HTML 数据,浏览器对其解析后显示页面。

3、httpd安装组成

3.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

3.2apache介绍和特点

Apache(音译为阿帕奇)是世界使用排名第一的Web服务器软件。 它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。 快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。

Apache HTTP Server 之所以受到众多企业的青睐,得益于其代码开源、跨平台、功能模块化、可灵活定制等诸多优点,不仅性能稳定,在安全性方面的表现也十分出色。

3.2.1apache功能

  • 提供http协议服务
  • 多个虚拟主机:IP、Port、FQDN
  • CGI:Common Gateway Interface,通用网关接口,支持动态程序
  • 反向代理
  • 负载均衡
  • 路径别名
  • 丰富的用户认证机制:basic,digest
  • 支持第三方模块

3.2.2apache特性:

  • 高度模块化:core + modules
  • DSO:Dynamic Shared Object 动态加载/卸载
  • MPM:multi-processing module 多路处理

3.2.3MPM multi-processing module工作模式

prefork:

多进程I/O模型,每个进程响应一个请求,CentOS 7 httpd默认模型一个主进程:生成和回收n个子进程,创建套接字,不响应请求多个子进程:工作 work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求。

Prefork MPM预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景

优点:稳定

缺点:慢,占用资源,不适用于高并发场景

worker:

复用的多进程I/O模型,多进程多线程,IIS使用此模型。

一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n

worker MPM是一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程程来处理请求,当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,因此可以承受更高的并发。

优点:相比prefork 占用的内存较少,可以同时处理更多的请求

缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)

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 默认

3.2.3Apache配置文件位置与基操

/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

#服务控制和启动
/var/www/html

#站点网页文档根目录
/etc/httpd/modules

/usr/lib64/httpd/modules

#模块文件路径
/usr/sbin/httpd

#主服务器程序文件
/etc/httpd/run/httpd.pid

#主进程文件
/var/log/httpd

access_log: #访问日志

error_log: #错误日志

#日志文件目录

3.3Httpd 安装和相关文件

3.3.1安装httpd并启动httpd服务

版本说明:

CentOS 7 以上,默认系统是httpd 2.4,CentOS 6 版默认为httpd 2.2

Ubuntu 18.04 默认 Apache/2.4.29

安装方式:

  • 包安装: centos发行版,稳定,建议使用
  • 编译:定制或特殊需求

3.3.1 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

3.3.2 CentOS 7 编译安装httpd 2.4

安装相关包:

powershell 复制代码
[root@centos7 ~]#yum -y install gcc make pcre-devel openssl-devel expat-devel
#下载源代码并解压缩:
[root@centos7 ~]#wget https://downloads.apache.org/apr/apr-1.7.0.tar.bz2
[root@centos7 ~]#wget https://downloads.apache.org//apr/apr-util-1.6.1.tar.bz2
[root@centos7 ~]#wget https://downloads.apache.org//httpd/httpd-2.4.46.tar.bz2
[root@centos7 ~]#ls
httpd-2.4.46.tar.bz2,apr-1.7.0.tar.bz2,apr-util-1.6.1.tar.bz2
[root@centos7 ~]#tar xvf apr-1.7.0.tar.bz2
[root@centos7 ~]#tar xvf apr-util-1.6.1.tar.bz2
[root@centos7 ~]#tar xvf httpd-2.4.46.tar.bz2

[root@centos7 ~]#mv apr-1.7.0 httpd-2.4.46/srclib/apr
[root@centos7 ~]#mv apr-util-1.6.1 httpd-2.4.46/srclib/apr-util
[root@centos7 ~]#ls httpd-2.4.46/srclib/
[root@centos7 ~]#apr apr-util Makefile.in

编译安装:

powershell 复制代码
#!/bin/bash
#Description: httpd source code install
#下载源码包
target_dir=/usr/local/src
install_dir=/usr/local/httpd
download_url=https://mirror.bit.edu.cn/apache/httpd/httpd-2.4.46.tar.bz2
file_name=${download_url##*/}
uncompress_dir=${file_name%.tar*}
rpm -q wget || yum install -y wget
wget -O $target_dir/$file_name $download_url
#安装依赖包
yum install -y gcc make apr-devel apr-util-devel pcre-devel openssl-devel 
redhat-rpm-config
#添加apache用户
id apache &> /dev/null || useradd -r -u 80 -d /var/www -s /sbin/nologin apache
#解压源码包
tar xf $target_dir/$file_name -C $target_dir
cd $target_dir/$uncompress_dir
#编译安装
./configure --prefix=$install_dir --sysconfdir=/etc/httpd --enable-ssl
make -j`lscpu | grep "^CPU(s)" | awk '{print $NF}'` && make install
#设置环境变量
echo 'PATH='$install_dir'/bin:$PATH' > /etc/profile.d/httpd.sh
source /etc/profile.d/httpd.sh

#修改配置文件
sed -ri 's#(User )daemon#\1apache#' /etc/httpd/httpd.conf
sed -ri 's#(Group )daemon#\1apache#' /etc/httpd/httpd.conf
#启动httpd服务
cat > /lib/systemd/system/httpd.service << EOF
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)
[Service]
Type=forking
ExecStart=/usr/local/httpd/bin/apachectl start
ExecReload=/usr/local/httpd/bin/apachectl graceful
ExecStop=/usr/local/httpd/bin/apachectl stop
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable httpd.service
systemctl start httpd.service

4、http配置

4.1虚拟主机

httpd 支持在一台物理主机上实现多个网站,即多虚拟主机

网站的唯一标识:

  • IP相同,但端口不同
  • IP不同,但端口均为默认端口
  • FQDN不同, IP和端口都相同

多虚拟主机有三种实现方案:

  • 基于ip:为每个虚拟主机准备至少一个ip地址
  • 基于port:为每个虚拟主机使用至少一个独立的port
  • 基于FQDN:为每个虚拟主机使用至少一个FQDN,请求报文中首部 Host:www.kgc.com

4.1.1基于ip地址

原理:每个虚拟主机分配一个唯一的IP地址,并通过服务器软件来指定每个虚拟主机使用的IP地址。

模拟实现



powershell 复制代码
[root@node2 conf.d]#vim /etc/httpd/conf.d/test.conf 
<VirtualHost 192.168.190.101:80>
    ServerAdmin [email protected]
    DocumentRoot "/var/www/html/ipv1"
    ServerName www.ipv1.com
    ErrorLog "/var/log/httpd/www.ipv1.com_error_log"
    CustomLog "/var/log/httpd/www.ipv1.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.190.101:80

4.1.2 基于端口地址

模拟实现

powershell 复制代码
[root@node2 conf.d]#vim /etc/httpd/conf.d/test.conf 

<VirtualHost 192.168.91.101:80>
    ServerAdmin [email protected]
    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.101:8080>
    ServerAdmin [email protected]
    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

4.1.3基于域名

模拟实现

powershell 复制代码
[root@node2 conf.d]#vim /etc/httpd/conf.d/test.conf 
<VirtualHost 192.168.91.101:80>
    ServerAdmin [email protected]
    DocumentRoot "/var/www/html/kgc"
    ServerName www.kgc.com
    ErrorLog "logs/www.kgc.com_error_log"
    CustomLog "logs/www.kgc.com_access_log" common
</VirtualHost>



<VirtualHost 192.168.91.101:80>
    ServerAdmin [email protected]
    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>


mkdir -p /var/www/html/kgc
mkdir -p /var/www/html/accp
echo "<h1>www.kgc.com</h1>" /var/www/html/kgc/index.html
echo "<h1>www.accp.com</h1>" /var/www/html/accp/index.html


去添加host文件

4.2Cookie和session

(1)功能

cookie和session都为了实现的是http的短期的持久化(内存/缓存方式,查询快、效率比较高)cookie 是缓存在用户端(client)浏览器中的(默认缓存一天),当下次客户端通过同一个浏览器访问客户端的时候,会优先读取cookie中的缓存信息,向服务端进行请求,同时服务端收到客户端请求的时候,读取到cookie文件,知道客户端之前找的是服务器A处理的任务,为了省事儿,省资源,干脆直接讲请求直接再交给服务器A处理

(2)区别

cookie 省服务器性能 session 更安全,为后面服务、集群、功能优化做铺垫,具体解释了怎么解决HTTP无状态协议的持久化/存储。cookie是再客户端,seesion是在服务端

相关推荐
腾讯TNTWeb前端团队5 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰9 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪9 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪9 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy10 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom10 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom10 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom10 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom11 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom11 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试