web基础与http协议

一 http相关概念

与之关联

万维网:WWW并非某种特殊的计算机网络,是一个大规模的、联机式的信息贮藏库,使用链接的方法能非常方便地从因特网上的一个站点访问另一个站点(超链技术),具有提供分布式服务的特点。万维网是一个分布式的超媒体系统,是超文本系统的扩充,基于B/S架构实现

HTTP:为解决"用什么样的网络协议来实现整个因特网上的万维网文档”这一难题,就要使万维网客户程序(以浏览器为主,但不限于浏览器)与万维网服务器程序之间的交互遵守严格的协议,即超文本传送协议(HyperText Transfer Protocol)。HTTP是处于应用层的协议,使用TCP传输层协议进行可靠的传送。因此,需要特别提醒的是,

万维网是基于因特网的一种广泛因特网应用系统,且万维网采用:

HTTP(80/TCP)和 HTTPS(443/TCP)的传输协议

因特网还有其他的网络应用系统(如:FTP、SMTP等)

HTML:为了解决"怎样使不同作者创作的不同风格的万维网文档,都能在因特网上的各种主机上显示出来,同时使用户清楚地知道在什么地方存在着链接”这一问题,万维网使用超文本标记语言,使得万维网页面的设计者可以很方便地用链接从页面的某处链接到因特网的任何一个万维网页面,并且能够在自己的主机品目上将这些页面显示出来。HTML与txt一样,仅仅是是一种文档,不同之处在于,这种文档专供于浏览器上为浏览器用户提供统一的界面呈现的统一规约。且具备结构化的特征,这是txt所不具备的强制规定。

URL:万维网使用同一资源定位符来标记万维网的各种文档,使每个文档在整个因特网的范围内具有唯一的标志符

  1.1 HTML基础概念

 HTML叫做超文本标记语言,是一种规范,也是一种标准,它通过标记符号来标记要显示的网页中的各个部分。网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏览器如何显示其中的内容。 HTML命令可以说明文字,图形、动画、声音、表格、链接等

HTML文件可以使用任何能够生成txt文件的文本编辑器来编辑,生成超文本标记语言文件,只用修改文件名后缀为“.html”或“.htm”即可

 1.1.1 html的基本标签

HTML标签采用双标记符的形式,前后标记符对应,分别表示标记开始和结束,标记符中间的内容被标签描述。前标记符由“< XXX>”表示,结尾标记符多了一个“/”,由“< /XXX>”表示

 1.1.2html的文件结构 

HTML文件最外层由< html> < /html>表示,说明该文件是用HTML语言描述的。在它里面是并列的头标签(< head>)和内容标签(< body>)

 <html>
     <head>网页的头部信息</head>
     <body>网页内容</body>
 </html>

扩展网络通信,两台主机之间通信


​
[root@zzh ~]#yum install nc -y
 
 
[root@zzh ~]#nc -l 8000
一切安然
 
#主机1 在监听 8000 端口
 
 
 
[root@centos7-2 ~]#nc 192.168.11.9 8000
一切安然
 
#主机2 去访问  主机1(服务端)的8000 端口 
 
​

1.2 访问浏览器的过程

数据或报文传输与解封   

HTTP访问过程

1.3 动态网页与静态网页 

1.3.1 静态网页

在网站设计中,纯粹HTML格式的网页通常被称为“静态网页”,静态网页是标准的HTML文件,它的文件扩展名是 htm、 html。静态网页是网站建设的基础,早期的网站一般都是由静态网页制作的
静态网页也可以出现各种动态的效果,如GIF格式的动画、FLASH、滚动字幕等。这些“动态效果”只是视觉上的,与下面将要介绍的动态网页是不同的概念
静态网页只要不修改代码,是不会改变的,每天展示的内容是一样的。静态网页只使用html语言,不使用其他高级程序语言

1.3.2 动态网页

所谓的动态网页,是指跟静态网页相对的一种网页编程技术。静态网页,随着HTML代码的生成,页面的内容和显示效果就基本上不会发生变化了——除非是修改页面代码。而动态网页则不然,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的
动态网页URL的后缀不是htm、html、shtml、xml等静态网页的常见网页制作格式,而是以aspx、.asp、.jsp、.php、.perl、.cgi等形式为后缀,并且在动态网页网址中有一个标志性的符号——“?”
动态网页是基本的html语法规范与Java、PHP、C#等高级程序设计语言、数据库编程等多种技术的融合,以期实现对网站内容和风格的高效、动态和交互式的管理。因此,从这个意义上来讲,凡是结合了HTML以外的高级程序设计语言和数据库技术进行的网页编程技术生成的网页都是动态网页

1.3.4 动态网页语言

早期的动态网页主要采用通用网关接口 CGI(Common Gateway Interface)技术,虽然 CGI 技术已经发展成熟而且功能强大, 但由于编程困难、效率低下、修改复杂,所以有逐渐被新技术取代的趋势

http:是应用层协议;默认端口: 80/tcp

WEB前端开发语言:
①PHP

( 超文本预处理器),它是当今Internet. 上 最为火热的脚本语言,其语法借鉴了C、 Java、PERL等语言,但只需要很少的编程知识你就能使用PHP建立一个真正交互的Web站点

②JSP

即Java Server Pages (Java 服务器页面X,它是由Sun Microsystem 公司于1999年6月推出的新技术,是基于Java Servlet以及整个Java体系的web开发技术

③Python

是一种面向对象、跨平台的动态类计算机程序设计语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的大型项目开发

注意:Python支持的并发量不高,假设python写的脚本需要10台服务器支撑的话,Go语言只需要1台服务器

④Ruby

是一种简单快捷的面向对象( 面向对象程序设计)脚本语言,在20世纪90年代由日本人松本行弘(Yukihiro Matsumoto) 开发,遵守GPL协议和Ruby License。 它的灵感与特性来自于Perl、 Smalltalk、 Eiffel、 Ada 以及Lisp语言

⑤CSS

Cascading Style Sheet 层叠样式表, 定义了如何显示(装扮) HTML 元素,比如:字体大小和颜色属性等。样式通常保存在外部的css 文件中,用于存放一些HTML文件的公共属性,从而通过仅编辑一个简单的 CSS 文档,可以同时改变站点中所有页面的布局和外观。

⑥js

javascript,实现网页的动画效果,但实属于静态资源

Java和javascript的关系: 周杰和周杰伦的关系

1.4.2MIME

MIME : Multipurpose Internet Mail Extensions 多用途互联网邮件扩展

文件 /etc/mime.types ,来自于mailcap包

MIME格式:type/subtype 主要类型/次要类型

类型 代表数据类型所属的大致分类,例如  或 video或text

子类型 标识了 MIME 类型所代表的指定类型的确切数据类型。以  类型为例,它的子类型包括:plain(纯文本)、(HTML 源代码)、(iCalendar/ 文件)textplainhtmlcalender.ics

格式:type/subtype

文件 /etc/mime.types ,来自于mailcap包

#rpm -ql mailcap     看文件配置

1.4.3

1.4.3 URI(i) 和 URL uri

URI: Uniform Resource Identifier 统一资源标识,分为URL 和 URN

  • URN:Uniform Resource Naming,统一资源命名

示例: P2P下载使用的磁力链接是URN的一种实现

magnet:?xt=urn:btih:660557A6890EF888666(只是描述了资源的名字,并没有明确该资源在哪里)

  • URL:Uniform Resorce Locator,统一资源定位符,用于描述某服务器某特定资源位置

两者区别:

  • URN如同一个人的名称,而URL代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。URN仅用于命名,而不指定地URL组成

scheme:方案,访问服务器以获取资源时要使用哪种协议
user:用户,某些方案访问资源时需要的用户名
password:密码,用户对应的密码,中间用:分隔
Host:主机,资源宿主服务器的主机名或IP地址
port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号
path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔
params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔
query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔
frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔

1.4.4.网站访问量

网站访问量统计的重要指标

  • IP(独立IP):即Internet Protocol,指独立IP数。一天内来自相同客户机IP 地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标

  • PV(访问量): 即Page View, 页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量

  • UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的

网页概述

网页是文件存放某一角落计算机中而计算机必与互联网相连,网页经由网址(URL)识别与存放

是互联网中的一“页”

文本:

网页主要信息一般以文本形式为主

图像:

直观形象的作用

静态图像:

图片,GIF  JPEG   PNG;或矢量图形,SVC   Flash

动态图像:GIF SVG

flash动画

声音视频

表格 导航栏

一组超链接,其链接目的端是重要的页面

交互式表单:

通常链接数据库并接受用户浏览器端输入的数据,利用数据库为客户端与服务端提供更多的互动

网页相关概念

域名

浏览网页是输入的网址

HTTP

浏览器访问网址时,域名前面加http://,表示使用HTTP协议传输网页

URL

寻址系统,表示网络资源的位置路径

HTML

编写网页超文本标记语言

超链接

将网站中不同网页链接起来的功能

发布

1.4.5http的相关知识 

 http协议的介绍

HTTP协议采用了  请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本,成功或者错误编码加上服务器信息、实体元信息以及可能的实体内容

改良创始人:伯纳斯—李  于1989创立

1.4.6http协议版本:

http 1.0  

相较以前版本可以支持POST、HEAD方法,支持HTML文件以外的其他类型,但不支持持久连接

http 1.1  

支持持久连接,即在一个TCP连接里面完成多个http请求和响应,但是每个请求和响应是按照顺序一一对应的,现如今使用最广泛的版本

http 2.0  

支持完全多路复用,即不光可以在在一个TCP连接里面完成多个http请求和响应,而且请求和响应不用按照顺序一一对应。( 也支持压缩,服务端主动推送)

http 3.0  

基于UDP协议 ,最新版本还在初步推广中

面试小技巧:

0.9版本 只有 get 只有下载 没有上传(put)

1.0版本 没有长连接可以下载和上传 (put)

1.1版本 支持长连接可以下载和上传 (put)

http的方法

HTTP 支持几种不同的请求命令,这些命令被称为 HTTP 方法,包含一个方法, 告诉服务器要执行什么动作,包括:获取一个页面,运行一个网关程序,删除一个文件等。最常用的获取资源的方法是 GET、POST、PUT

网站访问量

网站访问量统计的重要指标
  • IP(独立IP):即Internet Protocol,指独立IP数。一天内来自相同客户机IP 地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标

  • PV(访问量): 即Page View, 页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量

  • UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的

网站统计Alexa网站排名查询

1.4.5 HTTP工作机制

一次http事务包括:

  • http请求:http request

  • http响应:http response

Web资源:web resource, 一个网页由多个资源(文件)构成,打开一个页面,通常会有多个资源展示出来,但是每个资源都要单独请求。因此,一个"Web 页面”通常并不是单个资源,而是一组资源的集合

web资源类型:

  • 静态文件:无需服务端做出额外处理,服务器端和客户端的文件内容相同

    常见文件后缀:html, txt, jpg, js, css, mp3, avi

  • 动态文件:服务端执行程序,返回执行的结果,服务器端和客户端的文件内容不相同

    常见文件后缀:php, jsp ,asp

HTTP连接请求

串行和并行连接

串行,持久连接和管道

提高HTTP连接性能
  • 并行连接:通过多条TCP连接发起并发的HTTP请求

  • 持久连接:keep-alive,重用TCP连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接

  • 管道化连接:通过共享TCP连接,发起并发的HTTP请求

  • 复用的连接:交替传送请求和响应报文(实验阶段)

1.4.6HTTPS协议:

为解决安全问题,网景在1994年创建了HTTPS,并应用在网景导航者浏览器中。 最初,HTTP是与SSL一起使用的;在SSL逐渐演变到TLS时(其实两个是一个东西,只是名字不同而已),最新的HTTPS也由在2000年五月公布的RFC 2818正式确定下来。HTTPS就是安全版的HTTP,目前大型网站基本实现全站HTTPS

HTTPS特点

  • HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费

  • HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的

  • HTTP和HTTPS使用的是不同的连接方式,端口不同,前者是80,后者是443

  • HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题

  • HTTPS 实现过程降低用户访问速度,但经过合理优化和部署,HTTPS 对速度的影响还是可以接受的

1.4.7HTTP 请求访问的完整过程

  1. 建立连接

  2. 接收请求

  3. 处理请求

  4. 访问资源

  5. 构建响应报文

  6. 发送响应报文

  7. 记录日志

1.5 http协议及报文头部结构

http协议:http/0.9, http/1.0, http/1.1, http/2.0,http/3.0

http协议:stateless 无状态, 服务器无法持续追踪访问者来源

解决http协议无状态方法

  • cookie 客户端存放

  • session 服务端存放

http事务:一次访问的过程

  • 请求:request

  • 响应:response

协议查看或分析的工具:

tcpdump, wireshark,tshark

1.5.1HTTP请求报文分析

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

请求报文四部分:

请求行:请求行由请求方法、URL 以及协议版本三部分组成

请求头:请求头为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用                   冒号分隔

空行:请求头部的最后会有一个空行,表示请求头部结束,接下来为请求体,这一行非常重要,               必 不可少

请求体:请求体是请求提交的参数,GET 方法已经在 URL 中指明了参数,所以提交时没有数据。POST 方法提交的参数在请求体中

1.5.2响应报文

响应报文的开始行是状态行

状态行包括三项内容,即 HTTP 的版本,状态码以及解释状态码的简单短语

1.5.3 状态码

三位数字,标记请求处理过程中发生的情况

参考资料:HTTP 响应状态码 - HTTP | MDN

http协议状态码分类

类别原因短语

1xx

信息性状态码接收的请求正在处理
2xx成功状态码请求正常处理完毕
3xx重定向状态码需要进行附加操作以完成请求
4xx客户端错误状态码服务器无法处理请求
5xx服务器错误状态码服务器处理请求出错

http协议常用的状态码

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: 网关超时

扩展网络通信,两台主机之间通信

套接字Socket是进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间进行通信和数据交换,SocketAPI出现于1983年 BSD 4.2实现在建立通信连接的每一端,进程间的传输要有两个标志:IP地址和端口号,合称为套接字地址 socket address

- 客户机套接字地址定义了一个唯一的客户进程
- 服务器套接字地址定义了一个唯一的服务器进程

**套接字相关的系统调用:**

  • socket() 创建一个套接字
  • bind() 绑定IP和端口
  • listen() 监听
  • accept() 接收请求
  • connect() 请求连接建立
  • write() 发送
  • read() 接收
  • close() 关闭连接

我们可以使用 nc工具来模拟实验

扩展 网络通信,两台主机之间通信
 
yum  install  nc   -y
 
[root@localhost ~]#nc -l 8000
#主机1 在监听 8000 端口
 
[root@node2 ~]#nc 192.168.91.100 8000
#主机2 去访问  主机1(服务端)的8000 端口 就可以聊天了

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

HTTP服务器市场占有率统计

2.2 apache介绍和特点

20世纪90年代初,美国国家超级计算机应用中心NCSA开发,1995年开源社区发布apache

apache 名字来源,流传最广的解释是(也是最显而易见的):这个名字来自于一个事实:当Apache在1995年初开发的时候,它是由当时最流行的HTTP服务器NCSA HTTPd 1.3的代码修改而成的,因此是"一个修补的(a patchy)”服务器。然而,在Apache服务器官方网站的FAQ中是这么解释的:"Apache这个名字是为了纪念名为Apache的美洲原住民印第安人的一支,众所周知他们拥有高超的作战策略和无穷的耐性。”贝伦多夫说:"我选择阿帕奇这个名字是取其积极含义。阿帕奇族是最后一个屈服于美国政府的民族。当时我们担心大公司迟早会参与竞争并‘教化’这块最早的网络之地,所以在我看来,阿帕奇是个很好的名称,也有人说这个词一语双关-因为正如Apache(与"a patchy"谐音)的名字所表明的那样,他们确实是在给服务器打补丁。”

贝伦多夫:与瓦特比肩的巨人

apache官网: www.apache.org

软件基金会

  • ASF:apache software foundation

  • FSF:Free Software Foundation

apache 功能:
  • 提供http协议服务

  • 多个虚拟主机:IP、Port、FQDN

  • CGI:Common Gateway Interface,通用网关接口,支持动态程序

  • 反向代理

  • 负载均衡

  • 路径别名

  • 丰富的用户认证机制:basic,digest

  • 支持第三方模块

apache特性:
  • 高度模块化:core + modules

  • DSO:Dynamic Shared Object 动态加载/卸载

  • MPM:multi-processing module 多路处理模块

2.2.2 MPM三种工作模式

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

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

2.3.1 yum安装httpd

[root@localhost ~]#yum install httpd -y
#安装httpd服务
[root@localhost ~]#systemctl start httpd
#启用httpd服务
[root@localhost ~]#systemctl stop httpd
#停止httpd服务
[root@localhost ~]#systemctl restart httpd
#重启httpd服务
编译安装httpd

[root@localhost ~]#yum install gcc make pcre-devel openssl-devel expat-devel -y
#安装相关包
[root@localhost ~]#wget https://downloads.apache.org/apr/apr-1.7.4.tar.bz2
#下载源码
[root@localhost ~]#wget https://downloads.apache.org/apr/apr-util-1.6.3.tar.gz
#下载源码
[root@localhost ~]#wget https://downloads.apache.org/httpd/httpd-2.4.58.tar.bz2
#下载源码
[root@localhost ~]#ls
httpd-2.4.58.tar.bz2   apr-1.7.4.tar.bz2    apr-util-1.6.3.tar.gz
[root@localhost ~]#tar xf apr-1.7.4.tar.bz2 
[root@localhost ~]#tar xf apr-util-1.6.3.tar.gz 
[root@localhost ~]#tar xf httpd-2.4.58.tar.bz2 
[root@localhost ~]#ls
httpd-2.4.58   apr-1.7.4   httpd-2.4.58.tar.bz2  apr-1.7.4.tar.bz2
apr-util-1.6.3   apr-util-1.6.3.tar.gz
[root@localhost ~]#mv apr-1.7.4 httpd-2.4.58/srclib/apr
[root@localhost ~]#mv apr-util-1.6.3 httpd-2.4.58/srclib/apr/util
[root@localhost ~]#ls httpd-2.4.58/srclib/
apr  Makefile.in
脚本编译安装
#!/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

2.3.2 httpd-2.4 相关文件

配置文件:
  • /etc/httpd/conf/httpd.conf 主配置文件

  • /etc/httpd/conf.d/*.conf 子配置文件(优先级最高)

  • /etc/httpd/conf.d/conf.modules.d/ 模块加载的配置文件

检查配置语法:httpd -t 或 apache2 -t

指定服务器名 
[root@centos7 ~]#vim /etc/httpd/conf/httpd.conf

#ServerName www.example.com:80
#servername www.magedu.org
#设置域名。

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf 

服务单元文件:
  • /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

注意要重启httpd服务

2.3.4 CentOS 7 编译安装httpd 2.4

2.3.4.1编译说明和准备

APR:Apache portable Run-time libraries,Apache可移植运行库,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。在早期的Apache版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不同的平台调用不同的处理函数随着Apache的进一步开发,Apache组织决定将这些通用的函数独立出来并发展成为一个新的项目。这样,APR的开发就从Apache中独立出来,Apache仅仅是使用 APR而已。目前APR主要还是由Apache使用,由于APR的较好的移植性,因此一些需要进行移植的C程序也开始使用APR,开源项目:比如用于服务器压力测试的Flood loader tester,项目站点:Flood - The Apache HTTP Server Project

APR官网:Welcome! - The Apache Portable Runtime Project

说明:安装httpd-2.4,依赖于apr-1.4+, apr-util-1.4+

多说一句

Apache即阿帕奇是一款开源的、世界使用排名第一的Web服务器软件,其特点是简单高效、稳定安全所以被广泛应用于计算机技术的各个领域,但现在由于其抗并发性问题现在新公司大部分都使用Nginx代替。

yum安装apache

①yum安装与其他程序一样可以直接使用命令:yum install  httpd  -y。

②安装过程中注意查看提示信息,若无外网则需要配置本地yum源进行安装。

③出现以下提示即表示安装成功。注意:若出现error字样则表示安装出错!!!

​[root@centos1 ~]#rpm -q httpd
未安装软件包 httpd 
[root@centos1 ~]#yum install httpd -y
[root@centos1 ~]#systemctl start httpd
[root@centos1 ~]#

  yum安装默认的主配置文件位置: /etc/httpd/conf/httpd.conf

yum安装默认的主页面配置文件夹位置: /var/www/html/

yum安装默认的日志文件位置:/var/log/httpd/access_log  此为正常日志记录,/var/log/httpd/error此为错误日志记录。

3 httpd常见配置

3.1指定服务器名
 
[root@localhost ~]# httpd -t
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
Syntax OK
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
95 ServerName www.example.com:80
[root@localhost ~]# httpd -t
Syntax OK

3.2 include 子配置文件

指令

Include file-path|directory-path|wildcard

IncludeOptional file-path|directory-path|wildcard

说明:

  • Include和IncludeOptional功能相同,都可以包括其它配置文件

  • 但是当无匹配文件时,include会报错,IncludeOptional会忽略错误

include 子配置文件

查看总目录

[root@localhost ~]# grep -i serverroot /etc/httpd/conf/httpd.conf

3.3 监听地址
Listen [IP:]PORT

省略IP表示本机所有IP
listen指令至少一个,可重复出现多次


[root@localhost ~]#  grep -i listen /etc/httpd/conf/httpd.conf

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf

实验1:指明具体地址 

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf  主配置文件
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firewalld

实验2 添加虚拟网卡

root@localhost ~]# vim /etc/httpd/conf/httpd.conf 

[root@localhost ~]# grep -i include /etc/httpd/conf/httpd.conf

/etc/httpd/conf/httpd.conf 一些基础配置

[root@localhost ~]# grep -i "^[a-z]" /etc/httpd/conf/httpd.conf

3.4隐藏服务器版本信息
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
[root@localhost ~]# curl -I 192.168.11.12

在配置文件中添加语句 servertokens prod 

3.5持久连接

Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认开启持久连接

断开条件:

  • 时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级
  • 请求数量: 请求数达到指定值,也会断开

副作用:对并发访问量大的服务器,持久连接会使有些请求得不到响应

折衷:使用较短的持久连接时间

/etc/httpd/conf.d/*.conf 子配置文件   

下图test是自定义  .conf结尾就可以

[root@localhost html]# vim /etc/httpd/conf/test.conf



KeepAlive On|Off
KeepAliveTimeout 15      #连接持续15s,可以以ms为单位,默认值为5s
MaxKeepAliveRequests 500  #持久连接最大接收的请求数,默认值100

注意:在只配置文件中默认可能是9527,主配置文件二者皆可 

测试长连接(借用东哥)

一定自己动手做一些

[root@localhost html]#echo T > T
[root@localhost html]#echo T1 > T1
[root@localhost html]#echo T2 > T2
[root@localhost html]#ls
T  T1  T2
[root@localhost html]#vim /etc/httpd/conf.d/test.conf
 
 
KeepAlive On          #开启长连接    
KeepAliveTimeout 300      #连接持续300s,可以以ms为单位,默认值为5s   超时等待>时间
MaxKeepAliveRequests 2  #持久连接最大接收的请求数,默认值100    限制最大下载>资源
 
[root@localhost html]#systemctl restart httpd
[root@node2 ~]#curl 192.168.241.11/T
T
[root@node2 ~]#curl 192.168.241.11/T1
T1
[root@node2 ~]#curl 192.168.241.11/T2
T2
[root@node2 ~]#yum install telnet -y
 
 
[root@node2 ~]#telnet 192.168.241.11 80
Trying 192.168.241.11...
Connected to 192.168.241.11.
Escape character is '^]'.
GET /T HTTP/1.1
HOST:www.cxk.com
 
HTTP/1.1 200 OK
Date: Mon, 19 Feb 2024 10:50:05 GMT
Server: Apache
Last-Modified: Mon, 19 Feb 2024 10:26:49 GMT
ETag: "2-611b9880a133a"
Accept-Ranges: bytes
Content-Length: 2
 
T
GET /T1 HTTP/1.1
HOST:www.wyb.com
 
HTTP/1.1 200 OK
Date: Mon, 19 Feb 2024 10:50:19 GMT
Server: Apache
Last-Modified: Mon, 19 Feb 2024 10:26:53 GMT
ETag: "3-611b9884b7d6b"
Accept-Ranges: bytes
Content-Length: 3
 
T1
GET /T2 HTTP/1.1
HOST:www.xzq.com
 
HTTP/1.1 200 OK
Date: Mon, 19 Feb 2024 10:50:37 GMT
Server: Apache
Last-Modified: Mon, 19 Feb 2024 10:26:58 GMT
ETag: "3-611b9889c9f12"
Accept-Ranges: bytes
Content-Length: 3
Connection: close
 
T2
Connection closed by foreign host.
#连接被外部主机关闭
3.6 DSO (Dynamic Shared Object)

Dynamic Shared Object,加载动态模块配置,不需重启即生效动态模块所在路径: /usr/lib64/httpd/modules/

主配置 /etc/httpd/conf/httpd.conf 文件中指定加载模块配置文件

查看静态编译的模块:httpd -l

查看静态编译及动态装载的模块:httpd -M

[root@localhost html]# rpm -q httpd
httpd-2.4.6-99.el7.centos.1.x86_64
[root@localhost html]# httpd -M |grep basic
 auth_basic_module (shared)
[root@localhost html]# pwd
/var/www/html
[root@localhost html]# cd /etc/httpd
[root@localhost httpd]# ls
conf  conf.d  conf.modules.d  logs  modules  run
[root@localhost httpd]# cd conf.modules.d/
[root@localhost conf.modules.d]# ls
00-base.conf  00-dav.conf  00-lua.conf  00-mpm.conf  00-proxy.conf  00-systemd.conf  01-cgi.conf

[root@localhost conf.modules.d]# vim 00-base.conf

3.7 MPM (Multi-Processing Module)多路处理模块

httpd 支持三种MPM工作模式:prefork, worker, event

只能支持使用一种,不能一起使用

3.8 prefork模式相关的配置
StartServers       100
MinSpareServers   50
MaxSpareServers   80
ServerLimit     2560 #最多进程数,最大值 20000
MaxRequestWorkers    2560 #最大的并发连接数,默认256
MaxConnectionsPerChild  4000 #子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个
请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)
MaxRequestsPerChild 4000  #从 httpd.2.3.9开始被MaxConnectionsPerChild代替

可以将其写进子配置文件中 

3.9worker和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

3.10 定义Main server的文档页面路径
DocumentRoot   "/path”
<directory /path>
 Require all granted
</directory>
说明

DocumentRoot指向的路径为URL路径的起始位置

/path 必须显式授权后才可以访问
[root@localhost ~]#mkdir -p /data/html
[root@localhost ~]#vim /data/html/index.html
 
data\html
#随意输入即可。
 
[root@localhost ~]#vim /etc/httpd/conf.d/test.conf
 
DocumentRoot "/data/html"
<directory /data/html>
 Require all granted
</directory>
 
[root@localhost ~]#systemctl reload httpd
[root@localhost ~]#curl 192.168.80.7
data\html
[root@localhost ~]#cat /data/html/index.html 
data\html
 
#URL和磁盘路径的映射关系
http://HOST:PORT/index.html  --> /data/html/index.html
3.11别名:alias

设置别名访问

访问网站根目录下的 一个目录相当于访问 另一个目录

格式:

alias   /URL/    /PATH/

url:用户访问的路径
path:真实路径

3.12 定义站点默认主页面文件

[root@localhost html]# vim /etc/httpd/conf/httpd.conf

想连接把固定端口打开

没有整完
3.12虚拟主机

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

网站的唯一标识:

  • IP相同,但端口不同

  • IP不同,但端口均为默认端口

  • FQDN不同, IP和端口都相同

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

  • 基于ip:为每个虚拟主机准备至少一个ip地址

  • 基于port:为每个虚拟主机使用至少一个独立的port

  • 基于FQDN:为每个虚拟主机使用至少一个FQDN,请求报文中首部 Host:www.kgc.com

虚拟主机的三种实现方式:基于IP、基于端口、基于域名;

3.12.1 基于ip地址

基于ip地址

192.168.246.7 ---------> jd

192.168.246.8---------> taobao

[root@mcb-11-8 ~]#cd /etc/httpd/conf.d
root@mcb-11-8 conf.d]#cd /usr/share/doc/httpd-2.4.6/

[root@mcb-11-8 conf.d]#vim test.conf
[root@mcb-11-8 httpd-2.4.6]#mv test.conf /etc/httpd/conf.d/ 
[root@mcb-11-8 httpd-2.4.6]#cd /etc/httpd/conf.d/


[root@mcb-11-8 conf.d]#ls
autoindex.conf  README  test.conf  userdir.conf  welcome.conf

[root@mcb-11-8 conf.d]#vim /etc/httpd/conf/httpd.conf 

[root@mcb-11-8 opt]#mkdir html/{77,55}
[root@mcb-11-8 html]#echo iphone > 77/index.html
[root@mcb-11-8 html]#echo Coco > 55/index.html
[root@mcb-11-8 html]#cat 55/index.html
Coco
[root@mcb-11-8 html]#cat 77/index.html
iphone
[root@mcb-11-8 html]#ifconfig ens33:0 192.168.11.12/24

[root@mcb-11-8 conf.d]#systemctl restart httpd
检测

老师步骤:

[root@localhost html]#vim /etc/httpd/conf/httpd.conf 

[root@localhost html]#vim /etc/httpd/conf.d/test.conf 
[root@localhost html]#cd /usr/share/doc/httpd-2.4.6/
[root@localhost httpd-2.4.6]#ls
ABOUT_APACHE        httpd-languages.conf           LICENSE
CHANGES             httpd-manual.conf              NOTICE
httpd-dav.conf      httpd-mpm.conf                 proxy-html.conf
httpd-default.conf  httpd-multilang-errordoc.conf  README
httpd-info.conf     httpd-vhosts.conf              VERSIONING
[root@localhost httpd-2.4.6]#vim httpd-vhosts.conf 
[root@localhost httpd-2.4.6]#cd /opt
[root@localhost opt]#mkdir html
[root@localhost opt]#ls
blog  html  rh
[root@localhost opt]#mkdir html/{12,22}
[root@localhost opt]#cd html/
[root@localhost html]#ls
12  22
[root@localhost opt]#echo 12 > 12/index.html
[root@localhost opt]#echo 22 > 11/index.html
[root@localhost opt]#ifconfig ens33:0 192.168.241.12/24

3.12.2 基于端口地址

基于端口

192.168.246.7:80 ---------> jd

192.168.246.7:800--------> taobao

3.12.3 基于域名

访问www.lucky.com 相当于访问lucky

访问www.cloud.com 相当于访问cloud

3.12.4基于客户端IP地址实现访问控制
黑名单

不能有失败,至少有一个成功匹配才成功,即失败优先

浏览器检测

白名单

多个语句有一个成功,则成功,即成功优先

浏览器检测

4 Cookie和session

无状态协议是指协议对事物处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它应答就很快。

HTTP是超本文传输协议,顾名思义,这个协议支持超文本的传输。什么是超文本?说白了就是使用HTML编写的页面。通常,我们使用客户端浏览器访问服务器的资源,最常见的URL也是以html为后缀的文件,因此可以说超文本是网络上最主要的资源。

会话管理: 管理浏览器客户端和服务器端之间会话过程中产生的会话数据。

为了会话管理,HTTP就需要传输大量重复信息内容的问题,造成大量的网络带宽消耗。于是 Cookie 和Session 技术闪亮登场了,它们可以为用户进行会话管理,实现保存状态。

 Cookie

Cookie 又称"小甜饼”。类型为"小型文本文件”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。由网景公司的前雇员卢·蒙特利在1993年3月发明

因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。

Cookie就是用来绕开HTTP的无状态性的"额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

Cookie基于HTTP协议,也叫Web Cookie或浏览器Cookie,是服务器发送到用户浏览器并保存在客户端本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能。

Cookie用于以下三个方面:

会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)

个性化设置(如用户自定义设置、主题等)

浏览器行为跟踪(如跟踪分析用户行为等)

 cookie和session的比较:

cookie通常是在服务器生成,但也可以在客户端生成,session是在服务器端生成的

session 将数据信息保存在服务器端,可以是内存,文件,数据库等多种形式,cookie 将数据保存在客户端的内存或文件中

单个cookie保存的数据不能超过4K,每个站点cookie个数有限制,比如IE8为50个、Firefox为50个、Opera为30个;session存储在服务器,没有容量限制

cookie存放在用户本地,可以被轻松访问和修改,安全性不高;session存储于服务器,比较安全

cookie有会话cookie和持久cookie,生命周期为浏览器会话期的会话cookie保存在缓存,关闭浏览器窗口就消失,持久cookie被保存在硬盘,知道超过设定的过期时间;随着服务端session存储压力增大,会根据需要定期清理session数据

session中有众多数据,只将sessionID这一项可以通过cookie发送至客户端进行保留,客户端下次访问时,在请求报文中的cookie会自动携带sessionID,从而和服务器上的的session进行关联

cookie缺点:

① 使用cookie来传递信息,随着cookie个数的增多和访问量的增加,它占用的网络带宽也很大,试想假如cookie占用200字节,如果一天的PV有几个亿,那么它要占用多少带宽?

② cookie并不安全,因为cookie是存放在客户端的,所以这些cookie可以被访问到,设置可以通过插件添加、修改cookie。所以从这个角度来说,我们要使用sesssion,session是将数据保存在服务端的,只是通过cookie传递一个sessionId而已,所以session更适合存储用户隐私和重要的数据

session 缺点:

①不容易在多台服务器之间共享,可以使用session绑定,session复制,session共享解决

② session存放在服务器中,所以session如果太多会非常消耗服务器的性能cookie和session各有优缺点,在大型互联网系统中,单独使用cookie和session都是不可行的

5 Web相关工具

curl:文字浏览器

curl是基于URL语法在命令行方式下工作的文件传输工具,

它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。

curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证, 下载文件断点续传,上载文件断点续传, http代理服务器管道( proxy tunneling),还支持IPv6,socks5代理服务器,通过http代理服务器上传文件到FTP服务器等,功能十分强大

格式:

curl   [options]   [URL...]

选项:
-A/--user-agent <string> 设置用户代理发送给服务器
-e/--referer <URL> 来源网址
--cacert <file> CA证书 (SSL)
-k/--insecure   允许忽略证书进行 SSL 连接
--compressed 要求返回是压缩的格式
-H/--header "key:value” 自定义首部字段传递给服务器
-i 显示页面内容,包括报文首部信息
-I/--head 只显示响应报文首部信息
-D/--dump-header <file>将url的header信息存放在指定文件中
--basic 使用HTTP基本认证
-u/--user <user[:password]>设置服务器的用户和密码
-L   如果有3xx响应码,重新发请求到新位置
-O 使用URL中默认的文件名保存文件到本地
-o <file> 将网络文件保存为指定的文件中
--limit-rate <rate> 设置传输速度
-0/--http1.0 数字0,使用HTTP 1.0
-v/--verbose 更详细
-C 选项可对文件使用断点续传功能
-c/--cookie-jar <file name> 将url中cookie存放在指定文件中
-x/--proxy <proxyhost[:port]> 指定代理服务器地址
-X/--request <command> 向服务器发送指定请求方法
-U/--proxy-user <user:password> 代理服务器用户和密码
-T 选项可将指定的本地文件上传到FTP服务器上
--data/-d 方式指定使用POST方式传递数据
-s --silent   Silent mode
-b name=data 从服务器响应set-cookie得到值,返回给服务器
-w <format> 显示相应的指定的报文信息,如:%{http_code},%{remote_ip}等
-m, --max-time <time> 允许最大传输时间
①网页不让访问,冒充浏览器去访问 
② 提取状态码
[root@centos1 ~]#curl -s -I -m10 -o /dev/null ? -w %{http_code} http://www.google.com/
③提取远端ip
[root@centos1 ~]#curl -s -I -m10 -o /dev/null   -w %{remote_ip} http://www.baidu.com/


google浏览器不行
 ④提取本机ip 
[root@centos1 ~]#curl -s -I -m10 -o /dev/null ? -w %{local_ip} http://www.baidu.com/
⑥远程端口
[root@localhost ~]# curl -s -I -m10 -o /dev/null ? -w %{remote_port} http://www.baidu.com/

⑦提取本地端口

[root@localhost ~]# curl -s -I -m10 -o /dev/null   -w %{local_port} http://www.baidu.com/

5.3压力测试工具

httpd的压力测试工具:

  • ab, webbench, http_load, seige

  • Jmeter 开源

  • Loadrunner 商业,有相关认证

  • tcpcopy:网易,复制生产环境中的真实请求,并将之保存

ab 来自httpd-tools包

#yum install httpd-tools -y

命令格式:

ab  [OPTIONS]  URL

选项:

-n:总请求数
-c:模拟的并发数
-k:以持久连接模式测试

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值