深度优化Apache

关于Apache的优化分为如下几个步骤:html

  • Apache的Gzip(deflate)功能;
  • Apache的缓存设置;
  • Apache禁止目录遍历;
  • Apache隐藏版本目录;
  • Apache日志分割;
  • Apache配置防盗链;

1、Apache的gzip(deflate)功能

gzip能够极大的加速网站,使用gzip功能有时压缩比率高到80%以上,最少都有40%以上,因此说gzip功能是很是强大的,仍是不错的。apache

在Apache2以后的版本,模块名不叫gzip,而叫mod_deflatevim

未使用gzip时,网页中传输文件的过程,如图:
深度优化Apache浏览器

使用gzip时,网页中传输文件的过程,如图:
深度优化Apache缓存

本次博文案例环境,能够参考博文:Apache的安装部署及工做模式详解安全

若是要使用gzip(deflate)的功能,必定要打开两个模块:服务器

LoadModule deflate_module  modules/mod_deflate.so
//模块的做用:对传输到客户端的代码进行gzip压缩
LoadModule headers_module modules/mod_headers.so
//模块的做用:告诉客户端的浏览器,传输的文件使用了gzip压缩。若是不开启的话,则没法正常显示网页内容
[root@localhost ~]# apachectl -M | grep deflate
//检查mod_deflate模块是否安装,若是没有任何返回信息则表示没有安装

安装方法有两种:ide

  • 编译时添加“--enable-deflate”选项便可安装;
  • 使用DSO方式进行安装;

自己Apache已经安装完成,因此这里就是用DSO方式进行安装了工具

[root@localhost ~]# cd /usr/src/httpd-2.4.23/modules/filters/
//切换到Apache源码包mod_deflate所在的目录下
[root@localhost filters]#  /usr/local/http-2.4.23/bin/apxs -c -i -a mod_deflate.c
//使用apxs命令进行安装

apxs命令参数的解释:测试

  • -i:表示须要执行安装操做,以安装一个或多个动态共享对象到服务器的modules目录中;
  • -a:表示会自动增长一个 LoadModule 行到 httpd.conf 文件中,以启用此模块,或者,若是 此行已经存在,则启用之;
  • -c:表示须要执行编译操做。

在安装过程当中会出现这样的错误信息,如图:
深度优化Apache
这样的错误信息即表示缺乏zlib-devel的安装包,使用“yum -y install zlib-devel”便可,再次从新安装mod_deflate模块!

[root@localhost filters]# ll /usr/local/http-2.4.23/modules/mod_deflate.so 
-rwxr-xr-x. 1 root root 98160 11月 22 18:53 /usr/local/http-2.4.23/modules/mod_deflate.so
//确认文件已经存在

检查Apache主配置文件出现如下状况:

[root@localhost ~]# apachectl -t
httpd: Syntax error on line 104 of /usr/local/http-2.4.23/conf/httpd.conf: Cannot load modules/mod_deflate.so into server: /usr/local/http-2.4.23/modules/mod_deflate.so: undefined symbol: inflate

解决方法:

须要在Apache主配置文件的 LoadModule deflate_module modules/mod_deflate.so 这行的上一行添加LoadFile /usr/local/zlib/lib/libz.so
便可,如图:
深度优化Apache

[root@localhost ~]# apachectl -t
Syntax OK                  //检查其配置文件没有错误
[root@localhost ~]# apachectl restart         
//从新启动Apache服务

接下来修改Apache主配置文件,使其开启gzip压缩传输功能:

LoadModule deflate_module  modules/mod_deflate.so
//这个模块的做用:对传输到客户端的代码进行gzip压缩
LoadModule headers_module modules/mod_headers.so
//这个模块的做用:告诉客户端的浏览器,传输的文件使用了gzip压缩。若是不开启的话,则没法正常显示网页内容
//查看Apache主配置文件必须保证这两个模块已经被启用

在Apache主配置文件中(我的建议在末尾)添加以下内容:

<IfModule mod_deflate.c>           //表示须要启用mod_deflate模块
DeflateCompressionLevel 9        //压缩程度的等级
SetOutputFilter DEFLATE           //设置输出过滤器,对输出启用压缩功能
AddOutputFilterByType DEFLATE text/*          //设置对文件是文本格式的进行压缩
SetEnvIfNoCase Reques t_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary      
//设置不对后缀为 gif,jpg,jpeg,png 的图片文件进行压缩。?:表示不会捕获 ( )里内容了 
</IfModule>

//如下内容是设置日志输出
DeflateFilterNote Input input_info                //声明输入流的 byte 数量 
DeflateFilterNote Output output_info           //声明输出流的 byte 数量 
DeflateFilterNote Ratio ratio_info                //声明压缩的百分比 
LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate           //声明日志格式 
CustomLog logs/deflate_log.log deflate          //指定日志的存放路径

考虑到粘贴复制的问题,这里附上Apache文件中添加的内容(不带注释)

<IfModule mod_deflate.c>
DeflateCompressionLevel 9
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/*
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
</IfModule>

DeflateFilterNote Input input_info
DeflateFilterNote Output output_info
DeflateFilterNote Ratio ratio_info
LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate
CustomLog logs/deflate_log.log deflate

修改完成以后,从新启用Apache服务,并使用浏览器进行测试(使用F12开启开发者模式,并使用F5进行刷新),如图:
深度优化Apache

[root@localhost ~]# cat /usr/local/http-2.4.23/logs/deflate_log.log
//查看deflate的日志(日志路径在配置文件中已经定义)
"GET / HTTP/1.1" -/- (-%)
"GET /favicon.ico HTTP/1.1" -/- (-%)
"GET / HTTP/1.1" -/- (-%)
"GET / HTTP/1.1" 76/4725 (1%)
"GET / HTTP/1.1" 76/4725 (1%)   //能够看出压缩比例达到了99%
"-" -/- (-%)

注意:图片是不须要被压缩的,flash的swf文件也是不用压缩的(这两个东西压缩以后会出现意想不到的效果)

2、Apache的缓存设置

Apache的缓存设置主要依赖于 mod_expires 模块 ,启用模块后,能够减小20%~30%左右的重复请求,让重复的用户请求结果都缓存在本地。注意更新快的文件不要这么作

mod_expires模块控制服务器应答时的 Expires 头内容和 Cache-Control 头的 max-age 指令。有效期 (expiration date)能够设置为相对于源文件的最后修改时刻或者客户端的访问时刻。

未启用 mod_expires模块expire缓存的效果:
深度优化Apache

启用mod_expires模块expire缓存,方法以下:

LoadModule expires_module modules/mod_expires.so 
//查看Apache的主配置文件,必要要保证这个模块被启用

而后在Apache主配置文件末尾添加如下内容:

<IfModule mod_expires.c>             //表示启用expires模块
ExpiresActive On                             //启用expires功能
ExpiresByType text/html "access plus 2 minute"         
//设置后缀为html的文本文件保存时间为两分钟
ExpiresByType image/jpeg "access plus 1 mouth"        
//设置后缀为jpeg的图片信息保存时间为一个月
ExpiresDefault "now plus 0 minute"
//其余默认没有被定义的不进行缓存
</IfModule>

不带注释的配置文件:

<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/html "access plus 2 minute"
ExpiresByType image/jpeg "access plus 1 mouth"
ExpiresDefault "now plus 0 minute"
</IfModule>

测试效果以下:
深度优化Apache
深度优化Apache

缓存机制的配置格式:

ExpiresByType type/encoding "<base> [plus] {<num><type>}"
ExpiresDefault "<base> [plus] {<num><type>}"

一、其中<base>是下列之一:
access(相对于客户端访问的时间)
now(至关于access)
modification(相对于最后一次修改源文件后的缓存时间)
二、该plus关键字是可选的。num 应该是整数值,而且type是如下之一:
years
months
weeks
days
hours
minutes
seconds

也可使用如下格式来定义缓存机制:

ExpiresByType image/jpeg A2592000   //表示图片的缓存是1个月
ExpiresByType text/html M604800    //表示HTML文档的有效期是最后修改时刻后的一星期
//"M"表示源文件的最后修改时刻,"A"表示客户端对源文件的访问时刻。后面的时间则以秒计 算。

具体介绍能够参考官方文档

3、Apache禁止目录遍历

访问Apache时,默认访问的时Apache网页根目录下的index.html,如何这个文件不存在的话,就会出现如下状况:
深度优化Apache
为了防止出现以上状况须要修改Apache的配置文件:
深度优化Apache
从新启动服务以后,就会出现这种状况:
深度优化Apache

4、Apache隐藏版本目录

不进行修改,默认的版本信息:
深度优化Apache
这样轻易的出如今互联网上,显然是不安全的。能够经过如下操做进行优化处理,方法以下:

在Apache主配置文件中启用 httpd-default.conf 
Include conf/extra/httpd-default.conf 
//去除以前的#号
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/extra/httpd-default.conf 
//找到
ServerTokens Full 
ServerSignature On
//修改成如下内容
ServerTokens Prod
ServerSignature Off

从新启动服务以后,再次进行查看:
深度优化Apache

若是须要完全的改变版本之类的信息,那么须要在编译以前,修改源码包下 include 目录下的 ap_release.h 。

[root@localhost ~]# vim /usr/src/httpd-2.4.23/include/ap_release.h 
//这是本人的解压路径,各位根据实际状况
//修改的内容以下:
#define AP_SERVER_BASEVENDOR "Apache Software Foundation" //服务的供应商名称
#define AP_SERVER_BASEPROJECT "Apache HTTP Server"  //服务的项目名称
#define AP_SERVER_BASEPRODUCT "Apache" //服务的产品名
#define AP_SERVER_MAJORVERSION_NUMBER 2 //主要版本号
#define AP_SERVER_MINORVERSION_NUMBER 4 //小版本号
#define AP_SERVER_PATCHLEVEL_NUMBER 23 //补丁级别
#define AP_SERVER_DEVBUILD_BOOLEAN 0 
//上述行无需将行首的“#”号删除

根据注释修改为本身想要的,编译安装便可!

5、Apache日志分割

随着网站的访问量愈来愈大,产生的日志文件也就会愈来愈大,若是不对日志进行分隔处理,日志文件会越存越大,不易备份,并且只能一次性将Apache的日志所有删除,这样就会丢失不少对网站宝贵的信息,所以管理好这些海量的日志对网站来讲十分重要。

对日志进行分隔处理能够经过如下两种方法:

方法 1:使用 rotatelogs(apache 自带的工具)每隔一天记录一个日志

修改Apache的主配置文件,更改内容以下:
//找到如下两行,进行注释:
ErrorLog logs/error_log 
CustomLog logs/access_log common 
//而后最好在CustomLog "logs/access_log" common配置的下一行添加以下内容(如下内容不能够直接复制,请看下面的解释):
ErrorLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/error_%Y-%m-%d.log 86400"
CustomLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/access_%Y-%m-%d.log 86400" combined
//这里是要填写rotatelogs工具的绝对路径

在上面添加的内容中,86400为轮转的时间,单位是秒(也就是一天生成一个日志文件)。

[root@localhost ~]# systemctl restart httpd
//重启Apache服务
[root@localhost ~]# ls /usr/local/http-2.4.23/logs/
access_2019-11-23.log  access_log  error_2019-11-23.log  error_log  httpd.pid
//查看日志文件,第一次可能只会出现错误日志,访问一下,访问日志便可产生

这样就已经实现了日志按天进行分割存放!

因为 apache 自带的日志轮询工具 rotatelogs,听说在进行日志切割时容易丢日志,所以咱们一般使用 cronolog (也就是方法2)进行日志轮询。

方法2:使用cronolog为每一天创建一个新的日志

一样也是在Apache的主配置文件中注释掉如下两行:
ErrorLog "logs/error_log"
CustomLog "logs/access_log" common

下载cronolog源码包

[root@localhost ~]# tar zxf cronolog-1.6.2.tar.gz -C /usr/src
[root@localhost ~]# cd /usr/src/cronolog-1.6.2/
[root@localhost cronolog-1.6.2]#  ./configure && make && make install
//解压以后进行编译安装
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf 
//编辑Apache的主配置文件
//将方法1中写入的日志切割配置项删除,写入下面的两行配置
    CustomLog "|/usr/local/sbin/cronolog logs/access-%Y-%m-%d.log" combined
    ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y-%m-%d.log"
//一样这里写的也是cronolog工具的绝对路径
为了更好的进行测试,建议将本来的日志文件进行删除、移动操做
[root@localhost ~]# rm -rf /usr/local/http-2.4.23/logs/*log
[root@localhost ~]# ls /usr/local/http-2.4.23/logs/
httpd.pid
[root@localhost ~]# ls /usr/local/http-2.4.23/logs/
access-2019-11-23.log  error-2019-11-23.log  httpd.pid
//测试访问一下,访问日志和错误日志便可产生

这样就已经实现了日志按天进行分割存放!

若是 Apache 中有多个虚拟主机,最好每一个虚拟主机中放置一个这样的代码,并将日志文件名改为不一样的名字。

若是网站的访问实在太大,也能够进行按小时分隔,方法以下:
基于第二种方法实现:

[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf 
//将本来的两行配置内容修改以下:
    CustomLog "|/usr/local/sbin/cronolog logs/access-%Y-%m-%d.log.%H" combined
    ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y-%m-%d.log.%H"
//就是在本来的配置上添加了“%H”表示按小时进行分隔
[root@localhost ~]# systemctl restart httpd
//重启Apache服务

自行进行测试访问,接下来查看日志文件,如图:
深度优化Apache

生产环境下,经常使用方法:

按天轮询:
CustomLog "|/usr/local/sbin/cronolog logs/access_www_%Y%m%d.log" combined 
按小时轮询:
CustomLog "|/usr/local/sbin/cronolog logs /access_www_ %Y%m%d%H.log" combined

注意: 这两个管道日志文件程序还有一点不一样之处是使用 cronolog 时若是日志是放在某个不存 在的路径则会自动建立目录,而使用 rotatelogs 时不能自动建立,这一点要特别注意 !

6、配置防盗链

有时候会忽然发现网站的访问量愈来愈,千万不要高兴的太早,颇有多是被别人盗链了。打个比方说:你本身搭建了一个视频网站,而后别人将他网站上的视频的地址重定向到你的服务器上。这样你的网站访问量就会愈来愈大,消耗的资源也就愈来愈多!如何避免这种可能的发生,那么就须要使用防盗链。

方法1:使用rewrite模块实现

首先要确认Apache的rewrite module模块已经安装,可用:
[root@localhost ~]# apachectl -M | grep rewrite
 rewrite_module (shared)

接下来编写Apache的主配置文件

[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so          //找到这一行,默认是注释的,将#号删除便可
……………………
<Directory "/usr/local/http-2.4.23/htdocs">                //如下内容必须写在网站的根目录下
    RewriteEngine On
    RewriteCond %{HTTP_REFERER} !^$
    RewriteCond %{HTTP_REFERER} !^http://192.168.1.1/.*$ [NC]
    RewriteRule .*\.(gif|jpg|swf)$ http://192.168.1.1/about/error.png [R,NC,L]
</Directory>

添加的内容相关解释:

  • RewriteEngine On //启用rewrite(地址重定向)功能,必须填写;
  • RewriteCond %{HTTP_REFERER} !^$ //容许用户在浏览器直接测试访问
  • RewriteCond %{HTTP_REFERER} !^http://192.168.1.1/.*$ [NC] //容许经过192.168.1.1的地址进行访问
  • RewriteRule .*.(gif|jpg|swf)$ http://192.168.1.1/about/error.png [R,NC,L] //将不知足以上策略的、后缀名为gif、jpg、swf的文件所有重定向到网页根目录的about目录中的error.png,要至关注意,about目录下的error.png文件存在,否则,警告信息和图片将没法在对方网站上显示。

详细介绍如图:
深度优化Apache
深度优化Apache
注意:测试时要清除浏览器缓存
下面进行测试:
实验环境有192.168.1.1(A)网站服务器和192.168.1.2(B)网站服务器,配置以下:
A服务器:

[root@localhost ~]# apachectl -M | grep rewrite
 rewrite_module (shared)
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so          //找到这一行,默认是注释的,将#号删除便可
……………………
<Directory "/usr/local/http-2.4.23/htdocs">                //如下内容必须写在网站的根目录下
    RewriteEngine On
    RewriteCond %{HTTP_REFERER} !^$
    RewriteCond %{HTTP_REFERER} !^http://192.168.1.1/.*$ [NC]
    RewriteRule .*\.(gif|jpg|swf)$ http://192.168.1.1/about/error.png [R,NC,L]
</Directory>
[root@localhost ~]# ll /usr/local/http-2.4.23/htdocs/
总用量 64
drwxr-xr-x. 2 root root    23 11月 25 14:45 about
-rw-r--r--. 1 root root 60108 11月 24 10:02 access.jpg              //确保文件存在
-rw-r--r--. 1 root root    45 6月  12 2007 index.html
[root@localhost ~]# ll /usr/local/http-2.4.23/htdocs/about
总用量 236
-rw-r--r--. 1 root root 240595 11月 24 10:01 error.png                 //确保文件存在

[root@localhost ~]# apachectl restart              //从新启动httpd服务器

B服务器:

[root@localhost ~]# yum -y install httpd
//为了方便 起见,使用yum的方式安装httpd服务
[root@localhost ~]# vim /var/www/html/index.html
<a href="http://192.168.1.1/access.jpg">连接</a>
//手动安装的httpd的主页文件作一个超连接链接到A服务器的根目录下的access.jpg
//访问时会出现一个连接的超连接

这样当客户端访问B服务器时就会查看到error.png(访问的本意是访问access.jpg)
深度优化Apache
深度优化Apache

也可让客户端的连接过来的时候访问到错误页面,方法以下:
修改A服务器的配置文件:

[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf 
……………………                      //省略部份内容
    RewriteEngine On
    RewriteCond %{HTTP_REFERER} !^$
    RewriteCond %{HTTP_REFERER} !^http://192.168.1.1/.*$ [NC]
    #RewriteRule .*\.(gif|jpg|swf)$ http://192.168.1.1/about/error.png [R,NC,L]                 //将这条进行注释 
    RewriteRule .*\.(gif|jpg|png)$ - [F]                      //(强制 URL 为被禁止的 forbidden),强制当前 URL 为被禁止的,即,当即反馈一 个 HTTP 响应代码 403(被禁止的)
[root@localhost ~]# systemctl restart httpd
//从新启动httpd服务

再次访问就会出现这样的状况:
注意清除浏览器缓存
深度优化Apache
深度优化Apache

这样就证实了防盗链的做用!

方法 2:经过判断浏览器头信息来阻止请求

也就是利用 SetEnvIfNoCase 和 access。 这个方法能够经过阻止某些机器人或蜘蛛爬虫抓取你的网站来节省你的带宽流量。 语法: SetEnvIfNoCase attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ... SetEnvIfNoCase 当知足某个条件时,为变量赋值,即根据客户端请求属性设置环境变量。 注:Referer :指明了请求当前资源原始资源的 URL,使用 referer 是能够防盗链 而后在找到本身网站对应的配置的地方(如在主配置文件中或虚拟主机
中),加入下列代码:

SetEnvIfNoCase Referer "^$" local_ref 
SetEnvIfNoCase Referer"^http://www.benet.com/.*$" local_ref
SetEnvIfNoCase Referer"^http://benet.com/.*$"local_ref
<filesmatch"\.(mp3|mp4|zip|rar|jpg|gif|png)">

经过判断referer变量的值,来判断图片或资源的引用是否合法,只有在根据配置符合设定需求范围内的referer,这样的网站内容,才能调用访问指定的资源内容,从而实现了资源被网站盗链的目的。须要注意的是:是全部的用户代理(浏览器)都会设置referer变量,并且有的还能够手工修改erferer,referer是能够被伪造的,上面的配置只是一种简单的防御手段。应付通常的盗链足矣。当网站被盗链,通常能够采起如下措施:对本站的图片、视频、音频等文件标上本身的站名品牌或者相关水印;设置防火墙,从源头IP进行控制设置防盗链(根据referer机制)网站被非法盗链使用,会致使网站带宽成本加大以及服务器压力加大,严重时会致使巨额的网站及正经常使用户访问受到影响。好了,防盗链至此就实现了。———————— 本文至此结束,感谢阅读 ————————

相关文章
相关标签/搜索