Linux之web服务器

目录

www简介

常见Web服务程序介绍

服务器主机

主要数据

浏览器

网址及HTTP简介

URL

http请求方法

状态码

MIME(Multipurpose Internet Mail Extension)

www服务器的类型

静态网站

动态网站

Apache服务的搭建

Apache的安装

准备工作

httpd所需文件目录

主配置文件 

案例

       案例1 ---  快速搭建网站

        案例2 --- 替换网页目录

        案例3 --- 搭建一个个人用户主页功能网站,实现通过身份验证功能来访问数据

案例4 ---  网页验证密码登录


www简介

        Web网络服务也叫WWW(World Wide Web 全球信息广播)万维网服务,一般是指能够让用户通过浏览器访问到互联网中文档等资源的服务

        Web 网络服务是一种被动访问的服务程序,即只有接收到互联网中其他主机发出的请求才会响应,最终用于提供服务程序的 Web 服务器会通过 HTTP(超文本传输协议)或HTTPS(安全超文本传输协议)把请求的内容传送给用户

image-20221016093613033

常见Web服务程序介绍

        Windows系统中默认Web服务程序是I I S(Internet Information Services),这是一款图形化的网站管理工具,IIS程序不光能提供Web网站服务,还能够提供FTP、NMTP、SMTP等服务功能,但只能在Windows系统中使用

image-20221016093928162

        2004 年 10 月 4 日,为俄罗斯知名门户站点而开发的 Web 服务程序 Nginx 横空出世。Nginx程序作为一款轻量级的网站服务软件,因其稳定性和丰富的功能而快速占领服务器市场,但Nginx 最被认可的还当是低系统资源占用、内存少且并发能力强,因此得到了国内诸如新浪、网易、腾讯等门户站的青睐

image-20221016094123540

        Apache --- 取自美国印第安人土著语Apache,寓意着拥有高超的作战策略和无穷的耐性,由于其跨平台和安全性广泛被认可且拥有快速、可靠、简单的API扩展。目前拥有很高的Web服务软件市场占用率,全球使用最多的Web服务软件,开源、跨平台(可运行于Unix,linux,windows中)

image-20221016094238292

        Tomcat --- 属于轻量级的Web服务软件,一般用于开发和调试JSP代码,通常认为Tomcat是Apache的扩展程序

服务器主机

        网站 --- 是由域名网页源程序主机空间组成的,其中主机空间则是用于存放网页源代码并能够将网页内容展示给用户,如果您想要在互联网中搭建网站并被顺利访问,主机空间一定不能选错

image-20221016094514122

         虚拟主机 --- 在一台服务器中分出一定的磁盘空间供用户放置网站、存放数据等,仅提供基础的网站访问、数据存放与传输流量功能,能够极大的降低用户费用,也几乎不需要管理员维护除网站数据以外的服务,适合小型网站

        VPS(Virtual Private Server) --- 在一台服务器中利用OpenVZ、Xen或KVM等虚拟化技术模拟出多个“主机”,每个主机都有独立的IP地址、操作系统,实现不同VPS之间磁盘空间、内存、CPU资源、进程与系统配置间的完全隔离,管理员可自由使用分配到的主机中的所有资源,所以需要有一定的维护系统的能力,适合小型网站

        云服务器(ECS) --- 是一种整合了计算、存储、网络,能够做到弹性伸缩的计算服务,其使用起来与VPS几乎一样,但差别是云服务器建立在一组集群服务器中,每个服务器都会保存一个主机的镜像(备份),大大的提升了安全稳定性,另外还具备了灵活性与扩展性,用户只需按使用量付费的即可,适合大中小型网站 ​​​

        独立服务器 --- 这台服务器仅提供给您使用,详细来讲又可以区分为租用方式与托管方式

                租用方式 --- 用户只需将硬件配置要求告知IDC服务商,服务器硬件设备由机房负责维护,运维管理员一般需要自行安装相应的软件并部署网站服务,租期可以为月、季、年,减轻了用户初期对硬件设备的投入,适合大中型网

                托管方式 --- 用户需要自行购置服务器后交给IDC服务供应商的机房进行管理(缴纳管理服务费用),用户对服务器硬件配置有完全的控制权,自主性强,但需要自行维护、修理服务器硬件设备,适合大中型网站

主要数据

        服务器所提供的最主要数据是超文本标记语言(Hyper Text Markup Language,HTML)、多媒体文件(图片、影像、声音、文字等,都属于多媒体或称为超媒体),HTML只是一些纯文本数据,通过所谓的标记来规范所要显示的数据格式

浏览器

        客户端收到服务器的数据之后需要软件解析服务器所提供的数据,最后将效果呈现在用户的屏幕上

网址及HTTP简介

        web服务器提供的这些数据大部分都是文件,那么我们需要在服务器端先将数据文件写好,并且放置在某个特殊的目录下面,这个目录就是我们整个网站的首页,在redhat中,这个目录默认在 /var/www/html

        浏览器是通过你在地址栏中输入你所需要的网址来取得这个目录的数据的

URL

        Uniform Resource Locator,统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址

        网址格式 --- <协议>://<主机或主机名>[:port]/<目录资源,路径>**

        协议 --- http、https、ftp等

        主机地址或者主机名 --- 主机地址就是服务器在因特网所在的IP地址。如果是主机名的话,那么就需要域名解析了

        端口号(port) --- http为80,https为443 (IANA:互联网数字分配机构)

                0-1023 --- 永久地分配给固定的应用程序使用

                1024-41951 --- 注册端口,但要求不是特别严格,分配给程序注册为某应用使用

                41952-60000 --- 客户端程序随机使用的端口,动态端口,或私有端口

http请求方法

        在http通信中,每个http请求报文都包含一个方法,用以告诉web服务器端需要执行哪些具体的动作,这些动作包括:获取指定web页面、提交内容到服务器、删除服务器上资源文件等

状态码

        1xx:指示信息  --- 表示请求已接收,继续处理

        2xx:成功 --- 表示请求已被成功接收、理解、接受

        3xx:重定向 --- 要完成请求必须进行更进一步的操作

        4xx:客户端错误 --- 请求有语法错误或请求无法实现

        5xx:服务器端错误 --- 服务器未能实现合法的请求

常见状态代码、状态描述的说明如下:

        200 OK --- 客户端请求成功

        400 Bad Request --- 客户端请求有语法错误,不能被服务器所理解

        401 Unauthorized --- 请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用

        403 Forbidden --- 服务器收到请求,但是拒绝提供服务

        404 Not Found --- 请求资源不存在,举个例子:输入了错误的URL

        500 Internal Server Error --- 服务器发生不可预期的错误

        503 Server Unavailable --- 服务器当前不能处理客户端的请求,一段时间后可能恢复正常

MIME(Multipurpose Internet Mail Extension)

        MIME(Multipurpose Internet Mail Extension,多用途因特网邮件扩展)最初是为了解决在不同的电子邮件系统之间搬移报文时存在的问题。后来http也支持了这个功能,用它来描述数据并标记不同的数据内容类型

        当web服务器响应http请求时,会为每一个http对象数据加一个MIME类型。当web浏览器获取到服务器返回的对象时,会去查看相关的MIME类型,并进行相应的处理

MIME类型

文件类型

text/html

html、htm、shtml文本类型

text/css

css文本类型

text/xml

xml文本类型

image/gif

gif图像类型

image/jpeg

jpeg、jpg图像类型

application/javascript

js文本类型

text/plain

txt文本类型

application/json

json文本类型

video/mp4

mp4视频类型

video/quicktime

mov视频类型

video/x-flv

flv视频类型

video/x- 

wmv视频类型

video/x-msvideo

avi视频类型

www服务器的类型

静态网站

        仅提供用户浏览的单向静态网页,单纯是由服务器单向提供数据给客户端,Server不需要与client端有互动,可以浏览网站,但是无法数据上传

动态网站

        该站可以让服务器与用户互动,常见的例如留言板,博客。这种类型的网站需要通过“网页程序语言”来实现与用户互动的行为。常见的例如:PHP网页程序语言,配合数据库系统来进行数据的读、写。当你在向服务器请求数据时,其实是通过服务器端同一个网页程序在负责将数据读出或写入数据库,变动的是数据库的内容,网页程序并没有任何改变

        另外一种交互式的动态网页主要是在客户端实现。服务端将可执行的程序代码(JavaScript)传送给客户端,客户端的浏览器如果提供JavaScript的功能,那么该程序就可以在客户端的计算机上面工作了;另外一种可在客户端执行的就是flash动画格式,在这种动画格式内还可以进行程序设计

        搭建动态网站的需求 --- LAMP(Linux+Apache+MySQL+PHP)

Apache服务的搭建

Apache的安装

[root@localhost ~]# yum install httpd -y

准备工作

[root@localhost ~]# setenforce 0

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# systemctl disable firewalld

[root@localhost ~]# systemctl start httpd # 启动httpd

[root@localhost ~]# systemctl enable httpd # 设置开机启动

[root@localhost ~]# setenforce 0 #暂时关闭selinux

[root@localhost ~]# systemctl status httpd # 查看httpd状态,q键退出查看

httpd所需文件目录

服务目录:/etc/httpd
主配置文件:/etc/httpd/conf/httpd.conf
网页数据目录:/var/www/html
网站访问日志:/var/log/httpd/access_log
错误日志:/var/log/httpd/error_log  

主配置文件 

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf 
34 ServerRoot "/etc/httpd"   # 服务目录
46 #Listen 12.34.56.78:80   # 设置监听的IP地址及端口
47 Listen 80    # 默认开启监听端口为80
61 Include conf.modules.d/*.conf  # 加载额外配置文件
71 User apache  # 运行服务的用户
72 Group apache # 运行服务的工作组
91 ServerAdmin root@localhost  # 管理者的邮箱
100 #ServerName www.example.com:80  # 设置域名及端口号,必须要有域名解析

107 <Directory />  # <> 表示起始标志,</>  表示结束标志
# 设置目录的权限,,当浏览器中输入URL地址后,若访问服务器某目录下的某个文件,必须要设置其权限,保证数据的安全性
# AllowOverride :是否允许权限覆盖,如果有额外的权限文件,是否允许额外文件来对当前Directory进行权限覆写
108     AllowOverride none   # 不允许覆盖 
109     Require all denied  # 禁止所有来源访问文件或目录
        # Require all granted   允许所有来源访问
110 </Directory>



124 DocumentRoot "/var/www/html"  # 重点,网页存放的默认目录
129 <Directory "/var/www">  # 设置网页目录的权限,与DocumentRoot搭配使用
130     AllowOverride None
131     # Allow open access:
132     Require all granted
133 </Directory>

案例

       案例1 ---  快速搭建网站

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

[root@localhost ~]# echo "welcome to www.baidu.com" > /var/www/html/index.html # 写入网页数据

[root@localhost ~]# systemctl restart httpd

# 打开虚拟机的火狐浏览器输入127.0.0.1测试

# 或者推过curl命令查看网站的网页数据,验证网站是否能访问
[root@localhost ~]# curl 127.0.0.1

        案例2 --- 替换网页目录

新建网页存储目录

[root@localhost /]# mkdir /web1

创建index.html文件

[root@localhost web1]# vim index.html
Welcome to Apache
编辑上述内容

修改配置文件

[root@localhost web1]# vim /etc/httpd/conf/httpd.conf
# 定位第124行。修改如下:
DocumentRoot "/web1"

# 定位第129行,修改如下:
<Directory "/web1">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

重启服务

[root@localhost web1]# systemctl restart httpd

测试

注意:

        要关闭selinux 

[root@localhost conf.d]# setenforce 0

        案例3 --- 搭建一个个人用户主页功能网站,实现通过身份验证功能来访问数据

         如果想在系统中为每一位用户建立一个独立的网站,通常使用基于虚拟主机的功能来创建部署多个网站,但这个工作会让管理者苦不堪言,尤其是用户数据量很大的情况时,而且用户自行管理网站时,还会碰到权限限制,需要为此做很多额外的工作,其实,httpd服务程序提供的个人主页功能可以完全胜任此工作,该功能可以让系统内所有用户在自己的家目录中管理个人网站,且访问也非常容易

 准备工作

# 关闭selinux和firewalld软件

[root@localhost ~]# yum  install  httpd  -y

[root@localhost ~]# systemctl  start  httpd

[root@localhost ~]# systemctl  enable   httpd

编辑httpd目录中 == 用户主页配置 == 文件(不是httpd.conf

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

    #UserDir disabled  # 增加注释#,默认为关闭状态,增加注释表示开启功能
   	UserDir public_html  # 取消注释#,即开启用户家目录功能,表示网站数据存储在/home/普通账户名/public_html中

创建2个用户

[root@localhost ~]# useradd t1
[root@localhost ~]# passwd t1
更改用户 t1 的密码 。
新的密码:              # 密码:123456
无效的密码: 密码少于 8 个字符
重新输入新的密码: 
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# useradd t2
[root@localhost ~]# passwd t2
更改用户 t2 的密码 。
新的密码:            # 密码:654321
无效的密码: 密码少于 8 个字符
重新输入新的密码: 
passwd:所有的身份验证令牌已经成功更新。

切换到普通用户 ,进入家目录,新建存储网站数据的public_html,并设置权限

[root@localhost /]# su t1
[t1@localhost /]$ cd ~    # 进入t1的家目录
[t1@localhost ~]$ pwd
/home/t1
[t1@localhost ~]$ mkdir public_html    # 新建存储网站数据的目录
[t1@localhost ~]$ ls
public_html
[t1@localhost ~]$ cd public_html/
[t1@localhost public_html]$ vim index.html #创建文件并并写数据
This is t1

[t1@localhost ~]$ chmod -Rf 755 /home/t1    # 设置权限
[t1@localhost ~]$ ll 

[t1@localhost ~]$ su t2
Password: 
[t2@localhost t1]$ cd ~
[t2@localhost ~]$ mkdir public_html
[t2@localhost ~]$ cd public_html/
[t2@localhost public_html]$ vim index.html
[t2@localhost public_html]$ cat index.html
This is t2
[t2@localhost public_html]$ chmod -Rf 755 /home/t2
[t2@localhost public_html]$ cd ..
[t2@localhost ~]$ ll
total 0
drwxr-xr-x. 2 t2 t2 24 Aug 30 19:11 public_html
[t2@localhost ~]$ 

[t2@localhost ~]$ su root #切换回管理员
Password: 
[root@localhost t2]# cd ~

重启服务

[root@localhost ~]# systemctl restart httpd

未报错,则重启成功

测试

192.168.149.128/~t1
192.168.149.128/~t2

案例4 ---  网页验证密码登录

准备工作

# 恢复之前配置文件中的配置

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

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

# 关闭selinux和firewalld软件

[root@localhost ~]# setenforce 0

[root@localhost ~]# systemctl stop firewalld

搭建网站,设置密码访问控制

[root@localhost ~]# cd /
[root@localhost /]# mkdir -p /www/zy
[root@localhost /]# htpasswd -c /etc/httpd/paszy t1
New password: 
Re-type new password:     # 123456
Adding password for user t1
[root@localhost /]# htpasswd  /etc/httpd/paszy t2     不能加-c
New password: 
Re-type new password:     # 654321
Adding password for user t2
[root@localhost /]# 

编辑文件配置

[root@localhost /]# vim /etc/httpd/conf/httpd.conf #编辑主配置文件
DocumentRoot "/www/zy"   # 设置网页启动目录

<Directory "/www/zy">    # 设置网页启动目录的访问权限
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

<Directory  "/www/zy">  
        authuserfile  /etc/httpd/pszy
        authname  "My  privately website"
        authtype  basic
        require   user  t1 t2
</Directory>

重启服务

[root@localhost /]# systemctl restart httpd

测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/99802.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android RecyclerView 之 列表宫格布局的切换

前言 RecyclerView 的使用我就不再多说&#xff0c;接下来的几篇文章主要说一下 RecyclerView 的实用小功能&#xff0c;包括 列表宫格的切换&#xff0c;吸顶效果&#xff0c;多布局效果等&#xff0c;今天这篇文章就来实现一下列表宫格的切换&#xff0c;效果如下 一、数据来…

大数据之Maven

一、Maven的作用 作用一&#xff1a;下载对应的jar包 避免jar包重复下载配置&#xff0c;保证多个工程共用一份jar包。Maven有一个本地仓库&#xff0c;可以通过pom.xml文件来记录jar所在的位置。Maven会自动从远程仓库下载jar包&#xff0c;并且会下载所依赖的其他jar包&…

uniapp项目实践总结(六)自定义顶部导航栏

本篇主要讲述如何自定义顶部导航栏,有时候默认导航栏不足以满足我们的需求,这时候就需要自定义导航栏来解决这个问题。 目录 默认导航修改配置自定义顶部默认导航 自带的默认顶部导航设置的内容有限,不容易扩展修改,因此如果有更加个性化的需求,则需要自定义顶部导航。 …

QT基础使用:组件和代码关联(信号和槽)

自动关联 ui文件在设计环境下&#xff0c;能看到的组件可以使用鼠标右键选择“转到槽”就是开始组件和动作关联。 在自动关联这个过程中软件自动动作的部分 需要对前面头文件进行保存&#xff0c;才能使得声明的函数能够使用。为了方便&#xff0c;自动关联时先对所有文件…

Windows如何部署Redis

一、简介 Redis (Remote Dictionary Server) 是一个由意大利人 Salvatore Sanfilippo 开发的 key-value 存储系统&#xff0c;具有极高的读写性能&#xff0c;读的速度可达 110000 次/s&#xff0c;写的速度可达 81000 次/s 。 二、下载 访问 https://github.com/tporadows…

IDEA集成Git相关操作知识(pull、push、clone)

一&#xff1a;集成git 1&#xff1a;初始化git&#xff08;新版本默认初始化&#xff09; 老版本若没有&#xff0c;点击VCS&#xff0c;选中import into Version Controller中的Create git Repository(创建git仓库)&#xff0c;同理即可出现git符号。 也可查看源文件夹有没有…

Apifox-比postman更优秀的接口自动化测试平台

一、Apifox介绍 Apifox 是 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台&#xff0c;定位 Postman Swagger Mock JMeter。通过一套系统、一份数据&#xff0c;解决多个系统之间的数据同步问题。只要定义好 API 文档&#xff0c;API 调试、API 数据 Mock、AP…

【Cortex-M3权威指南】学习笔记4 - 异常

目录 实现 CM3流水线CM3 详细框图CM3 总线接口总线连接模板 异常异常类型优先级定义优先级组 向量表中断输入于挂起NMI中断挂起 Fault 类异常总线 faults存储器管理 faults用法 faults SVC 与 PendSV 实现 CM3 流水线 CM3 处理器使用 3 级流水线&#xff0c;分别是&#xff1a;…

ERROR(IMPSP-365) innovus加endcap失败问题解析

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 ERROR(IMPSP-365)&#xff1a;Design has inst with SITE (xx_site)&#xff0c;but the floorplan has no rows defined for this site.Any location for such instance will …

jsch网页版ssh

使用依赖 implementation com.jcraft:jsch:0.1.55Server端代码 import com.jcraft.jsch.Channel; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import java.io.InputStream; import java.io.OutputStream; import java.util.concurrent.TimeUnit; import o…

【状态估计】基于UKF法、AUKF法、EUKF法电力系统三相状态估计研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

在k8s中用label控制Pod部署到指定的node上

案例-标注k8s-node1是配置了SSD的节点 kubectl label node k8s-node1 disktypessd 查看标记 测试 将pod部署到disktypessd的节点上&#xff08;这里设置了k8s-node1为ssd&#xff09; 部署后查看结果-副本全都运行在了k8s-node1上—符合预期 删除标记 kubectl label node k8…

Linux 进程基础概念-进程状态、进程构成、进程控制

Linux 进程 参考&#xff1a; 「linux操作系统」进程的切换与控制到底有啥关系&#xff1f; - 知乎 (zhihu.com)&#xff0c;Linux进程解析_deep_explore的博客-CSDN博客&#xff0c;腾讯面试&#xff1a;进程的那些数据结构 - 知乎 (zhihu.com)&#xff0c;如何在Linux下的进…

算法通过村第四关-栈黄金笔记|表达式问题

文章目录 前言1. 计算器问题2. 逆波兰表达式问题 总结 前言 提示&#xff1a;快乐的人没有过去&#xff0c;不快乐的人除了过去一无所有。 --理查德弗兰纳根《深入北方的小路》 栈的进阶来了&#xff0c;还记得栈的使用场景吗&#xff1f;表达式和符号&#xff0c;这不就来了 1…

【LeetCode-中等题】437. 路径总和 III

文章目录 题目方法一&#xff1a;迭代层序 每层节点dfs 维护一个count变量 题目 方法一&#xff1a;迭代层序 每层节点dfs 维护一个count变量 思路&#xff1a; 层序遍历每一个节点遍历一个节点就对这个节点进行dfsdfs的同时&#xff0c;维护一个count变量&#xff0c;并且…

ARDUINO STM32 SSD1306

STM32F103XX系列SPI接口位置 在ARUDINO 下&#xff0c;&#xff08;不需要设置引脚功能&#xff0c;不需要开启时钟设置&#xff0c;ARDUINO已经帮我们处理了&#xff09; stm32f103c6t6 flash不足&#xff0c;不足以运行U8G2,产生错误 改用U8X8&#xff0c;后将字体改为u8x8_…

Ubuntu 22.04安装 —— Win11 22H2

目录 Ubuntu使用下载UbuntuVmware 安装图示安装步骤图示 Ubuntu使用 系统环境&#xff1a; Windows 11 22H2Vmware 17 ProUbutun 22.04.3 Server Ubuntu Server documentation | Ubuntu 下载 Ubuntu 官网下载 建议安装长期支持版本 ——> 可以选择桌面版或服务器版(仅包…

基于侏儒猫鼬算法优化的BP神经网络(预测应用) - 附代码

基于侏儒猫鼬算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于侏儒猫鼬算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.侏儒猫鼬优化BP神经网络2.1 BP神经网络参数设置2.2 侏儒猫鼬算法应用 4.测试结果&#xff1a;5…

基于JAVAEE技术的ssm校园车辆管理系统源码和论文

基于JAVAEE技术的ssm校园车辆管理系统源码和论文105 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 1.选题背景和意义 背景&#xff1a; 随着第二次工业革命后&#xff0c;内燃机的发明与完善&#xff0c;解…

原生js实现轮播图及无缝滚动

我这里主要说轮播图和无缝滚动的实现思路&#xff0c;就采用最简单的轮播图了&#xff0c;当然实现的思路有很多种&#xff0c;我这也只是其中一种。 简单轮播图的大概结构是这样的&#xff0c;中间是图片&#xff0c;二边是箭头可以用来切换图片&#xff0c;下面的小圆点也可以…