网页压缩与缓存
网页压缩
(1)gzip(压缩效率高,对cpu占用较大)
- 一种流行的文件压缩算法,大约可以减少70%以上的文件大小。利用Apache的gzip模块可使用该算法对网页内容进行压缩后再传输给客户端浏览器,从而加快网页加载速度
(2)HTTP压缩过程
- 服务器接收到HTTP请求后,先检查浏览器是否支持压缩(Accept-Encoding信息)
- 如果支持,服务器将检查请求文件的后缀,如HTML,CSS等静态文件,服务器会在压缩缓存目录中查找是否存在最新的压缩文件
- 如果不存在最新压缩文件,服务器会返回未压缩的请求文件,并在缓存目录中存放该请求的压缩文件
- 如果存在新压缩文件,则直接返回请求的压缩文件⑤如果请求是动态文件,则服务器会动态压缩内容并返回浏览器,但内容不会存放到缓存目录中
(3)Apache的压缩模块(对cpu消耗小,压缩效率没有gzip高)
- Apache 1.x系列没有内江网页压缩技术,使用的是第三方mod_gzip模块进行压缩
- 2.x系列内建了mod_deflate模块来取代mod_gzip
- mod_gzip对服务器cpu占用更高,但压缩效率更高
(3.5)动态添加mod_deflate 模块
//检查是否安装有mod_deflate模块
[root@www ~]# apachectl -t -D DUMP_MODULES | grep deflate
//安装Apache时启用此功能
//安装时编译 Apache源码 添加 mod_deflate 模块
[root@apache ~]# tar zxf httpd-2.4.25.tar.gz
[root@apache ~]# cd httpd-2.4.25/
[root@apache ttpd-2.4.25]#./configure \
--prefix=/usr/local/httpd \
--enable-so --enable-rewrite \
--enable-charset-lite \
--enable-cgi --enable-deflate
[root@apache ttpd-2.4.25]#./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-deflate
[root@apache httpd-2.4.25]#make && make install //编译
[root@apache httpd-2.4.25]#ln -s /usr/local/httpd/bin/* /usr/local/bin //软连接
//如果安装时没有配置,则需要动态安装
[root@apache ~]cd /httpd-2.4.25/modules/filters
//使用apxs工具安装
[root@localhost filters]# apxs -i -c -a mod_deflate.c
i:安装模块。将编译后的模块安装到 Apache 服务器中
c:编译模块。将源代码文件(这里是mod deflate.c)编译成共亨对象文件(.so文件)
a:自动激活模块。编译并安装模块后,立即启用它,不需要手动编辑配置文件
(4)配置mod_deflate 模块
//配置mod_deflate模块启动
[root@localhost htdocs]# vim /usr/local/httpd/conf/httpd.conf
LoadModule deflate_module modules/mod_deflate.so
//下面写
<IfModule mod_deflate.c>
DeflateCompressionLevel 6 //代表压缩级别,范围为1~9
SetOutputFilter DEFLATE //代表启用deflate 模块对本站点的输出进行gzip压缩
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/csstext/javascript application/x-javascript application/javascript application/json
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary //设置不对后缀 gif,jpg,jpeg,png 的图片文件进行压缩
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary //设置不对 exe,tgz,gz 等文件进行压缩
SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
AddOutputFilterByType DEFLATE text/* //设置对文件是文本的内容进行压缩,例如 text/html text/css text/plain 等
AddOutputFilterByType DEFLATE application/ms* application/vnd*
application/postscript application/javascript application/x-javascript //设置对 iavascript 文件进行压缩
AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp //设置 apache 对 php 类型的文件进行压缩
</IfModule>
备注:可简化为如下代码
LoadFile /usr/lib64/libz.so
LoadModule deflate_module modules/mod_deflate.so
//下面写
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml text/javascript text/jpg text/png
DeflateCompressionLevel 9
SetOutputFilter DEFLATE
</IfModule>
(5)检查mod_deflate 模块
[root@apache~]# httpd -t
Syntax OK
[root@apache~]# apachectl restart 或 systemctl restart httpd
[root@apache ~]# apachectl -t -D DUMP MODULES | grep "deflate"
deflate module (shared)
网页缓存
//配置 mod_expires 模块启用
[root@apache~]# vim /usr/local/httpd/conf/httpd.conf
LoadModule expires_module modules/mod_expires.so ##去掉前面的注释
<IfModule mod_expires.c>
ExpiresActive On //打开网页缓存功能
ExpiresDefault "access plus 60 seconds" //设置缓存60秒
</IfModule>
[root@apache~]# httpd -t //检查语法
Syntax OK
[root@apache~]# apachectl restart 或 systemctl restart httpd
隐藏版本信息
一般情况下,软件的漏洞信息和特定版本是相关的。因此,软件的版本号对攻击者来说是很有价值的,在浏览器中选择“査看元素"可以看到 Apache 的版本,实际生产环境中要隐藏 Apache 的版本号,减少受攻击的风险,保护服务器安全运行,修改 htpd.conf 配置文件,使 httpd-default.conf文件生效,它里面包含了是否返回版本信息的内容
[root@www ~]# vim /usr/local/httpd/conf/httpd.conf
Include conf/extra/httpd-default.conf //去掉前面的注释符
[root@www ~]# vim /usr/local/httpd/conf/extra/httpd-default.conf
ServerTokens Prod //将原本的Full改为Prod
//重启服务
Prod | Server:Apache |
Major | Server:Apache/2 |
Minor | Server:Apache/2.4 |
OS | Server:Apache/2.4.25(Unix) |
Full | Server:Apache/2.4.25(Unix) PHP/4.2.2 MyMod/1.2 |
Apache防盗链
Apache 的默认配置除了性能可以优化外,还需要对安全性进行相应的配置。默认配置能保证服务器正常提供服务,但 Apache 作为一个软件,必然也会存在一些漏洞,尽可能的降低潜在的风险,是管理员必须掌握的内容,一般来说,用户浏览一个完整的页面并不是一次性全部传送到客户端的。如果所请求的页面带有图片或其他信息,那么第一个 HTTP 请求传送的是这个页面的文本,然后通过客户端的浏览器对这段文本进行解释执行,如果发现其中还有图片,那么客户端的浏览器会再次发送一条 HTTP 请求,当这个请求被处理后这个图片文件才会被传送到客户端,最后浏览器会将图片安放到页面的正确位置,就这样一个完整的页面要经过多次发送 HTTP 请求才能够被完整的显示
配置实验
主机 | 域名 | IP地址 | 操作系统 | 主要软件及版本 |
apache1 | www.benet.com | 192.168.10.101 | CentOS7.9 | httpd-2.4.25.tar.gz |
apache2 | www.accp.com | 192.168.10.102 | CentOS7.9 | httpd-2.4.25.tar.gz |
客户端 | client | Windows 10 | 浏览器 |
(1)准备两个服务器及修改hosts文件
//服务器1
[root@www ~]# hostnamectl set-hostname apache1
[root@www ~]# bash
//服务器2
[root@www ~]# hostnamectl set-hostname apache2
[root@www ~]# bash
//修改每个主机的hosts文件
192.168.10.101 www.benet.com
192.168.10.102 www.accp.com
//并且关闭防火墙和selinux
[root@apache1 ~]# systemctl stop firewalld
[root@apache1 ~]# seteforce 0
(2)编写带有图片的网页(原图网站)
//准备图片,把图片复制到主服务器(www.benet.com)的 Apache 工作目录/usr/local/httpd/htdocs
[root@apache1 ~]# vim /usr/local/httpd/htdocs/index.html
<html>
<body>
<h1>It work! </h1>
<img src="logo.jpg"/>
</body>
</html>
(3)用另一台apache服务器盗链(盗图网站)
//在 www.accp.com 服务器,修改 index.html 文件,加入盗取图片链接
//使用yum在accp服务器安装httpd服务
[root@apache2 ~]# vim /var/www/html/index.html //这是yum安装httpd的存放网页路径
<html>
<body>
<h1>dao lian </h1>
<img src="http://www.benet.com/logo.jpg" />
</body>
</html>
Apache1防盗链设置
[root@apache1 ~]# vim /usr/local/httpd/conf/httpd.conf
#去掉前面的注释
LoadModule rewrite_module modules/mod_rewrite.so
#修改此网站访问参数
<Directory "/usr/local/httpd/htdocs">
AllowOverride None
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://benet.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://benet.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.benet.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.benet.com/$ [NC]
“%{HTTP REFERER}”:存放一个链接的URL,表示从哪个链接访问所需的网页。
“!^”: 表示不以后面的字符串开头。
“ http://www.benet.com” : 是本网站的路径,按整个字符串匹配。
“.*$” : 表示以任意字符结尾。
“[NC]”: 表示不区分大小写字母。
ewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/error.png //RewriteRule中不要添加png的格式,否则客户端看不到error图片
“.”: 表示匹配一个字符。
“*”:表示匹配0 到多个字符,与“.”合起来的意思是匹配0到多次前面的任意字符,如果是1到多次匹配可以用“+”表示。
“\.”: 在这里的“\“是转义符,”." 就代表符号“.”的意思。因为“. ”在指令中是属于规则字符,有相应的含义,如果需要匹配,需要在前而加个转义符"\”,其它规则字符如果需要匹配,也做同样处理
“(gif|jpg|swf)”: 表示匹配“gif”、“jpg”、“swf"任意一个, “$”表示结束。最后的规则是以“.gif”、 “.jpg”、 ".swf”结尾
Require all granted
</Directory>
//备注:
AllowOverride ALL
通常利用Apache的rewrite模块对 URL 进行重写的时候, rewrite规则会写在 .htaccess 文件里,这时就需要将AllowOverride 的参数设置为ALL
但要使 apache 能够正常的读取.htaccess 文件的内容,就必须对.htaccess 所在目录进行配置
从安全性考虑,根目录的AllowOverride属性一般都配置成不允许任何Override
如果AllowOverride 的参数设置为None,需要将rewrite规则直接写在httpd的主配置文件中
[root@apache1 ~]# httpd -t
复制 error.png 这个图片到benet站点的工作目录 /usr/local/httpd/htdocs,再次访问网站
[root@apache1 ~]# systemctl restart httpd