首先鸣谢MDN网站,MDN是学习前端的技术文档网站。对http的阐述是最权威的,本博客内容经过了该网站的学习。
阅读本文你将会了解:
- http的概念
- 典型的 HTTP会话是如何建立的及http的报文
- 如何在linux系统中搭建http服务
- Http协议文件系统
- Http静态界面
http的概念
服务
我们这里指的是:在电脑操作系统的后台运行,为其他电脑或者本系统提供某种特定功能的一给或者多个程序。
web服务
web服务器即网站服务器,web服务指驻留在因特网上的某组类型的程序。web服务器可向web客户端(常见如火狐浏览器)提供文档,媒体浏览,文件下载等服务。这里我基于最流行的web服务器apache-httpd-sever。
http概述
首先HTTP是一个应用层协议,用于指定传输超媒体文档如HTML的规则。然后作为C/S模型程序它运行在Web服务器和Web浏览器上,是为了它们之间的通行而设计的。
在C/S模型中,通常是客户端也就是Web浏览器向服务端也就是Web服务器发起请求。一个完整的Web文档通常是由不同的子文档拼接而成的,如某个页面=文本+布局描述+图片+视频+脚本。
所以请求一个网页,其实历经了Web浏览器都要向Web服务器为多个资源发起多个请求的过程。这一点可以在浏览器中按F12在开发者模式一下查看网络监视器来佐证。
在HTTP中,访问一个网页所请求的这些内容,无论是文本还是图片,或者是多媒体等等,都被称为资源。如何区分这些资源呢, 我们用URI来区分,我们最常用的是URL(统一资源定位符,也叫web地址),与之相对应的一种不常用的叫URN【如《1894》=urn:isbn:9780141036144】。
URL的语法
- 协议:告诉浏览器使用何种协议。常见如http,https,mailto: 打开邮件客户端;ftp:处理文件传输。
- 主机名或地址:用一个域名地址或者IP地址来标识向谁请求:如www.baidu.com。
- :端口:表示用于访问 Web 服务器的哪个端口,如果用HTTP协议的标准端口(HTTP为80,HTTPS为443)授予对其资源的访问权限,则通常省略此部分。
- 目录资源,路径:表示Web 服务器上资源的路径。现在,它主要是由没有任何物理实体的 Web 服务器抽象处理而成的。
- 查询:是提供Web服务器上的一些额外参数,由一些键值对组成,用&分隔。
- 片段: #SomewhereInTheDocument 是资源本身的某一部分的一个锚点。命名锚记像一个迅速定位器一样是一种页面内的超级链接,运用相当普遍。
典型的 HTTP会话是如何建立的及http的报文
HTTP 协议会话的建立分为三个阶段:
客户端建立一条 TCP 连接(如果传输层不是 TCP,也可以是其他适合的连接)。
客户端发送请求并等待应答。
服务器处理请求并送回应答,回应包括一个状态码和对应的数据。
建立连接
想建立http会话,则需要基于传输层协议,通常是TCP。
TCP链接通常是客户端发起的,经过TCP三次握手建立连接。
Http/1.1后完成一次http会话后tco可以不必端口,客户端可以想服务端反复重复请求动作。
发送客户端请求
一旦连接建立,用户代理就可以发送请求。
请求报文的语义是可读的:由一系列文本指令组成,并以回车分隔,它们被划分为三个块:
-
第一行包括请求方法及请求参数:
请求方法【空格】 URL中的路径【空格】使用的 HTTP 协议版本
常见的请求方法如下表:
-
接下来每一行都表示一个 HTTP 首部,为服务器提供关于所需数据的信息(例如语言,或 MIME类型),或是一些改变请求行为的数据(例如当数据已经被缓存,就不再应答)。这些 HTTP 首部组成以一个空行结束的一个块。
-
最后一行是空格把首部与数据块分隔开。
服务器响应
一旦服务器收到客户端请求,就会给客户端发送一个响应报文。
同样的,响应报文也是高度可读的。它包括如下内容
-
第一行包括请求状态和参数
协议版本【空格】状态码【空格】状态描述
我们最关心的事情当然是向服务请求后收到服务器的响应结果,无论是成功还是失败我们总需要知道这样一个结果。当然服务器的响应不止成功或失败两个结果,状态码就是标识服务器响应的不同结果的。
-
接下来的行,提示发送数据的一些信息。与客户端请求的头部块类似,这些 HTTP 首部组成一个块,并以一个空行结束。
-
最后一行空行 表示我下面内容都是你看不懂的数据哟
搭建http服务
将光盘挂载到/mnt下,然后配置yum仓库获取/mnt下的软件
[root@localhost mnt] vim /etc/yum.repos.d/base.repo
[base]
name=base
baseurl=file:///mnt
gpgcheck=0
安装及启用
[root@localhost mnt]yum install httpd -y
[root@localhost mnt]rpm -qa | grep httpd #rpm是检查已安装软件的命令
[root@localhost mnt]systemctl start httpd.serviceJob #systemctl是开启关闭查看控制服务等操作的命令
#考虑访问限制等因素,这里将防火墙和service关闭
[root@localhost ztx]systemctl stop firewalld.service
[root@localhost ztx]setenforce 0
Http协议文件系统
成功启用后,你已可以在局域网中成功访问你的服务器网页。
/etc/httpd文件介绍
├── conf ---------------------------------------------------=confgure 主配置目录
│ ├── httpd.conf
│ └── magic
├── conf.d-------------------------------------------------=额外参数文件
│ ├── autoindex.conf
│ ├── README
│ ├── userdir.conf
│ └── welcome.conf======欢迎页面
├── conf.modules.d--------------------------------------=模块配置目录 额外功能
│ ├── 00-base.conf
│ ├── 00-dav.conf
│ ├── 00-lua.conf
│ ├── 00-mpm.conf
│ ├── 00-proxy.conf
│ ├── 00-systemd.conf
│ └── 01-cgi.conf
├── logs -> …/…/var/log/httpd--------------------------=日志/其真实路径在
├── modules -> …/…/usr/lib64/httpd/modules------=模块/其真实路径在
└── run -> /run/httpd------------------------------------=运行后会留存的文件
/var/www/
[root@localhost www]# ll
total 0
drwxr-xr-x. 2 root root 6 Jan 8 2018 cgi-bin 通用网关接口-动态网页的
drwxr-xr-x. 2 root root 24 Mar 16 03:54 html 静态界面
- /etc/httpd/conf/httpd.conf 主要的配置文件 。
- SeverRoot “/etc/http” 服务的根目录位置。
- Listen 80 监听端口,通过80端口接受请求信息
- Iclude conf.modules.d/*.conf 指定模块文件也包含了哪些文件(模块)
- User apache
- Group apache 服务的用户/用户的组,在启动服务时通常以root身份,然后转换身份,这样增加系统安全 - Group apache
- ServerAdmin root@localhost 服务管理员地址,通常设置成邮件的地址
- #ServerName 域名/IP :80 初始是被注释状态,指定我们访问服务的名称
- <.Directory /> AllowOverride none Require all denied </Directory.> 目录为根,<>为起始标志,</>为结束标志
不允许这个目录(/)下的访问控制文件来改变这里的配置,这也意味着不用查看这个目录下的访问控制文件。 拒绝访问根- DocumentRoot “var/www/html” 指定文本根目录 网站根目录/网站首页
- <.Directory “/var/www”> AllowOverride None Require all granted </Directory.> 允许这个目录访问
- Options Indexes FollowSymLinks 链接到其他文件
- DirectoryIndex index.html 目录链接的网页文件名
- 拒绝了 .ht*文件(通常是密码等的隐藏文件)
- ErrorLog “Logs/error_log” 错误日志的目录
- LogLevel warn 警告级别 日志警告
- LogFormat 日志的时间标准和格式
- CustomLog “logs/acces_log” 访问日志目录 访问的过程
- ScripAlias 通用网关接口目录 动态网页
- <.IfModule mime_module3> 多用途互联网邮件扩展模块 类似插件
- EnableSendfile on 支持文件共享
- IncludeOptional conf.d/*.conf 加载辅助配置文件 这行在353 比较著名
总结一下conf由三部分组成:全局环境,主服务器环境,虚拟主机
-
/etc/httpd/conf.d/*.conf 额外的参数文件。
如果你不想要修改原始配置文件httpd.conf的话,那么你可以将你自己的额外参数文件独立出来,例如你想要有自己的额外设置值,可以将它写入/etc/httpd/conf.d/zhuji.conf(注意,扩展名一定是.conf),而启动Apache时,这个文件就会被读入主要配置文件当中了。 -
/var/www/html/ 这就是默认的首页所在目录
当输入网址时所显示的数据,就是放在这个目录当中的首页文件(默认为index.html)。 -
/var/www/cgi-bin/ 默认给一些可执行的CGI(网页程序)程序放置的目录,当输入网址/cgi-bin/时所显示的数据所在。
-
/var/log/httpd/ 默认的Apache日志文件都放在这里,对于流量比较大的网站来说,一个星期的日志文件的数据可以达到1GB左右。
Http静态页面
默认匹配的主页优先级
- 如果子配置文件中添加的有虚拟主机(如aa.conf),则会根据虚拟主机的配置执行访问。
虚拟主机的实例文件
/
-
主置文件conf中的/etc/www/html。html下面需要有有一个html文件,且默认名为index.html。
-
如果没有子配置文件也没有主文件,那么会显示欢迎文件。
基于ip地址的访问实例
一个ip对应一个网。例如实现以下操作:
建立一个192.168.10.100的网站 ,文件放在/www/100,内容显示this is 192.168.10.100.
建立一个192.168.10.200的网站 ,文件放在/www/200,内容显示this is 192.168.10.200.
首先,基于IP的访问,肯定要配IP,用子接口的形式配好两个ip-address。
root@localhost ~] nmcli connection modify eno16777736 ipv4.addresses 192.168.10.100/24 ipv4.gateway 192.168.75.2 ipv4.dns 114.114.114.114 ipv4.method manual connection.autoconnect yes
[root@localhost ~] nmcli connection modify eno16777736 + ipv4.addresses 192.168.10.200/24 ipv4.gateway 192.168.75.2 ipv4.dns 114.114.114.114 ipv4.method manual connection.autoconnect yes
[root@localhost ~] nmcli connection up eno16777736
成功激活的连接(D-Bus 激活路径:/org/freedesktop/NetworkManager/ActiveConnection/12)
然后编辑子配置文件:
[root@localhost ~]# mkdir /www/{100,200} -pv
mkdir: 已创建目录 "/www/100"
mkdir: 已创建目录 "/www/200"
[root@localhost ~]# echo this is 192.168.75.100 > /www/100/index.html
[root@localhost ~]# echo this is 192.168.75.200 > /www/200/index.html
vim /etc/httpd/conf.d/vhosts.conf
<Direotory /www>
AllowOverride none
Require all granted
</Directory>
<VirtualHost 192.168.75.100:80>
DocumentRoot /www/100 #指定当前主机访问网站根目录
ServerName 192.168.75.100 #指定访问网站名称
</VirtualHost>
<VirtualHost 192.168.75.200:80>
DocumentRoot /www/200
ServerName 192.168.75.200
</VirtualHost>
测试:
[root@localhost ~]# curl http://192.168.10.200
this is 192.168.10.200
[root@localhost ~]# curl http://192.168.10.100
this is 192.168.10.100
curl是常用的命令行工具,用来测试请求Web服务器,名字是客户端(client)的URL工具的意思。
基于端口的访问实例‘
基于不同端口访问不同网站
建立一个网站,文件存放在/www/80,内容显示为the port is 80;
建立一个网站,文件存放在/www/10000,内容显示为the port is 10000;
在上一个实验中的配置文件中这样添加如下就可。
LISTEN 10000
<VirtualHost 192.168.75.200:10000>
DocumentRoot /www/10000
ServerName 192.168.75.200
</VirtualHost>
基于域名的访问实例‘
HTTPS
https可以看作http的plus版本,也就是在http上添加了加密通讯的功能。传统的http服务,客户机和服务器之间的通讯数据是不经过加密的,如果服务器和客户机之间有第三人来截获数据,那么第三人就可以获取/篡改CS之间的数据信息,甚至伪装成服务器来发送数据。
我们知道防贼是防不住的,既然管不了别人对数据的拦截,那么我们就对数据进行加密,这样一来即使对方截获了你的数据,也什么都看不懂。
两种加密方法:
- 对称加密:
也叫共享密钥加密,双方都拥有密钥,数据经过密钥加工后传输,双方都可以凭借密钥解读数据。 - 非对称加密:服务器创建一把公开密钥,一把私密密钥。数据经过公钥加密后后,连同公钥一起传输。
Http通讯机制
-
服务器生成服务器公钥和服务器私钥,向CA认证机构申请证书。
-
浏览器向服务器发出请求网页,发送hello。
- 客户端支持的SSL /TLS协议的版本号。
- Cipher Suite(密钥算法套件)。
-
服务器回应hello,并发送证书和服务器公钥。
- 确认使用的加密通信协议版本,如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
-
客户端检查证书是否是CA所颁发的。
-
客户端随机生成客户端公钥,客户端私钥,以及利用服务器公钥创建的会话密钥A。
-
客户端向服务器发送客户端公钥,和会话密钥A。
-
服务器通过服务器私钥还原会话密钥A,利用客户端公钥创建会话密钥B。
-
服务器将会话密钥B发送给客户端,客户端通过客户端私钥还原会话密钥B。
-
之后客户端向服务器发送数据会带上会话密钥A,服务器向客户端发送数据会带上会话密钥B。
CA签证机制
上面http协议的建立过程中,出现了服务器向ca申请认证,和客户端向ca验证证书的这个步骤,那么ca认证又是怎么一回事呢? -
服务器向CA证明自己的网站资质,有偿的向CA申请到一个证书。
-
客户机收到服务器回复的证书后,浏览器首先会检查自己内置的受信任表列,如果证书信息和当前访问网站信息一致,那么认为服务器是可信的,可以继续后续流程。否则的话浏览器提示该网站不安全,当然我们可以手动的管理ca机构列表,添加自己信任的网站。
搭建https服务实例
虚目录
虚目录就是把本地里面某个目录下的某个文件映射到网站主目录下面。 每个虚拟目录都有一个别名,这样用户就可以通过这个虚拟目录的别名来访问与之对应的真实文件夹中的资源了。虚拟目录的好处是在不需要改变别名的情况下,可以随时改变其对应的文件夹。
实例: