(五) httpd(资源压缩,https实现,证书,私钥,重定向,HSTS内部跳转,正反向代理 ,Sendfile机制)

六. mod_deflate模块

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

#加载模块
LoadModule deflate_module modules/mod_deflate.so 
#启用压缩
SetOutputFilter DEFLATE

#对于那些文件启用压缩
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain      #纯文本
AddOutputFilterByType DEFLATE text/html       #以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
Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9     #压缩比

针对某个网站(写到里面)
在这里插入图片描述
如果是针对所有网站。可以写到配置文件中

AddOutputFilterByType DEFLATE text/plain      
AddOutputFilterByType DEFLATE text/html 
DeflateCompressionLevel 9    

在这里插入图片描述
curl默认不支持压缩、
所以得加上–compressed
在这里插入图片描述

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

七. https(端口443)

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

1. https实现

(1) 为服务器申请数字证书
测试:通过私建CA发证书
(a) 创建私有CA
(b) 在服务器创建证书签署请求
(c ) CA签证
(2) 配置httpd支持使用ssl,及使用的证书
要自己安装mod_ssl模块

yum -y install mod_ssl

#修改对应的配置文件:
vim /etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile   /path/file
SSLCertificateKeyFile /path/file
SSLCACertificateFile /path/file

这个会自己将mod_ssl模块加载到/etc/httpd/conf.modules.d/00-ssl_conf中
在这里插入图片描述
在这里插入图片描述
在转mod_ssl时自己就把私钥,和证书就生成了(自签名证书)
在这里插入图片描述
查看证书文件
在这里插入图片描述
如果要信任,就得把这个证书文件导出来,到浏览器中
(3) 测试基于https访问相应的主机

openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfilefilename]

在这里插入图片描述

虚拟主机默认用的是/var/www/html/
访问时用curl要加上-k忽略证书
在这里插入图片描述
也可以 --cacert 证书路径
在这里插入图片描述

实验:利用私有CA,实现HTTPS

1 建立CA
cd /etc/pki/CA/

(umask 077;openssl genrsa -out private/cakey.pem 4096)
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650 <<EOF
CN
beijing
beijing
magedu
devops
ca.magedu.com
admin@magedu.com
EOF

touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial

2 申请证书
mkdir /etc/httpd/conf.d/ssl
cd /etc/httpd/conf.d/ssl
(umask 066;openssl genrsa -out httpd.key 1024 )
openssl req -new -key httpd.key  -out httpd.csr 
scp /etc/httpd/conf.d/ssl/httpd.csr  CAServer:/etc/pki/CA

3 颁发证书
openssl ca -in /etc/pki/CA/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 100

scp /etc/pki/CA/certs/httpd.crt  192.168.37.7:/etc/httpd/conf.d/ssl/
scp /etc/pki/CA/cacert.pem  192.168.37.7:/etc/httpd/conf.d/ssl

4 vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/httpd/conf.d/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/conf.d/ssl/httpd.key
SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert.pem 

windows中访问就得更改host文件C:/windows/system32/drivers/etc/host
写入网站信息
192.168.37.7 www.a.com www.b.com www.c.com

将根CA文件导出,改为crt后缀,会有自动安装向导
在这里插入图片描述

实现https 实战案例

yum -y install   mod_ssl

cd /etc/pki/tls/certs

vim Makefile 
#/usr/bin/openssl genrsa -aes128 $(KEYLEN) > $@
/usr/bin/openssl genrsa  $(KEYLEN) > $@    
[root@centos7 certs]#make qcq.org
make: *** No rule to make target `qcq.org'. Stop.
[root@centos7 certs]#make magedu.org.crt

最后访问https就可以了(用IE浏览器,测试)

互联网网站证书实现

dnf -y install   mod_ssl

cd /etc/httpd/conf.d/ssl/

openssl x509 -in www.wangxiaochun.com_public.crt -noout -text

grep -Ev "^ *#|^$" /etc/httpd/conf.d/ssl.conf 
Listen 443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout  300
SSLCryptoDevice builtin
<VirtualHost _default_:443>
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLHonorCipherOrder on
SSLCipherSuite PROFILE=SYSTEM
SSLProxyCipherSuite PROFILE=SYSTEM
SSLCertificateFile /etc/httpd/conf.d/ssl/www.wangxiaochun.com_public.crt
SSLCertificateKeyFile /etc/httpd/conf.d/ssl/www.wangxiaochun.com.key
SSLCertificateChainFile /etc/httpd/conf.d/ssl/www.wangxiaochun.com_chain.crt
<FilesMatch "\.(cgi|shtml|phtml|php)$">
   SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/var/www/cgi-bin">
   SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

2. http重定向https

将http请求转发至https的URL
重定向

redirect [status] URL-path URL

status状态
Permanent: 返回永久重定向状态码 301(用于淘汰的网站—www.360buy.com)
Temp:返回临时重定向状态码302. 此为默认值
在这里插入图片描述

示例
Redirect temp / https://www.qcq.com/

当访问a让他跳转到b
在这里插入图片描述
curl浏览器默认只发一个消息
-L根据用户的请求发
在这里插入图片描述
如果没有 虚拟主机,可能会出现循环跳转(超过50次)崩溃
实现http------->https的重定向跳转
在这里插入图片描述

3. HSTS

HSTS:HTTP Strict Transport Security (http的严格限制)
服务器端配置支持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      #重写引擎(可能会导致字符编码更改为不是UTF-8的字符)
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=302]

在这里插入图片描述

4. 正向代理和反向代理

正向代理:代表客户端,向服务器发送消息
反向代理:代表服务器,回应客户端

正向代理(客户端):通常是提供缓存服务(网管)
反向代理(服务端):调度功能(用户的请求到那个服务器-提供服务)
做好几个服务器(用反向代理)在这里插入图片描述
在这里设置(网管)
在这里插入图片描述

反向代理功能

启用反向代理

ProxyPass "/" "http://www.example.com/"
ProxyPassReverse "/" "http://www.example.com/"

特定URL反向代理(特定文件夹)
只转发images文件夹的内容

ProxyPass "/images" "http://www.example.com/"
ProxyPassReverse "/images" http://www.example.com/

示例

<VirtualHost *>
 ServerName www.magedu.com
 ProxyPass / http://localhost:8080/
 ProxyPassReverse / http://localhost:8080/
</VirtualHost>

三个机器(web服务器,反向代理服务器,客户端)
web服务器:(设置一个页面)
反向代理:

vim conf.d/test.conf
ProxyPass "/" "http://www.example.com/"  #只要访问/  就抓发到服务器上去
ProxyPassReverse "/" "http://www.example.com/"   #反向转发到根

客户端:访问---->代理服务器

用访问日志监控tail -f /var/log/httpd/access_log

八. 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次拷贝到 kernelbuffer),
     不过这次是个不同的 kernel buffer,这个 buffer和 socket 相关联。
 4 系统调用 write() 返回,产生一个上下文切换:从 kernel mode 切换到 usermode(4次切换),
 然后DMA从 kernel buffer 拷贝数据到协议栈(第4次拷贝)

在这里插入图片描述

sendfile机制:直接把index.html复制到socket buffer缓冲区
apach默认启动sendfile功能
上面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 里

指定文件类型 content type

相关指令

#指定文件和content type 的对应文件
TypesConfig file-path

#在给定的文件扩展名与特定的content type内容类型之间建立映射关系。MIME-type指明了包含

extension扩展名的文件的媒体类型。这个映射关系会添加在所有有效的映射关系上,并覆盖所有相同的
extension扩展名映射,extension参数是不区分大小的,并且可以带或不带前导点

AddType MIME-type extension [extension] ...

例如

TypesConfig /etc/mime.types #默认指向配置文件
AddType image/jpeg jpeg jpg jpe
AddType application/x-httpd-php .php
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值