文章目录
六. 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