技能目标:
掌握 Apache 网页压缩
掌握 Apache 网页缓存
掌握 Apache 网页防盗链
掌握 Apache 隐藏版本信息
4.1 网页压缩与缓存
在使用 Apache 作为 Web 服务器的过程中,只有对 Apache 服务器进行适当的优化配 置,才能让 Apache 发挥出更好的性能。反过来说,如果 Apache 的配置非常糟糕, Apache 可能无法正常为我们服务。因此,针对各种企业应用需求对 Apache 服务器的配置进行一定 的优化是必不可少的。
4.1.1网页压缩
网站的访问速度是由多个因素所共同决定的,这些因素包括应用程序的响应速度、网络带宽、服务器性能、与客户端之间的网络传输速度等等。其中最重要的一个因素是 Apache本身的响应速度。因此当为网站性能所苦恼时,第一个需要着手进行处理的便是尽可能的提升 Apache 的执行速度,可以使用网页压缩提升应用程序的速度。更重要的是,它完全不需要任何的成本,只不过是会让服务器 CPU 占用率稍微提升一两个百分点或者更少
1. gzip介绍
gzip 是一种流行的文件压缩算法,目前应用非常广泛,尤其是在 Linux 平台。当使用gzip 压缩一个纯文本文件时,效果是非常明显的,大约可以减少 70 %以上的文件大小。利用 Apache 中的 gzip 模块,可以使用 gzip 压缩算法来对 Apache 服务器发布的网页内容进行压缩后再传输到客户端浏览器。经过压缩后,实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度。
网页加载速度加快的好处不言而喻。除了节省流量,改善用户的浏览体验外,另一个潜 在的好处是 gzip 与搜索引擎的抓取工具有着更好的关系。
2. HTTP压缩的过程
Web 服务器接收到浏览器的 HTTP 请求后,检查浏览器是否支持 HTTP 压缩(Accept-Encoding 信息)。如果浏览器支持 HTTP 压缩, Web 服务器检查请求文件的后缀名。如果请求文件是 HTML 、 CSS 等静态文件, Web 服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件。如果请求文件的压缩文件不存在,Web 服务器向浏览器返回未压缩的请求文件,并在压缩缓冲目录中存放请求文件的压缩文件。如果请求文件的最新压缩文件已经存在,则直接返回请求文件的压缩文件。如果请求文件是动态文件,Web服务器动态压缩内容并返回浏览器,压缩内容不存放到压缩缓存目录中。
3.Apache的压缩模块
Apache 1.x 系列没有内建网页压缩技术,使用的是额外的第三方 mod_gzip 模块来执第 2 页 共 17 页 行压缩。而 Apache 2.x 官方在开发的时候,就把网页压缩考虑进去,内建了 mod_deflate 这个模块,用以取代 mod_gzip 。两者都是使用的 gzip 压缩算法,它们的运作原理是类似的。
mod_deflate 压缩速度略快而 mod_gzip 的压缩比略高。一般默认情况下,mod_gzip 会比 mod_deflate 多出 4%~6%的压缩量。
一般来说,mod_gzip 对服务器 CPU 的占用要高一些。 mod_deflate 是专门为确保服务器的性能而使用的一个压缩模块,mod_deflate 需要较少的资源来压缩文件。这意味着在高流量的服务器,使用 mod_deflate 可能会比 mod_gzip 加载速度更快。
简而言之,如果网站访问量较小,想要加快网页的加载速度,就使用 mod_gzip 。虽然会额外耗费一些服务器资源,但也是值得的。如果网站访问量较大,并且使用的是共享的虚拟主机,所分配系统资源有限的话,使用 mod_deflate 将会是更好的选择。
Apache 2.4.25 版本中 mod_deflate 模块,可使用 DeflateCompressionLevel 指令设置压缩级别。该指令的值可为 1 (压缩速度最快,最低的压缩质量)至 9 (最慢的压缩速度,压缩率最高)之间的整数,其默认值为 6 (压缩速度和压缩质量较为平衡的值)。这个简单的变化更是使得 mod_deflate 可以轻松媲美 mod_gzip 的压缩。
4. mod_deflate模块
检查是否安装 mod_deflate 模块
[root@localhost ~]# apachectl -t -D DUMP_MODULES
Loaded Modules:core_module (static)so_module (static)http_module (static)mpm_worker_module (static)authn_file_module (shared)authn_core_module (shared)authz_host_module (shared)authz_groupfile_module (shared)authz_user_module (shared)authz_core_module (shared)access_compat_module (shared)auth_basic_module (shared)reqtimeout_module (shared)filter_module (shared)mime_module (shared)log_config_module (shared)env_module (shared)headers_module (shared)setenvif_module (shared)version_module (shared)unixd_module (shared)status_module (shared)autoindex_module (shared)dir_module (shared)alias_module (shared)
[root@localhost ~]# apachectl -t -D DUMP_MODULES | grep "deflate"
(1)重新编译 Apache 添加 mod_deflate 模块
[root@localhost ~]# cd /usr/src/httpd-2.4.25/
[root@localhost httpd-2.4.25]# yum install -y zlib-devel
[root@localhost httpd-2.4.25]# ./configure --prefix=/usr/local/httpd
[root@localhost httpd-2.4.25]# cd /usr/local/httpd/conf/
[root@localhost conf]# mv httpd.conf httpd.conf.bak
[root@localhost conf]# systemctl stop httpd.service
[root@localhost conf]# cd /usr/src/httpd-2.4.25/
[root@localhost httpd-2.4.25]# make -j2 && make install
2)配置mod_deflate模块启用
[root@localhost httpd-2.4.25]# cd /usr/local/httpd/conf/
[root@localhost conf]# ls
extra httpd.conf httpd.conf.bak magic mime.types original
[root@localhost conf]# vim httpd.confListen 192.168.56.25:80 ##52行修改端口号
LoadModule deflate_module modules/mod_deflate.so ##106行取消注释
ServerName www.bdqn.com:80 ##201行修改域名信息
###最后一行开启gzip功能
###设置对什么样的内容进行gzip压缩
###设置压缩级别1-9之间
###启用deflate模块对本站点的输出进行gzip压缩
<IfModule mod_deflate.c>AddOutputFilterByType DEFLATE text/hml text/plain text/css text/xml text/javascrpit text/jpg text/pngDeflateCompressionLevel 9SetOutputFilter DEFLATE
</IfModule>
(3)检查安装情况,启动服务
[root@localhost conf]# apachectl -t
Syntax OK
[root@localhost conf]# apachectl -t -D DUMP_MODULES | grep "deflate"deflate_module (shared)
[root@localhost conf]# syetmctl start httpd.service
bash: syetmctl: 未找到命令...
[root@localhost conf]# systemctl start httpd.service
[root@localhost conf]#
测试缓存是否生效
[root@localhost conf]# cd /usr/local/httpd/htdocs/
[root@localhost htdocs]# vim index.html
[root@localhost htdocs]# rz -E
rz waiting to receive.
[root@localhost htdocs]# ls
asoiaoihdwoad.jpg index.html
[root@localhost htdocs]# mv asoiaoihdwoad.jpg web.jpg
[root@localhost htdocs]# systemctl restart httpd
[root@localhost htdocs]#
4)浏览器访问,使用F12消息查看
在浏览器中选择“查看元素”可以看到有“AcceptEncoding:gzip”表示压缩已经生效
4.1.2 网页缓存
网页缓存是将一部分经常不会改变和变动很少的页面缓存, 下次浏览器再次访问这些页 面时, 不需要再次去下载这些页面 , 从而提高了用户的访问速度。
Apache 的 mod_expires 模 块 会 自 动 生 成 页 面 头 部 信 息 中 的 Expires 标签和Cache-Control 标签,客户端浏览器根据标签决定下次访问是在本地机器的缓存中获取页面,不需要向服务器再次发出请求,从而降低客户端的访问频率和次数,达到减少不必要的
流量和增加访问速度的目的。
配置 mod_expires 模块的步骤与 mod_deflate 模块相似。
1. 配置 mod_expires 模块启用
启用 mod_expires 模块之前,可以用浏览器先抓取数据包,然后修改 httpd.conf 文件再抓取 数据包进行对比 。在 httpd.conf 去掉 LoadModule expires_module modules/mod_expires.so 前面的 # 注释,末尾加入以下内容。
(1)检查是否安装mod_expires模块
[root@localhost htdocs]# apachectl -t -D DUMP_MODULES | grep "expires"
如果没有安装mod_expires模块,重新编译安装Apache添加mod_expires模块
[root@localhost htdocs]# systemctl stop httpd.service
[root@localhost htdocs]# cd /usr/local/httpd/conf/
[root@localhost conf]# ls
extra httpd.conf httpd.conf.bak magic mime.types original
[root@localhost conf]# mv httpd.conf httpd.conf.bak1
[root@localhost conf]# yum -y install gcc gcc-c++ pcre pcre-devel zlib-devel
[root@localhost httpd-2.4.25]# cd /usr/src/httpd-2.4.25
[root@localhost httpd-2.4.25]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-deflate --enable-expires
[root@localhost httpd-2.4.25]# make -j2 && make install
2)配置mod_expires模块启用
[root@localhost httpd-2.4.25]# cd /usr/local/httpd/conf/
[root@localhost conf]# ls
extra httpd.conf httpd.conf.bak httpd.conf.bak1 magic mime.types original
[root@localhost conf]# ls
extra httpd.conf httpd.conf.bak magic mime.types original[root@localhost conf]# mv httpd.conf httpd.conf.bak1
[root@localhost conf]# yum -y install gcc gcc-c++ pcre pcre-devel zlib-devel
[root@localhost httpd-2.4.25]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-deflate --enable-expires
[root@localhost httpd-2.4.25]# make -j2 && make install
2)配置mod_expires模块启用
[root@localhost httpd-2.4.25]# cd /usr/local/httpd/conf/
[root@localhost conf]# ls
extra httpd.conf httpd.conf.bak httpd.conf.bak1 magic mime.types original
[root@localhost conf]# vim httpd.conf
###52行
Listen 192.168.56.25:80
###113行
LoadModule expires_module modules/mod_expires.so
###201行
ServerName www.bdqn.com:80
###--末行添加-
<IfModule mod_expires.c>###打开网页缓存功能ExpiresActive On###设置缓存60秒ExpiresDefault "access plus 60 seconds"
</IfModule>
3)检查安装情况,启动服务
[root@localhost conf]# apachectl -t
Syntax OK
[root@localhost conf]# apachectl -t -D DUMP_MODULES | grep "expires"expires_module (shared)
[root@localhost conf]# systemctl restart httpd
[root@localhost conf]#
4)测试缓存是否生效
在Windows系统中依次安装 Microsoft.NET4 和fiddler 软件,打开fiddler 软件 选择 inspectors --->选择 Headers 浏览器访问 http://192.168.56.25 ,双击200消息查看 Expires 项
4.2 隐藏版本信息
一般情况下,软件的漏洞信息和特定版本是相关的。因此,软件的版本号对攻击者来说是很有价值的,在浏览器中选择“查看元素 ” 可以看到 Apache 的版本 2.4.25 ,如图 4.3 所示。
4.2.1 配置Apache隐藏版本信息
[root@localhost conf]# cd /usr/local/httpd/conf/
[root@localhost conf]# vim httpd.conf
###493行取消注释
Include conf/extra/httpd-default.conf###修改extra/httpd-default.conf配置文件
[root@localhost conf]# vim extra/httpd-default.conf
###55行将原本的 Full 改为 Prod,只显示名称,没有版本
ServerTokens Prod
###重启httpd服务
[root@localhost conf]# systemctl restart http
ServerTokens表示 Server回送给客户端的响应头域是否包含关于服务器OS类型和编译过的模块描述信息
浏览器访问 http://192.168.56.25或者http://www.bdqn.com 查看 Server 项