小阿轩yx-Apache 网页优化
网页压缩与缓存
对Apache服务器优化配置
- 能让 Apache 发挥出更好的性能
相反,配置糟糕
- Apache可能无法正常服务
网页压缩
网站的访问速度是由多个因素所共同决定的
包括应用程序
- 响应速度
- 网络带宽
- 服务器性能
- 与客户端之间的网络传输速度等等
(注:其中最重要的一个因素是 Apache本身的响应速度)
网站性能需要着手进行处理
- 尽可能的提升 Apache 的执行速度
- 可以使用网页压缩提升应用程序的速度
更重要的好处
- 它完全不需要任何的成本
(注:只不过是会让服务器 CPU 占用率稍微提升一两个百分点或者更少)
gzip 介绍
- 是一种流行的文件压缩算法
- 目前应用非常广泛,尤其是在 Linux 平台
好处
- 大约可以减少 70%以上的文件大小
- 经过压缩后,实际上降低了网络传输的字节数
(注:最明显的好处就是可以加快网页加载的速度)
网页加载速度加快的好处
- 节省流量
- 改善用户的浏览体验外
- 另一个潜在的好处是 gzip 与搜索引擎的抓取工具有着更好的关系
HTTP 压缩的过程
Web 服务器接收到浏览器的 HTTP 请求后,检查浏览器是否支持 HTTP 压缩(Accept-Encoding 信息)。
- 如果浏览器支持 HTTP 压缩,Web 服务器检查请求文件的后缀名。
- 如果请求文件是 HTML、CSS 等静态文件,Web服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件。
- 如果请求文件的压缩文件不存在,Web服务器向浏览器返回未压缩的请求文件,并在压缩缓冲目录中存放请求文件的压缩文件。
- 如果请求文件的最新压缩文件已经存在,则直接返回请求文件的压缩文件。
- 如果请求文件是动态文件,Web服务器动态压缩内容并返回浏览器,压缩内容不存放到压缩缓存目录中。
Apache 的压缩模块
Apache 1.x系列
- 没有内建网页压缩技术
- 使用的是额外的第三方 mod gzip 模块来执行压缩
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 的压缩
mod_deflate 模块
检查是否安装 mod_deflate 模块
[root@www ~]# apachectl -t -D DUMP_MODULES
安装时启用此功能
# 安装时编译 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
配置 mod_deflate 模块启用
[root@localhost htdocs]# vim /usr/local/httpd/conf/httpd.confLoadModule 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>
检查安装情况
[root@apache~# apachectl -t
Syntax OK
[root@apache~l# apachectl restart
[root@apache ~]# apachectl -t -D DUMP MODULES | grep "deflate"deflate module (shared)
测试 mod_deflate 压缩模块是否生效
http://192.168.10.101/test1.php
(注意:查看前面测试php的页面按F12可以打开)
网页缓存
- 将一部分经常不会改变和变动很少的页面缓存
- 下次浏览器再次访问这些页面时
- 不需要再次去下载这些页面,从而提高了用户的访问速度
Apache 的 mod expires 模块会自动生成页面头部信息中
- Expires 标签
- Cache-Control标签
客户端浏览器根据标签决定下次访问是在本地机器的缓存中获取页面,不需要向服务器再次发出请求
从而降低客户端的访问频率和次数
达到减少不必要的流量和增加访问速度的目的
(注:配置 mod expires 模块的步骤与 mod deflate 模块相似)
配置 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秒)
检测 httpd.conf 语法
[root@www ~]# apachectl -t
重启 Apache 服务
[root@www ~]# apachectl restart
测试mod_expires 模块,访问网站
http://192.168.10.101/test1.php
(注:查看前面测试php的页面)
隐藏版本信息
软件漏洞信息和特定版本是相关的。软件版本号对攻击者是很有价值的
修改主配置文件
[root@www ~]# vim /usr/local/httpd/conf/httpd.conf
# 去掉前面的注释符
Include conf/extra/httpd-default.conf
修改httpd-default.conf文件
[root@www ~]# vim /usr/local/httpd/conf/extra/httpd-default.confServerTokens Prod
重启并测试
# 查看响应头,Server字段只显示Apache,不再显示版本信息
[root@www ~]# apachectl restart
Apache 防盗链
没有任何资源的网站利用了其他网站的资源来展示给浏览者
好处
- 提高了自己的访问量
- 而大部分浏览者又不会很容易地发现
一些不良网站为了不增加成本而扩充自己站点内容,经常盗用其他网站的链接
- 一方面损害了原网站的合法利益
- 另一方面又加重了服务器的负担
HTTP 标准协议中有专门的 Referer 字段记录,它的作用如下
- 可以追溯上一个入站地址是什么。
- 对于资源文件,可以跟踪到包含显示它的网页地址是什么,因此所有防盗链方法都是基于这个 Referer 字段。
配置防盗链
实验环境
将第一台服务器直接克隆一个,并修改IP地址为192.168.10.201
修改两台服务器的主机名
服务器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
编写带有图片的网页(原图网站)
将图片文logo.jpg件拷贝到apache的网站根目录下并修改网页文件
[root@apache1 ~]# vim /usr/local/httpd/htdocs/index.html
<html>
<body>
<h1>It work! </h1>
<img src="logo.jpg"/>
</body>
</html>
用另一台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>
客户端测试访问,按F12查看
鼠标右键点选图片,选择“查看图像信息”,可以看到图片的网址是www.kxr.com/logo.jpg
模拟盗取图片链接
修改index.html文件加入盗图链接
[root@apache2 htdocs]# vim index.html
<html><body><h1>lt daotu
//盗取链接图片
<img src="http://www.kxr.com/ogo.jpg" />
</h1></body></html>
鼠标右键点选图片,选择“查看图像信息”,可以看到图片的网址是www.kxr.com/logo.jpg
在火狐浏览器右键选择“査看元素"可以看到先对 www.dt.com 请求,然后对 www.kxr.com/logo.jp请求,说明盗链成功
为Apache1 防盗链设置
配置 mod_rewrite 模块启用
[root@apache1 ~]# vim /usr/local/httpd/conf/httpd.conf#去掉前面的注释
LoadModule rewrite_module modules/mod_rewrite.so #修改此网站访问参数
<Directory "/usr/local/httpd/htdocs">AllowOverride NoneRewriteEngine 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>
检测 httpd.conf 语法
[root@apache conf ~]# apache -t
重启服务
[root@apache1 ~]# systemctl restart httpd
(注:AllowOverride ALL)
mod rewrite 模块主要的功能
- 实现 URL 的跳转
- 它的正则表达式是基于 Per语言
可基于的两种方式
- 服务器级(httpd.conf)
- 目录级的(.htaccess)
基于服务器级的(httpd.conf)有两种方法
- 一种是在 httpd.conf的全局下直接利用RewriteEngine on 来打开 rewrite 功能
- 另一种是在局部里利用 RewriteEngine on 来打开rewrite 功能
基于目录级的(.htaccess)
- 要注意一点就是必须打开此目录的 FollowSymLinks 属性且在.htaccess 里要声明 RewriteEngine on。
开启rewrite 功能后
- 需要设置 RewriteCond 指令
它定义了匹配规则
- 如果符合某个或某几个条件,则执行 RewriteCond 下面紧邻的 RewriteRule 指令。
- 如果不匹配,则后面的规则不再匹配,RewriteRule 则定义需要重定向到的路径。
RewriteEngine On打开了重写引擎
根据匹配规则分析“RewriteCond %{HTTP REFERER} !^http://www.kxr.com/.*$ [NC]”含义
- “%{HTTP REFERER}”:表示从哪个 URL 来产生请求。
- “!^”: 表示不是以后面的字符串开头。
- “http:/www.kxr.com”,是本网站的路径,按整个字符串匹配。
- “.*$ ”表示以任意字符结尾。
- “NC"表示不区分大小写字母。
(注:最后的规则是不以“htp://www.kxr.com”为路径,即不是本网站进行访问,后面是任意字符都可以匹配成功)
如果请求路径被匹配,执行重定
“RewriteRule .*.(gifljpglswf)$ http://www.kxr.com/error.png”
(注:RewriteRule中不要添加png的格式,否则客户端看不到error图片)
- “."表示匹配一个字符。
- “*”表示匹配0到多个字符,与".”合起来的意思是匹配1到多个字符,实际上可以只用“+“表示,这里是为了演示使用方式。
- “."在这里表示的是转义字符“”,因为"."在指令中是属于规则字符,有相应的含义如果需要匹配,需要在前面加个“”其它规则字符如果需要匹配,也做同样处理。
- “(gifljpg|swf)”表示匹配“gif”、"jpg”、“sw"任意一个,“$”表示结束。最后的规则是以“.gif”、“jpg”、“.swf结尾,前面是1到多个字符的字符串,也就是匹配图片类型的文件。
- “http:/kwww.kxr.com/error.png”:表示转发到这个路径
(注:整个配置的含义是本网站以外的站点访问本站的图片文件时,显示 error.png 这个图片)
检测 httpd.conf 语法
[root@apache1 ~]# apachectl -t
复制 error.png 这个图片到benet站点的工作目录 /usr/local/httpd/htdocs,再次访问网站
可以看到防盗链图片已经工作,其它网站盗链,返回给它禁止盗链的图片。使用火狐浏览器可以看到 logo.jpg 的 htp 状态码是 302,它表示重定向,再次说明防盗链配置成功。
小阿轩yx-Apache 网页优化