apache压缩页面、HTTPS介绍、HTTPS实现过程、http重定向https、正向代理和反向代理、Sendfile机制

apache压缩页面

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

DeflateCompressionLevel 9 压缩比,9最高,1最低
指定压缩的文件类型:
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

排除特定旧版本的浏览器,不支持压缩
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

示例:
<VirtualHost *:80>
ServerName www.a.com
DocumentRoot “/www/a/doc”
<Directory “/www/a/doc”>
Options None
AllowOverride None
Require all granted
</Directory>
DeflateCompressionLevel 9
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
</VirtualHost>

HTTPS介绍

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

注意:SSL是基于IP地址实现,单IP的主机仅可以使用一个https虚拟主机

HTTPS实现过程

1.为服务器申请数字证书
创建私有CA
在服务器创建证书签署请求
CA签证

2.配置httpd支持使用ssl,及使用的证书
yum -y install mod_ssl
如果是二进制安装或者编译则手动加载SSL模块
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile

配置步骤参考

1.搭建CA和证书申请参考另外一篇文章加密、密钥、CA和证书、SSH客户端

做完步骤一应该有3个文件
CA证书文件:cacert.pem
CA给HTTPS颁发的证书文件:https.crt
HTTPS的私钥文件:https.key

2.修改SSL的配置
SSLCertificateFile https.crt
SSLCertificateKeyFile https.key
SSLCACertificateFile cacert.pem

3.重启服务即可
注意:自己搭建的CA需要添加信任CA证书

http重定向https

将http请求转发至https的URL

重定向:
Redirect [status] URL-path URL

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

示例:
Redirect temp / https://www.test.com
注意:此方法可能会造成循环重定向,推荐使用HTST

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

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

在httpd.conf中添加以下选项即可:
Header always set Strict-Transport-Security “max-age=31536000” 设置HSTS缓存时间,单位秒
RewriteEngine on
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=302]

正向代理和反向代理

客户端
正向代理服务器
反向代理服务器
目标服务器1
目标服务器2

客户端只知道正向代理服务器,不知道反向代理服务器

启用反向代理功能

ProxyPass “/” “http://www.test.com/”
ProxyPassReverse “/” “http://www.test2.com/”

特定URL反向代理
ProxyPass “/images” “http://www.test.com/”
ProxyPassReverse “/images” http://www.test2.com/

也可以做端口映射
示例:
<VirtualHost *>
ServerName www.test.com
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/


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里

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值