一、压缩与缓存
1.网页压缩
网站访问速度影响因素:应用程序响应速度、网络嗲款、服务器性能、与客户及之间的网络传输速度等。其中最终哟啊的一个因素是apache执行速度,因此提升执行apache执行速度(使用网页压缩)是性价比最高的选择
(1)gzip介绍
一种流行的文件压缩算法,大约可以减少70%以上的文件大小。利用Apache的gzip模块可使用该算法对网页内容进行压缩后再传输给客户端浏览器,从而加快网页加载速度
(2)HTTP压缩过程
服务器接收到HTTP请求后,先检查浏览器是否支持压缩(Accept-Encoding信息)
如果支持,服务器将检查请求文件的后缀,如HTML,CSS等静态文件,服务器会在压缩缓存目录中查找是否存在最新的压缩文件
如果不存在最新压缩文件,服务器会返回未压缩的请求文件,并在缓存目录中存放该请求的压缩文件
如果存在新压缩文件,则直接返回请求的压缩文件
如果请求是动态文件,则服务器会动态压缩内容并返回浏览器,但内容不会存放到缓存目录中
(3)Apache的压缩模块
Apache 1.x系列没有内江网页压缩技术,使用的是第三方mod_gzip模块进行压缩
2.x系列内建了mod_deflate模块来取代mod_gzip
mod_gzip对服务器cpu占用更高,但压缩效率更高
mod_deflate 压缩速度略快而 mod_gzip 的压缩比略高。一般默认情况下,mod_gzip会比 mod deflate 多出 4%~6%的压缩量。
一般来说,mod_gzip 对服务器 CPU 的占用要高一些。mod_deflate 是专门为确保服务器的性能而使用的一个压缩模块,mod deflate 需要较少的资源来压缩文件。这意味着在高流量的服务器,使用 mod deflate 可能会比 mod _gzip 加载速度更快。
简而言之,如果网站访问量较小,想要加快网页的加载速度,就使用mod_gzip。虽然会额外耗费一些服务器资源,但也是值得的。如果网站访问量较大,并且使用的是共享的虚拟主机,所分配系统资源有限的话,使用mod defate 将会是更好的选择。
Apache 2.4.25 版本中 mod deflate 模块,可使用 DeflateCompressionLevel 指令设置压缩级别。该指令的值可为1(压缩速度最快,最低的压缩质量)至9(最慢的压缩速度,压缩率最高)之间的整数,其默认值为6(压缩速度和压缩质量较为平衡的值)。这个简单的变化更是使得 mod deflate 可以轻松媲美 mod gzip 的压缩。
2.查看浏览器支持哪些压缩
查看浏览网页的web服务信息打开网页后在页面按F12打开开发者工具,刷新一下网页就能抓取到网页信息,里面就含有浏览器支持的压缩模块
3. mod_deflate 模块
检查是否安装有mod_deflate模块
[root@www ~]# apachectl -t -D DUMP_MODULES | grep deflate
(1)安装时启用此功能
安装时编译 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 httpd-2.4.25]#make && make install
[root@apache httpd-2.4.25]#ln -s /usr/local/httpd/bin/* /usr/local/bin
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>
(2)利用apxs为http扩展此功能
如果有apache的源码,可以重新编译并安装一次,新的模块就会添加进去,如果没有源码,或不想重新编译,可以使用apxs扩展此模块,方法如下
[root@www ~]# yum -y install zlib-devel
[root@www ~]# cd httpd-2.4.25/modules/filters/
[root@www filters]# /usr/local/httpd/bin/apxs -i -c -a mod_deflate.c
备注:
-i 安装
-c 编译指定模块
-a激活模块
(3)配置 mod_deflate 模块启用
[root@apache~]# vim /usr/local/httpd/conf/httpd.conf
添加以下内容:
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>
备注:
DeflateCompressionLevel 9 #代表压缩级别,范围为1~9
SetOutputFilter DEFLATE #代表启用deflate 模块对本站点的输出进行gzip压缩
[root@www httpd-2.4.25]# httpd -t #检查语法错误
[root@www httpd-2.4.25]# apachectl restart #重启apache
[root@localhost httpd-2.4.25]# apachectl -t -D DUMP_MODULES | grep deflate
deflate_module (shared) #查看apache服务
(3)测试 mod_deflate 压缩模块是否生效
访问网站:
http://192.168.10.102/test1.php #本人用的虚拟机自己给的IP,这个可以看自己设置服务器的IP查询
注意:查看前面测试php的页面
按F12可以打开
4.网页缓存
网页缓存是将一部分经常不会改变和变动很少的页面缓存,下次浏览器再次访问这些页面时,不需要再次去下载这些页面,从而提高了用户的访问速度。
Apache 的 mod _expires 模块会自动生成页面头部信息中的 Expires 标签和Cache-Control 标签,客户端浏览器根据标签决定下次访问是在本地机器的缓存中获取页面,不需要向服务器再次发出请求,从而降低客户端的访问频率和次数,达到减少不必要的流量和增加访问速度的目的。
配置 mod_expires 模块的步骤与 mod_deflate 模块相似!
1:配置 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"
</IfModule>
备注:
ExpiresActive On:打开网页缓存功能
ExpiresDefault "access plus 60 seconds" :设置缓存60秒
2:检测 httpd.conf 语法
[root@www ~]# apachectl -t
3:重启 Apache 服务
[root@www ~]# apachectl restart
4:测试mod_expires 模块
访问网站:
http://192.168.10.102/test1.php
注意:查看前面测试php的页面
5.隐藏版本信息
一般情况下,软件的漏洞信息和特定版本是相关的。因此,软件的版本号对攻击者来说是很有价值的,在浏览器中选择"査看元素"可以看到 Apache 的版本 2.4.25,如图所示。
如果黑客或别有用心的人得到 Apache 的版本信息,就会有针对性的进行攻击,给网站造成很大的损失。所以实际生产环境中要隐藏 Apache 的版本号,减少受攻击的风险,保护服务器安全运行
1:修改主配置文件
[root@www ~]# vim /usr/local/httpd/conf/httpd.conf
去掉前面的注释符
Include conf/extra/httpd-default.conf
2:修改httpd-default.conf文件
[root@www ~]# vim /usr/local/httpd/conf/extra/httpd-default.conf
ServerTokens Prod
备注:
ServerTokens字段代表显示格式,各种格式如下:
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
3:重启并测试
[root@www ~]# apachectl restart
查看响应头,Server字段只显示Apache,不再显示版本信息
显示 Server:Apache,版本信息已经被隐藏。ServerTokens 表示 Server 回送给客户端的回应头域是否包含关于服务器 OS 类型和编译进的模块描述信息,这里设置的是 Prod。下图列出ServerTokens 的选项以及输出格式。
二、Apache 防盗链
1:实验环境
|---------|---------------|----------------|------------|---------------------|
| 主机 | 域名 | 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 | 浏览器 |
将第一台服务器直接克隆一个,并修改IP地址为192.168.10.201
2:修改两台服务器的主机名
(1)服务器1
[root@www ~]# hostnamectl set-hostname apache1
[root@www ~]# bash
(2)服务器2
[root@www ~]# hostnamectl set-hostname apache2
[root@www ~]# bash
(3)修改每个主机的hosts文件
192.168.10.101 www.benet.com
192.168.10.102 www.accp.com
4:编写带有图片的网页(原图网站)
将图片文logo.jpg件拷贝到apache的网站根目录下并修改网页文件
[root@apache1 ~]# vim /usr/local/httpd/htdocs/index.html
<html>
<body>
<h1>It work! </h1>
<im src="logo.jpg"/>cd
</body>
</html>
5:用另一台apache服务器盗链(盗图网站)
在 www.accp.com 服务器,修改 index.html 文件,加入盗取图片链接
[root@apache2 ~]# vim /usr/local/httpd/htdocs/index.html
<html>
<body>
<h1>dao lian </h1>
<img src="http://www.benet.com/logo.jpg" />
</body>
</html>
6:客户端测试访问
按F12查看
2.为 Apache 1 防盗链设置
(1)配置 mod_rewrite 模块启用
[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]
RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/error.png
Require all granted
</Directory>
[root@apache1 ~]# systemctl restart httpd
备注:
AllowOverride ALL
通常利用Apache的rewrite模块对 URL 进行重写的时候, rewrite规则会写在 .htaccess 文件里,这时就需要将AllowOverride 的参数设置为ALL。但要使 apache 能够正常的读取.htaccess 文件的内容,就必须对.htaccess 所在目录进行配置。从安全性考虑,根目录的AllowOverride属性一般都配置成不允许任何Override。如果AllowOverride 的参数设置为None,需要将rewrite规则直接写在httpd的主配置文件中。
RewriteCond %{HTTP_REFERER} !^http://www.benet.com/.$ [NC] 的字段含义:
"%{HTTP REFERER}":存放一个链接的URL,表示从哪个链接访问所需的网页。
"!^": 表示不以后面的字符串开头。
" http://www.benet.com" : 是本网站的路径,按整个字符串匹配。
".*$" : 表示以任意字符结尾。
"[NC]": 表示不区分大小写字母。
RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/error.png的字段含义:
".": 表示匹配一个字符。
"*":表示匹配0 到多个字符,与"."合起来的意思是匹配0到多次前面的任意字符,如果是1到多次匹配可以用"+"表示。
"\.": 在这里的"\"是转义符,"." 就代表符号"."的意思。因为". "在指令中是属于规则字符,有相应的含义,如果需要匹配,需要在前而加个转义符"\",其它规则字符如果需要匹配,也做同样处理。
"(gif|jpg|swf)": 表示匹配"gif"、"jpg"、"swf"任意一个, "$"表示结束。最后的规则是以".gif"、 ".jpg"、 ".swf"结尾。
RewriteRule中不要添加png的格式,否则客户端看不到error图片
(2)检测 httpd.conf 语法
[root@apache1 ~]# apachectl -t
复制 error.png 这个图片到benet站点的工作目录 /usr/local/httpd/htdocs,再次访问网站
这样即便有人获取了我的链接,但是只要访问项目的报文头部的URL和服务器返回来的URL不相符那么我的服务器就会指向另一个路径的图片。至此防盗链就基本完成了