Apache 网页优化

本章内容:
        掌握 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 的压缩。
 

[root@ppp ~]# 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@ppp ~]# 
(1)重新编译 Apache 添加 mod_deflate 模块
[root@ppp ~]#  cd /usr/src/httpd-2.4.25/
[root@ppp httpd-2.4.25]# yum -y install zlib-devel
[root@ppp httpd-2.4.25]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-deflate
[root@ppp httpd-2.4.25]# cd /usr/local/httpd/conf/
[root@ppp conf]# mv httpd.conf httpd.conf.bak
[root@ppp conf]# systemctl stop httpd.service
[root@ppp conf]# cd /usr/src/httpd-2.4.25/
[root@ppp httpd-2.4.25]# make -j2 && make install

(2)配置mod_deflate模块启用 
[root@ppp httpd-2.4.25]# cd /usr/local/httpd/conf/
[root@ppp conf]# ls
extra  httpd.conf  httpd.conf.bak  magic  mime.types  original
[root@ppp conf]# vim httpd.conf

Listen 192.168.248.96:80                                 ##52行修改端口号
LoadModule deflate_module modules/mod_deflate.so       ##106行取消注释
ServerName www.zwzw.com:80                             ##201行修改域名信息
###最后一行开启gzip功能
###设置对什么样的内容进行gzip压缩
###设置压缩级别1-9之间
###启用deflate模块对本站点的输出进行gzip压缩

    AddOutputFilterByType DEFLATE text/hml text/plain text/css text/xml text/javascrpit text/jpg text/png
    DeflateCompressionLevel 9
    SetOutputFilter DEFLATE
(3)检查安装情况,启动服务
[root@ppp conf]# apachectl -t
Syntax OK
[root@ppp conf]# apachectl -t -D DUMP_MODULES | grep "deflate"
 deflate_module (shared)
[root@ppp conf]# systemctl start httpd.service
[root@ppp conf]# 

测试缓存是否生效

[root@ppp conf]# cd /usr/local/httpd/htdocs/
[root@ppp htdocs]# vim index.html 

 
   

It works!

[root@ppp htdocs]# systemctl restart httpd
4)浏览器访问,使用F12消息查看

Apache 网页优化_第1张图片

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@ppp htdocs]# apachectl -t -D DUMP_MODULES | grep "expires"

如果没有安装mod_expires模块,重新编译安装Apache添加mod_expires模块

[root@ppp ~]# systemctl stop httpd.service
[root@ppp ~]# cd /usr/local/httpd/conf/
[root@ppp conf]# ls
extra  httpd.conf  httpd.conf.bak  magic  mime.types  original
[root@ppp conf]# mv httpd.conf httpd.conf.bak1
[root@ppp conf]# yum -y install gcc gcc-c++ pcre pcre-devel zlib-devel
[root@ppp httpd-2.4.25]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-deflate --enable-expires
[root@ppp httpd-2.4.25]#  make -j2 && make install
(2)配置mod_expires模块启用
[root@ppp httpd-2.4.25]# cd /usr/local/httpd/conf/
[root@ppp conf]# ls
extra  httpd.conf  httpd.conf.bak  httpd.conf.bak1  magic  mime.types  original
[root@ppp conf]# vim httpd.conf

###52行
Listen 192.168.248.96:80
###113行
LoadModule expires_module modules/mod_expires.so
###201行
ServerName www.bdqn.com:80
###--末行添加-

  ###打开网页缓存功能
  ExpiresActive On
  ###设置缓存60秒
  ExpiresDefault "access plus 60 seconds"
(3)检查安装情况,启动服务
[root@ppp conf]# apachectl -t
Syntax OK
[root@ppp conf]# apachectl -t -D DUMP_MODULES | grep "expires"
 expires_module (shared)
[root@ppp conf]# systemctl restart httpd.service
[root@ppp conf]# 

)测试缓存是否生效
        在Windows系统中依次安装 Microsoft.NET4 和fiddler 软件,打开fiddler 软件 选择 inspectors --->选择 Headers 浏览器访问 http://192.168.248.96 ,双击200消息查看 Expires 项

Apache 网页优化_第2张图片

4.2 隐藏版本信息

        一般情况下,软件的漏洞信息和特定版本是相关的。因此,软件的版本号对攻击者来说是很有价值的,在浏览器中选择“查看元素 ” 可以看到 Apache 的版本 2.4.25 

[root@ppp conf]# vim httpd.conf

###493行取消注释
Include conf/extra/httpd-default.conf
###修改extra/httpd-default.conf配置文件
[root@ppp conf]# vim extra/httpd-default.conf
###55行将原本的 Full 改为 Prod,只显示名称,没有版本
ServerTokens Prod
###重启httpd服务
[root@ppp conf]# systemctl restart httpd.service

ServerTokens表示 Server回送给客户端的响应头域是否包含关于服务器OS类型和编译过的模块描述信息

浏览器访问 http://192.168.248.96或者http://www.zwzw.com 查看 Server 项

Apache 网页优化_第3张图片

4.1.2 Apache防盗链
        Apache 的默认配置除了性能可以优化外,还需要对安全性进行相应的配置。默认配置能保证服务器正常提供服务,但 Apache 作为一个软件,必然也会存在一些漏洞,尽可能的降低潜在的风险,是管理员必须掌握的内容。
        一般来说,用户浏览一个完整的页面并不是一次性全部传送到客户端的。如果所请求的页面带有图片或其他信息,那么第一个 HTTP 请求传送的是这个页面的文本,然后通过客户端的浏览器对这段文本进行解释执行。如果发现其中还有图片,那么客户端的浏览器会再第 10 页 共 17 页次发送一条 HTTP 请求,当这个请求被处理后这个图片文件才会被传送到客户端,最后浏览器会将图片安放到页面的正确位置,就这样一个完整的页面要经过多次发送 HTTP 请求才能够被完整的显示。
        基于这样的机制,就会产生盗链问题:如果一个网站中没有其页面中所说图片信息,那么它完全可以链接到其他网站的图片信息上。这样,没有任何资源的网站利用了其他网站的资源来展示给浏览者,提高了自己的访问量,而大部分浏览者又不会很容易地发现。一些不良网站为了不增加成本而扩充自己站点内容,经常盗用其他网站的链接。一方面损害了原网站的合法利益,另一方面又加重了服务器的负担。
        HTTP 标准协议中有专门的 Referer 字段记录,它的作用如下。
可以追溯上一个入站地址是什么
对于资源文件,可以跟踪到包含显示它的网页地址是什么,因此所有防盗链方法都是基 于这个 Referer 字段

1. 配置防盗链

        准备两台服务器、一台客户端,且两台服务器上已分别部署完 Apache 服务

(1)在 Windows 系统中访问 http://192.168.248.216和 http://192.168.248.96,确保 Apache 工作正常

2. 检查是否安装mod_rewrite模块

检查是否安装mod_rewrite模块

[root@ppp ~]# apachectl -t -D DUMP_MODULES | grep "rewrite"

如果没有安装mod_rewrite模块,重新编译安装 Apache 添加mod_rewrite模块

[root@ppp ~]# systemctl stop httpd.service
[root@ppp ~]# cd /usr/local/httpd/conf/
[root@ppp conf]# mv httpd.conf httpd.conf.bak2
[root@ppp conf]# yum -y install gcc gcc-c++ pcre pcre-devel zlib-devel
[root@ppp httpd-2.4.25]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-deflate --enable-expires
[root@ppp httpd-2.4.25]# make -j2 && make install

配置mod_rewrite模块启用并两台网站主机编写hosts文件

[root@ppp conf]# vim httpd.conf
###159行
LoadModule rewrite_module modules/mod_rewrite.so
###201行
ServerName www.accp.com:80
251     Require all granted
252     RewriteEngine On
253     RewriteCond %{HTTP_REFERER} !^http://accp.com/.*$ [NC]
254     RewriteCond %{HTTP_REFERER} !^http://accp.com$ [NC]
255     RewriteCond %{HTTP_REFERER} !^http://www.accp.com/.*$ [NC]
256     RewriteCond %{HTTP_REFERER} !^http://www.accp.com/$ [NC]
257     RewriteRule .*\.(gif|jpg|swf)$ http://www.accp.com/error.jpg
258 
[root@nmd ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.248.215  www.bdqn.com
192.168.248.96   www.accp.com
[root@nmd ~]# 
[root@ppp htdocs]# systemctl restart httpd.service

RewriteCond %{HTTP_REFERER} !^http://www.abc.com/.*$ [NC] 的字段含义:

  %{HTTP_REFERER} :存放一个链接的 URL,表示从哪个链接中转访问目录下的静态资源。

  !^”:表示不以后面的字符串开头。

  http://www.abc.com”:是本网站的路径,按整个字符串匹配。

  .*$”:表示以任意字符结尾。

  [NC] :表示不区分大小写字母。

RewriteRule .*\.(gif|jpg|swf)$ http://www.abc.com/error.png 的字段含义:

  . :表示匹配一个字符。

  *”:表示匹配 0 到多个字符,与.合起来的意思是匹配 0 到多次前面的任意字符,如果是 1 到多次匹配可以用+表示。

  “\.”:在这里的\是转义符,\.就代表符号.的意思。因为.在指令中是属于规则字符,有相应的含义, 如果需要匹配,需要在前面加个转义符\,其它规则字符如果需要匹配,也做同样处理。

  (gif|jpg|swf)$ :表示匹配gif、jpg、swf任意一个,$表示结束。最后的规则是以.gif、.jpg、.swf结尾, 前面是1到多个字符的字符串,也就是匹配图片类型的文件。

  http://www.abc.com/error.png :表示转发到这个路径 。

3. 网页准备

web源主机配置

[root@ppp conf]# cd /usr/local/httpd/htdocs/
[root@ppp htdocs]# ls
error.jpg  index.html  nmd.jpg
[root@ppp htdocs]# 
[root@ppp htdocs]# vim index.html 

 
   

www.bdqn.com

盗链网站主机配置

[root@nmd ~]# cd /usr/local/httpd/htdocs/
[root@nmd htdocs]# vim index.html 

  
     

www.accp.com

在盗图网站主机上进行浏览器验证

Apache 网页优化_第4张图片

你可能感兴趣的:(apache)