网站的访问速度是由多个因素所共同决定的,这些因素包括应用程序的响应速度、网络带宽、服务器性能、与客户端之间的网络传输速度等等。其中最重要的一个因素是Apache本身的响应速度。因此当为网站性能所苦恼时,第一个需要着手进行处理的便是尽可能的提升Apache的执行速度,可以使用网页压缩提升应用程序的速度。更重要的是,它完全不需要任何的成本,只不过是会让服务器CPU占用率稍微提升一两个百分点或者更少。
gzip是一种流行的文件压缩算法,目前应用非常广泛,尤其是在Linux平台。当使用gzip压缩一个纯文本文件时,效果是非常明显的,大约可以减少70%以上的文件大小。利用Apache中的gzip模块,可以使用gzip压缩算法来对Apache服务器发布的网页内容进行压缩后再传输到客户端浏览器。经过压缩后,实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度。网页加载速度加快的好处不言而喻。除了节省流量,改善用户的浏览体验外,另一个潜在的好处是gzip与搜索引擎的抓取工具有着更好的关系。
Web服务器接收到浏览器的HTTP请求后,检查浏览器是否支持HTTP压缩(Accept--Encoding信息)。如果浏览器支持HTTP压缩,Web服务器检查请求文件的后缀名。如果请求文件是HTML、CSS等静态文件,Wb服务器到压缩缓冲目录中检查是否己经存在请求文件的最新压缩文件。如果请求文件的压缩文件不存在,Web服务器向浏览器返回未压缩的请求文件,并在压缩缓冲目录中存放请求文件的压缩文件。如果请求文件的最新压缩文件已经存在,则直接返回请求文件的压缩文件。如果请求文件是动态文件,Web服务器动态压缩内容并返回浏览器,压缩内容不存放到压缩缓存目录中。
Apache1,x系列没有内建网页压缩技术,使用的是额外的第三方mod_gzip模块来执行压缩。而Apache2.x官方在开发的时候,就把网页压缩考虑进去,内建了mod_deflate这个模块,用以取代mod_gzip。两者都是使用的gzp压缩算法,它们的运作原理是类似的。
mod_deflate压缩速度略快而mod_gzip的压缩比略高。一般默认情况下,mod_gzip会比mod_deflate多出4%~6%的压缩量。
一般来说,mod_gzip对服务器CPU的占用要高一些。mod_def1late是专门为确保服务器的性能而使用的一个压缩模块,mod deflate需要较少的资源来压缩文件。这意味着在高流量的服务器,使用mod_deflate可能会比mod_gzip加载速度更快。
简而言之,如果网站访问量较小,想要加快网页的加载速度,就使用mod_gzip。虽然会额外耗费一些服务器资源,但也是值得的。如果网站访问量较大,并且使用的是共享的虚拟主机,所分配系统资源有限的话,使用mod deflate将会是更好的选择。
检查mod_deflate模块
[root@apache httpd-2.4.25#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@apache~#apachectl-t-D DUMP_MODULES grep"deflate"
[root@apache~#tar zxf httpd-2.4.25.tar.gz-C /usr/src
[root@apache~#cd /usr/src/httpd-2.4.25/
[root@apache
httpd-2.4.25#./configure-prefix=/usr/local/httpd--enable-so-enable-rewrite--enable-charset-l
ite--enable-cgi-enable-deflate
[root@apache httpd-2.4.25#make &make install
[root@apache httpd-2.4.25#In-s /usr/local/httpd/bin/*/usr/local/bin
在httpd.conf文件,开启LoadModule deflate_module modules/.mod_deflate.so配置
项,在文本末尾添加一下参数。
[root@apache~#vim /usr/local/httpd/conf/httpd.conf
.略.…
LoadModule deflate module modules/mod deflate.so
.略.
DeflateCompressionLevel 6
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/csstext/javascript
application/x-javascript application/javascript application/json
SetEnvlfNoCase Request_URI.(?:gifljpe?glpng)s no-gzip dont-vary
∥设置不对后缀gif,jpg,jpeg,png的图片文件进行压缩
SetEnvlfNoCase Request_URI .(?:exelt?gz|zip|bz2|sitrar)$no-gzip
dont-vary
设置不对exe,tgz,gz等文件进行压缩
SetEnvlfNoCase Request_URI .(?pdflmovlavilmp3|mp4|rm)S no-gzip
dont-vary
AddOutputFilterByType DEFLATE text/*
∥设置对文件是文本的内容进行压缩,例如text/html text/css text/plain等
AddOutputFilterBy Type
DEFLATE
application/ms*
application/vnd*
application/postscript application/javascrpt
application/x-javascript
∥设置对javascript文件进行压缩
AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp
∥设置apache对php类型的文件进行压缩
检测httpd.conf语法,然后重新启动Apache服务器,并检查mod deflate模块安装情况。
[root@apache~#apachectl-t
Syntax OK
[root@apache~#apachectl restart
[root@apache~]#apachectl -t-D DUMP_MODULES grep "deflate"
deflate_module (shared)
使用火狐浏览器访问Apache服务器的URL地址,在浏览器中选择“查看元素”可以看
到有“Accept--Encoding:gzip”表示压缩已经生效,如图所示。
网页缓存是将一部分经常不会改变和变动很少的页面缓存,下次浏览器再次访问这些页面时 ,不需要再次去下载这些页面,从而提高了用户的访问速度。
Apache的mod_expires 模块会自动生成页 面头部信息中的Expi「es标签和Cache-Control标签, 客户端 浏览器根据标签决定下次访问是在本地机器的缓存中获取页面,不需要向服务器再次发出请求,从而降低客户端的访问频率和次数,达到减少不必要的流量和增加访问速度的目的。
配置mod_expires模块的步骤与mod_deflate模块相似。
启用mod_expires模块之前, 可以用 浏览器先抓取数据包, 然后修改httpd.conf文件再抓 取数据包进行对比 。在httpd.conf 去掉LoadModule expires_modulemodules/mod_expires.so前面的#注释, 末尾加入以下内容。
[root@apache~]#vim /usr/local/httpd/conf/httpd.conf
...略
LoadModule expires_module modules/mod_expires.so
...略
ExpiresActive On
ExpiresDefault "access plus 60 seconds"
[root@apache~]#apachectl -t
Syntax OK
使用火狐浏览器访问Apache服务器的URL地址, 在浏览器中选择“查看元素”可以查看到响应头中包含了Expires项如图所示, 说明缓存已经工作。
一般情况下,软件的漏洞信息和特定版本是相关的。因此,软件的版本号对攻击者来说是很有价值的,在浏览器中选择 查看元素 可以看到Apache的版本2.4.25,如图所示。
如果黑客或别有用心的人得到Apache的版本信息,就会有针对性的进行攻击,给网站造成很大的损失。所以实际生产环境中要隐藏Apache的版本号,减少受攻击的风险,保护服务器安全运行。
修改httpd.conf配置文件,使httpd-defauItc.onf文件生效,它里面包含了是否返回版本信息的内容。
[root@apache~]#vim /usr/local/httpd/conf/httpd.conf
Include conf/exlra/htlpd-default.conf //去掉前面的#
然后,修改httpd-defauIt.conf文件。
[root@apache~]#vim /usr/local/httpd/conf/extra/httpd-default.conf
ServerTokens Prod //将原本的Full改为Prod
重新启动Apache服务,使用火狐浏览器访问Apache服务器的URL地址,在浏览器中选择查看元素”可以查看到Apache的版本号已隐藏,如图所示。
显示Server:Apache,版本信息已经被隐藏。ServerTokens表示Server回送给客户端的回应头域是否包含关于服务器OS类型和编译进的模块描述信息,这里设置的是Prod。表列出ServerTokens的选项以及输出格式。
选项 | 输出格式 |
Prop | Serve:Apache |
Major | Serve:Apache/2 |
Minor | Server:Apache/2.4 |
OS | Server: Apache/2.4.25 (Unix) |
Full | Serve:Apache/2.4.25 (Unix) PHP/4.2.2 MyMod/1.2 |
Apache的默认配置除了性能可以优化外,还需要对安全性进行相应的配置。默认配置能保证服务器正常提供服务,但Apache作为一个软件,必然也会存在一些湍洞,尽可能的降低潜在的风险,是管理员必须掌握的内容。
HTTP标准协议中有专门的Referer字段记录,它的作用如下。
准备两台服务器、一台客户端,且两台服务器上已分别部署完Apache服务。具体实验环境如表所示。
主机 | 操作系统 | 主要软件及版本 |
apache1 | CentOS 7.3 | httpd-2.4.25.tar.gz |
apache1 | CentOS 7.3 | httpd-2.4.25.tar.gz |
客户端 | Windows 10 | 火狐浏览器 |
把图片复制到主服务器(www.kxr.com)的Apache工作目录/usr/local/httpd/htdocs,确保图片存在。
[root@apache1 htdocs]#Is
index.html logo.jpg
修改index.html网页文件,加入图片显示代码。
[root@apache1 htdocs]#vim index.html
lt work!
//网页中显示图片的代码
在www.dt.com服务器修改index.html文件,加入盗取图片链接。
[root@apache2 htdocs]#vim index.html
lt daotu
//盗取链接图片
访问www.dt.com图片即可显示。
[root@apache conf]#vim httpd.conf
...略...
LoadModule rewrite module modules/mod rewrite.so //去掉#注释
...略...
...略...
AllowOverride ALL //改为ALL
...略...
RewriteEngine On //加入mode_rewrite模块内容
RewriteCond %[HTTP_REFERER)!http://kxr.com/.*$[NC]
RewriteCond %(HTTP_REFERER)!http://kxr.com$[NC]
RewriteCond %(HTTP_REFERER)!http://www.kxr.com/.*$[NC]
Rewrite Cond %[HTTP_REFERER)!http://ww.kxr.com/$[NC]RewriteRule ..(gifljpg|swf)S http://www.kxr.com/error.png
mod rewrite模块需要在httpd.conf文件启用才能生效。
[root@apache conf#apachectl -t
Syntax OK
然后重新启动Apache服务器。
(3)mod_rewrite模块主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言,可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式。
(4)基于服务器级的(htpd.conf)有两种方法,一种是在htpd.conf的全局下直接利用RewriteEngine on来打开rewrite功能:另一种是在局部里利用RewriteEngine on来打开rewrite功能。
(5)基于目录级的(.htaccess),要注意一点就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。
(6)开启rewrite功能后,需要设置RewriteCond指令,它定义了匹配规则。如果符合某个或某几个条件,则执行RewriteCond下面紧邻的RewriteRule指令。如果不匹配,则后面的规则不再匹配,RewriteRule则定义需要重定向到的路径。
匹配规则如表所示。
规则 | 描述 |
%{HTTP REFERERY} | 浏览header中的链接字段,存放一个链接的URL,代表是从哪个链接访问所需的网页 |
!^ | 不以后面的字符串开头 |
.*$ | 以任意字符结尾 |
NC | 不区分大小写 |
R | 强制跳转 |
? | 匹配0到1个字符 |
* | 匹配0到多个字符 |
+ | 匹配1到多个字符 |
^ | 字符串开始标志 |
$ | 字符串结束标志 |
. | 匹配任何单字符 |
(7)RewriteEngine On打开了重写引擎,根据匹配规则我们分析RewriteCond%{HTTP_REFERER}!http:lww.kxr.coml.*$[NC]"含义。
最后的规则是不以http://www.kxr.com”为路径,即不是本网站进行访问,后面是任意字符都可以匹配成功,其它几项可对照规则表分析。
(8)如果请求路径被匹配,执行重定“RewriteRule.i.(gifljpglswf)$http:/www.kxr.com/eror.png”。
整个配置的含义是本网站以外的站点访问本站的图片文件时,显示error.png这个图片。
重启服务器,并且清除浏览器的缓存,避免从本地读取缓存内容,复制error.png这个
图片到工作目录usr/local/httpd/htdocs,再次访问网站,如图所示。