Apache网页优化
在企业中,部署Apache后若只采用默认的配置参数,会引发网站很多问题,不适合企业生产环境的需 要。为了适应企业需求,就需要考虑如何提升Apache的性能与稳定性,这就是Apache优化的内容。
一、网页压缩
网站的访问速度是由多个因素所共同决定的, 这些因素包括应用程序的响应速度、 网络带宽、服务器性 能、与客户端之间的网络传输速度等等。其中最重要的一个因素是 Apache本身的响应速度。为了尽可 能提高Apache 的执行速度,可以使用网页压缩提升应用程序的速度。
gzip介绍
gzip 是一种流行的文件压缩算法, 目前应用非常广泛, 尤其是在 Linux 平台。 当使用gzip 压缩一个纯 文本文件时, 效果是非常明显的, 大约可以减少 70%以上的文件大小。 利用 Apache 中的 gzip 模块, 可以使用 gzip 压缩算法来对 Apache 服务器发布的网页内容进行压缩后再传输到客户端浏览器。 经过 压缩后, 实际上降低了网络传输的字节数, 最明显的好处就是可以加快网页加载的速度。
HTTP压缩的过程
Web 服务器接收到浏览器的 HTTP 请求后,检查浏览器是否支持 HTTP 压缩(Accept-Encoding 信 息)。如果浏览器支持HTTP压缩,Web服务器检查请求文件的后缀名。如果请求文件是 HTML、CSS 等 静态文件,Web服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件。 如果请求文件的 压缩文件不存在,Web 服务器向浏览器返回未压缩的请求文件, 并在压缩缓冲目录中存放请求文件的 压缩文件。 如果请求文件的最新压缩文件已经存在, 则直接返回请求文件的压缩文件。 如果请求文件 是动态文件, Web服务器动态压缩内容并返回浏览器, 压缩内容不存放到压缩缓存目录中。
Apache的压缩模块
Apache实现网页压缩的功能模块包括:
- mod_gzip模块
- mod_deflate模块
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 需要较少的资源来压缩文件。这意味着在高流量的Web服务器中,使 用 mod_deflate 可能会比 mod_gzip 加载速度更快。
Apache 2.4.25 版本中 mod_deflate 模块,可使用 DeflateCompressionLevel 指令设置压缩级别。该 指令的值可为 1(压缩速度最快,最低的压缩质量)至 9(最慢的压缩速度, 压缩率最高)之间的整 数,其默认值为 6(压缩速度和压缩质量较为平衡的值)。这个简单的变化更是使得 mod_deflate 可以 轻松媲美 mod_gzip 的压缩。
1)检查httpd是否安装 mod_deflate 模块
[root@centos7 ~]# apachectl -t -D DUMP_MODULES | grep "deflate"
[root@centos7 ~]# apachectl -M | grep "deflate" (两种方法都可 以)
2)编译安装 mod_deflate 模块
若没有安装则需要重新编译安装
# 重新编译 Apache 添加 mod_deflate 模块
# 重新编译的过程需要 zlib-devel依赖包
[root@centos7 ~]# cd /usr/local/httpd/conf
[root@centos7 conf]# mv httpd.conf httpd.conf.bak //备份配置文件
[root@centos7 ~]# systemctl stop httpd
[root@centos7 ~]# yum -y install apr-util-devel pcre-devel zlib-devel gcc gcc-c++ make
[root@centos7 ~]# tar zxf httpd-2.4.25.tar.gz -C /usr/src
[root@centos7 ~]# cd /usr/src/httpd-2.4.25/
[root@centos7 httpd-2.4.25]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite -enable-charset-lite --enable-cgi --enable-deflate
[root@centos7 httpd-2.4.25]# make && make install
[root@centos7 httpd-2.4.25]# ln -sf /usr/local/httpd/bin/* /usr/local/bin
[root@centos7 httpd-2.4.25]# cd /usr/local/httpd/conf/
[root@centos7 conf]# mv httpd.conf.bak httpd.conf //还原文件
3)配置 mod_deflate 模块
[root@centos7 ~]# vim /usr/local/httpd/conf/httpd.conf
#Include conf/extra/httpd-vhosts.conf //关闭虚拟站点
LoadModule deflate_module modules/mod_deflate.so //112行附近添加
# 以下内容加
<IfModule mod_deflate.c>
DeflateCompressionLevel 6 #代表压缩级别,范围为1~9;
SetOutputFilter DEFLATE #代表启用deflate 模块对本站点的输出进行gzip压缩
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css
text/javascript text/jpg text/png
</Ifmodule>
4)重新启动 Apache,并检查 mod_deflate 模块安装情况;
[root@centos7 ~]# apachectl -t //检测语法
[root@centos7 ~]# apachectl restart
[root@centos7 ~]# apachectl -t -D DUMP_MODULES | grep "deflate"
deflate_module (shared)
5)测试
将 a.jpg 图片上传到网站发布目录中
[root@centos7 ~]# ls /usr/local/httpd/htdocs/
index.html a.jpg
[root@centos7 htdocs]# vim index.html
<html>
<body>
<hl> It works! </h1>
<img src="a.jpg"/>
</body>
</html>
浏览器访问网站,则在响应头里面查看信息;
二、网页缓存
网页缓存是服务器将一部分经常不会改变或变动很少的网页缓存下来,下次浏览器再次访问这些页面 时,不需要向服务器请求这些页面,从而提高了用户的访问速度。
- 通过mod_expire模块配置Apache,使网页能在客户端浏览器缓存一段时间,以避免重复请求;
- 启用mod_expire模块后,Apache会自动生成页面头部信息中的 Expires 标签和Cache-Control 标 签,从而降低客户端的访问频率和次数,达到减少不必要的流量和增加访问速度的目的。
1)检查httpd是否安装 mod_expires模块
[root@centos7 ~]# apachectl -t -D DUMP_MODULES | grep "expires" (两种都可以) [root@centos7 ~]# apachectl -M | grep "expires"
2)编译安装 mod_expires 模块
[root@centos7 ~]# cd /usr/local/httpd/conf
[root@centos7 conf]# mv httpd.conf httpd.conf.bak //备份配置文件
[root@centos7 ~]# systemctl stop httpd
[root@centos7 ~]# cd /usr/src/httpd-2.4.25/
[root@centos7 ~]# ./configure --prefix=/usr/local/httpd --enable-so --enablerewrite --enable-charset-lite --enable-cgi --enable-deflate --enable-expires
[root@centos7 ~]# make && make install
[root@centos7 ~]# ln -sf /usr/local/httpd/bin/* /usr/local/bin
[root@centos7 ~]# cd /usr/local/httpd/conf/
[root@centos7 ~]# mv httpd.conf.bak httpd.conf //还原配置文件
3)配置 mod_expires 模块
[root@centos7 ~]# vim /usr/local/httpd/conf/httpd.conf
LoadModule expires_module modules/mod_expires.so //前面的#注释 # 末尾添加
<Ifmodule mod_expires.c>
ExpiresActive On //启用mod_expires模块,
ExpiresDefault "access plus 60 seconds" //设置缓存时间为60秒
</IfModule>
4)重新启动httpd服务,并检查 expires 模块;
[root@centos7 ~]# apachectl -t
[root@centos7 ~]# apachectl restart
[root@centos7 ~]# apachectl -t -D DUMP_MODULES | grep "expires"
expires_module (shared)
5)测试
浏览器访问网站,则在响应头里面查看信息;
三、隐藏版本信息
Apache的版本信息,透露了一定的漏洞信息,从而给网站带来安全隐患
生产环境中要配置Apache隐藏版本信息,减少受攻击的风险,保护服务器安全运行。
1)修改配置文件
[root@centos7 ~]# vim /usr/local/httpd/conf/httpd.conf
Include conf/extra/httpd-default.conf //去掉注释#
[root@centos7 ~]# vim /usr/local/httpd/conf/extra/httpd-default.conf
# 将Full改为Prod,只显示名称,没有版本信息
ServerTokens Prod
# 错误网页提示Apache信息关闭
ServerSignature Off
2)检测 httpd.conf 语法,然后重新启动 Apache 服务器
[root@centos7 ~]# apachectl -t
[root@centos7 ~]# apachectl restart
3)测试
浏览器访问网站,则在响应头里面查看信息;
四、配置防盗链
- 防盗链就是防止别人的网站代码里面盗用服务器的图片,文件,视频等相关资源
- 如果别人盗用网站的这些静态资源,明显的是会增大服务器的带宽压力。
- 作为网站的维护人员,要杜绝我们服务器的静态资源被其他网站盗用。
配置规则变量说明
- %{HTTP_ REFERER}:浏览header中的链接字段,存放一个链接的URL,代表是从哪个链接访问所 需的网页
- !^:不以后面的字符串开头
- .*$: 以任意字符结尾
- NC:不区分大写
- R:强制跳转
规则匹配说明
如果相应变量的值匹配所设置的规则,则逐条往下处理;如果不匹配,则往后的规则不再匹配;
- RewriteEngine On:打开网页重写功能
- RewriteCond:设置匹配规则(条件)
- RewriteRule:设置跳转动作(操作)
实验步骤
操作系统 | 软件名 | 域名 | 名称 |
CentOS7.9 | httpd-2.4.25.tar.gz | www.kgc.com | 源主机 |
CentOS7.9 | httpd-2.4.25.tar.gz | www.test.com | 盗链主机 |
1)两台虚拟机分别安装http服务;
2)源主机准备图片
# 将 a.jpg 和 error.png 图片上传到网站发布目录中
[root@www ~]# ls /usr/local/httpd/htdocs/
index.html a.jpg error.png
# 修改网页
[root@www htdocs]# vim index.html
<html>
<body>
<h1> It works!</h1>
<img src="a.jpg"/>
</body>
</html>
3)模拟盗取图片
在盗链主机中修改网页
[root@www ~]# cd /var/www/html/
[root@www html]# vim index.html
<html>
<body>
<h1>this is daolian web!!</h1>
<img src="http://www.kgc.com/a.ipg"/>
</body>
</html>
4)在盗链主机上修改hosts文件
[root@www ~]# vim /etc/hosts
192.168.10.128 www.kgc.com
192.168.10.130 www.test.com
5)访问 www.test.com,并查看;
6)源主机开启防盗链功能
[root@www ~]# vim /usr/local/httpd/conf/httpd.conf
#Include conf/extra/httpd-vhosts.conf //关闭虚拟站点
LoadModule rewrite_module modules/mod_rewrite.so //去掉注释#
#末尾添加
<Directory "/usr/local/httpd/htdocs">
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://kgc.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://kgc.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.kgc.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.kgc.com$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://www.kgc.com/error.png
</Directory>
[root@www ~]# httpd -t
[root@www ~]# systemctl restart http
其中各代码的含义如下:
- RewriteEngine On:打开地址重写功能;
%{HTTP_REFERER}:表示从哪个 URL 来产生请求。
“!”: 表示不是以后面的字符串开头。
- “.*$ ” :表示以任意字符结尾
- “NC ”:表示不区分大小写字母
- 最后的规则是不以“http://www.kgc.com ”为路径, 即不是本网站进行访问, 后面是任意字符都可 以匹配成功;
- 如果请求路径被匹配, 执行跳转 “RewriteRule .*\.(gif|jpg|swf)$
http://www.kgc.com/error.png” 。
- 整个配置的含义是本网站以外的站点访问本站的图片文件时, 显示 error.png 这个图片。
7)再次访问 www.test.com,并查看;