Apache全解(七)_https与代理

By | 2019年 11月 23日

mod_deflate模块

使用mod_deflate模块压缩页面优化传输速度
适用场景:
(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持
(2) 压缩适于压缩的资源,例如文本文件

LoadModule deflate_module modules/mod_deflate.so 
SetOutputFilter DEFLATE SetOutputFilter DEFLATE

#选择什么类型的文件压缩
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css

压缩等级

DeflateCompressionLevel 9

排除特定旧版本的浏览器,不支持压缩

#Netscape 4.x 只压缩text/html
BrowserMatch ^Mozilla/4 gzip-only-text/html

#Netscape 4.06-08三个版本 不压缩
BrowserMatch ^Mozilla/4\.0[678] no-gzip

Internet Explorer标识本身为“Mozilla / 4”,但实际上是能够处理请求的压缩。如果用户代理首部匹配字符串“MSIE”(“B”为单词边界”),就关闭之前定义的限制

BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

测试

curl -I --compressed 192.168.99.101/m.txt

https

https:http over ssl

  1. SSL会话的简化过程
    (1) 客户端发送可供选择的加密方式,并向服务器请求证书
    (2) 服务器端发送证书以及选定的加密方式给客户端
    (3) 客户端取得证书并进行证书验证
      如果信任给其发证书的CA
      (a) 验证证书来源的合法性;用CA的公钥解密证书上数字签名
      (b) 验证证书的内容的合法性:完整性验证
      (c) 检查证书的有效期限
      (d) 检查证书是否被吊销
      (e) 证书中拥有者的名字,与访问的目标主机要一致
    (4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
    (5) 服务用此密钥加密用户请求的资源,响应给客户端
    注意:SSL是基于IP地址实现,单IP的主机仅可以使用一个https虚拟主机

https实现

  1. 为服务器申请数字证书
    测试:通过私建CA发证书
    (a) 创建私有CA
    (b) 在服务器创建证书签署请求
    (c) CA签证
  2. 配置httpd支持使用ssl,及使用的证书
yum -y install mod_ssl

配置文件:/etc/httpd/conf.d/ssl.conf

DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
  1. 测试基于https访问相应的主机

http重定向https

将http请求转发至https的URL

重定向

Redirect [status] URL-path URL

[status]
Permanent :返回永久重定向状态码 301
Temp :返回临时重定向状态码302. 此为默认值

示例:

#临时重定向
Redirect temp / https://www.a.com/
#永久重定向
Redirect permanent / https://www.a.com/

curl -L http://www.a.com

HSTS

HSTS:HTTP Strict Transport Security
服务器端配置支持HSTS后,会在给浏览器返回的HTTP首部中携带HSTS字段。浏览器获取到该信息后,会将所有HTTP访问请求在内部做307跳转到HTTPS。而无需任何网络过程

HSTS preload list: 是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用Chrome浏览器访问时,会自动转换成HTTPS。Firefox、Safari、Edge浏览器也会采用这个列表

实现HSTS示例:

vim /etc/httpd/conf/httpd.conf
Header always set Strict-Transport-Security "max-age=31536000"

RewriteEngine on
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=302]

正向代理和反向代理

在这里插入图片描述

反向代理功能

  1. 启用反向代理
ProxyPass "/" "http://192.168.99.101"
ProxyPassReverse "/" "http://192.168.99.101"
  1. 特定URL反向代理
ProxyPass "/images" "http://www.example.com/"
ProxyPassReverse "/images" http://www.example.com/
  1. 示例:
<VirtualHost *>
    ServerName www.wang.com
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
</VirtualHost>

Sendfile机制

不用 sendfile 的传统网络传输过程:

read(file, tmp_buf, len)
write(socket, tmp_buf, len)
硬盘 >> kernel buffer >> user buffer >> kernel socket buffer >> 协议栈

一般网络应用通过读硬盘数据,写数据到 socket 来完成网络传输
底层执行过程:
1. 系统调用 read() 产生一个上下文切换:从 user mode 切换到 kernel mode,然后 DMA 执行拷贝,把文件数据从硬盘读到一个 kernel buffer 里。
2. 数据从 kernel buffer 拷贝到 user buffer,然后系统调用 read() 返回,这时又产生一个上下文切换:从kernel mode 切换到 user mode
3. 系统调用 write() 产生一个上下文切换:从 user mode 切换到 kernel mode,然后把步骤2读到 user buffer 的数据拷贝到 kernel buffer(数据第2次拷贝到 kernel buffer),不过这次是个不同的 kernel buffer,这个 buffer和 socket 相关联。
4. 系统调用 write() 返回,产生一个上下文切换:从 kernel mode 切换到 user mode(第4次切换),然后DMA从 kernel buffer 拷贝数据到协议栈(第4次拷贝)

上面4个步骤有4次上下文切换,有4次拷贝,如能减少切换次数和拷贝次数将会有效提升性能

在kernel 2.0+ 版本中,系统调用 sendfile() 就是用来简化上面步骤提升性能的。sendfile() 不但能减少切换次数而且还能减少拷贝次数

用 sendfile() 来进行网络传输的过程:

sendfile(socket, file, len);
硬盘 >> kernel buffer (快速拷贝到kernel socket buffer) >> 协议栈
1. 系统调用 sendfile() 通过 DMA 把硬盘数据拷贝到 kernel buffer,然后数据被 kernel 直接拷贝到另外一个与 socket 相关的 kernel buffer。这里没有 user mode 和 kernel mode 之间的切换,在 kernel 中直接完成了从一个 buffer 到另一个 buffer 的拷贝
2. DMA 把数据从 kernel buffer 直接拷贝给协议栈,没有切换,也不需要数据从 user mode 拷贝到 kernel mode,因为数据就在 kernel 里

http协议

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

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

解决http协议无状态方法
cookie 客户端存放
session 服务端存放

http事务:一次访问的过程
请求:request
响应:response

在这里插入图片描述

HTTP请求报文

在这里插入图片描述

HTTP响应报文

报文语法格式:

request报文

<method> <request-URL> <version>
<headers>
<entity-body>

response报文

<version> <status> <reason-phrase>
<headers>
<entity-body>
  1. method: 请求方法,标明客户端希望服务器对资源执行的动作:GETHEADPOST
  2. versionHTTP/<major>.<minor>
  3. status: 三位数字,如200,301, 302, 404, 502; 标记请求处理过程中发生的情况
  4. reason-phrase:状态码所标记的状态的简要描述
  5. headers:每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟一个可选空格,接着是一个值
  6. entity-body:请求时附加的数据或响应时附加的数据
Method说明
GET从服务器获取一个资源
HEAD只从服务器获取文档的响应首部
POST向服务器输入数据,通常会再由网关程序继续处理
PUT将请求的主体部分存储在服务器中,如上传文件
DELETE请求删除服务器上指定的文档
TRACE追踪请求到达服务器中间经过的代理服务器
OPTIONS请求服务器返回对指定资源支持使用的请求方法

协议查看或分析的工具:
tcpdump、 wireshark 、tshark

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注