gzip可以极大的加速网站,有时压缩比率高到80%,最少都有40%以上,还是相当不错的。在Apache2之后的版本,模块名不叫gzip,而叫mod_deflate
未使用
开启使用Gzip
如果要开启deflate的话,一定要打开下面二个模块LoadModule deflate_module modules/mod_deflate.soLoadModule headers_module modules/mod_headers.so设置压缩比率,取值范围在 1(最低) 到 9(最高)之间,不建议设置太高,虽然有很高的压缩率,但是占用更多的CPU资源.mod_deflate模块检查及安装[root@www ~]# /usr/local/http-2.4.23/bin/apachectl -M | grep deflate deflate_module (shared)如果没有安装:
a.编译时安装方法
编译的时候跟上--enable-deflate即可实现安装
b.DSO方式安装
[root@www ~]# cd /root/httpd-2.4.23/modules/filters/ #切到apache源码包mod_deflate所在的目录下[root@www filters]# /usr/local/http-2.4.23/bin/apxs -c -i -a mod_deflate.c #以dso的方式编译安装到apache中[root@www filters]# ll /usr/local/http-2.4.23/modules/mod_deflate.so #检查mod_deflate是否安装,成功安装这里会显示出该文件-rwxr-xr-x. 1 root root 98144 Oct 22 23:14 /usr/local/http-2.4.23/modules/mod_deflate.so
apxs命令参数说明: -i 此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录中。 -a 此选项自动增加一个LoadModule行到httpd.conf文件中,以启用此模块,或者,如果此行已经存在,则启用之。 -c 此选项表示需要执行编译操作。如果重启的时候出现错误
Cannot load /usr/local/apache/modules/mod_deflate.so into server: /usr/local/apache/modules/mod_deflate.so: undefined symbol: inflateEnd
需要在 LoadModule deflate_module modules/mod_deflate.so 的前面加载zlib.so这里需要注意的是LoadModule deflate_module需要放在LoadModule php5_module之后引用LoadFile /usr/lib/libz.so (x64系统中该库文件位于/usr/lib64目录下,可以软链接到/usr/lib下LoadModule deflate_module modules/mod_deflate.so
重新启动httpd :
/usr/local/http2.4.23/bin/apachectl graceful #优雅启动httpd服务
修改Apache配置文件开启gzip压缩传输:http.conf修改、增加配置参数
LoadModule deflate_module modules/mod_deflate.soLoadModule headers_module modules/mod_headers.so
打开httpd.conf后,先将上面两行配置前面的#号去掉,这样apache就会启用这两个模块,其中mod_deflate是压缩模块,就是对要传输到客户端的代码进行gzip压缩;mod_headers模块的作用是告诉浏览器页面使用了gzip压缩,如果不开启mod_headers那么浏览器就会对gzip压缩过的页面进行下载,而无法正常显示。 在httpd.conf中加入以下代码,可以加到任何空白地方,不了解apache的话,如果担心加错地方,就放到http.conf文件的最后一行
注:在添加代码前最好先查一查要添加的代码是否存在
<IfModule mod_deflate.c> DeflateCompressionLevel 9 # 压缩程度的等级,预设可以采用 6 这个数值,以维持耗用处理器效能与网页压缩质量的平衡。 SetOutputFilter DEFLATE #设置输出过滤器,对输出启用压缩,必须的,就像一个开关一样,告诉apache对传输到浏览器的内容进行压缩 AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript application/x-httpd-php AddOutputFilterByType DEFLATE p_w_picpath/* AddOutputFilterByType DEFLATE text/* #设置对文件是文本的内容进行压缩,例如text/html text/css text/plain等. AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript #对javascript文件进行压缩 AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp #对php类型的文件进行压缩. SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary #设置不对后缀gif,jpg,jpeg,png的图片文件进行压缩。注:?:表示不会捕获 ( )里内容了 SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary #同上,就是设置不对exe,tgz,gz等的文件进行压缩 SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary #同上就是设置不对pdf,avi,mp3等的文件进行压缩</IfModule>
这样可以压缩一般网页中会用到的html、xml、php、css、js等格式档案输出,虽然会占用掉服务器处理器的一点点处理器时间,浏览者在接收 网页数据时也会消耗极短暂的一点点处理器时间,不过却可以大幅减少数据传输量,减少网络带宽被吃掉的情形。
设置日志输出!
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
修改完成后保存退出并重启httpd服务使用谷歌浏览器测试访问,如下图显示结果:(提示:在访问测试页之前按F12键)
查看日志:
[root@www htdocs]# cat ../logs/deflate_log.log "GET /test.html HTTP/1.1" 6421/19949 (32%)"GET /test1.html HTTP/1.1" 1360/4266 (31%)
注:图片是不需要启用GZip压缩的,从GZip检测结果来看,压缩后的图片体积竟然大过原体积!这就解释了为什么图片不用启用GZip压缩的原因了!
可以检测了几个门户网站的图片,还有Google、baidu的图片,统统都没有启用图片GZip压缩,只是启用了html、css、js等文件的GZip压缩,这就更加说明了GZip压缩不适用于图片上。另外,除了图片之外,flash的swf文件也是不用启用GZip压缩的。
2、配置mod_expires模块
这个非常有用的优化,mod_expires可以减少20-30%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求。但要注意更新快的文件不要这么做。
这个模块控制服务器应答时的Expires头内容和Cache-Control头的max-age指令。有效期(expiration date)可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。
未启用expire的效果:
[root@www htdocs]# curl -I 192.168.31.83/12.pngHTTP/1.1 200 OKDate: Tue, 25 Oct 2016 15:52:37 GMTServer: Apache/2.4.23 (Unix)Last-Modified: Sun, 23 Oct 2016 15:34:10 GMTETag: "8c9f-53f8a01b18080"Accept-Ranges: bytesContent-Length: 35999Vary: Accept-EncodingContent-Type: p_w_picpath/png
启用expire缓存:
mod_expires的安装配置:启用expires_moduleLoadModule expires_module modules/mod_expires.so
然后添加Expires配置规则
<IfModule mod_expires.c> ExpiresActive On //启用有效期控制 ExpiresByType text/css "now plus 1 month" ExpiresByType application/x-javascript "now plus 5 day" ExpiresByType p_w_picpath/jpeg "access plus 1 month" ExpiresByType p_w_picpath/gif "access plus 1 month" //GIF有效期为1个月 ExpiresByType p_w_picpath/bmp "access plus 1 month" ExpiresByType p_w_picpath/x-icon "access plus 1 month" ExpiresByType p_w_picpath/png "access plus 1 minutes" ExpiresByType application/x-shockwave-flash "access plus 1 month" ExpiresDefault "now plus 0 minutes"</IfModule>
验证:
[root@www htdocs]# curl -I 192.168.31.83/12.pngHTTP/1.1 200 OKDate: Tue, 25 Oct 2016 16:00:57 GMTServer: Apache/2.4.23 (Unix)Last-Modified: Sun, 23 Oct 2016 15:34:10 GMTETag: "8c9f-53f8a01b18080"Accept-Ranges: bytesContent-Length: 35999Cache-Control: max-age=60Expires: Tue, 25 Oct 2016 16:01:57 GMTVary: Accept-EncodingContent-Type: p_w_picpath/png
ExpiresDefault 和ExpiresByType 指令同样能够用易懂的语法格式进行定义:ExpiresDefault "<base> [plus] {<num> <type>}"
ExpiresByType type/encoding "<base> [plus] {<num> <type>}"
其中<base>
是下列之一: access now (等价于'access ') modificationplus 关键字是可选的。<num>
必须是整数,<type>
是下列之一: years months weeks days hours minutes seconds
例如,下列3个指令都表示文档默认的有效期是一个月:
ExpiresDefault "access plus 1 month"ExpiresDefault "access plus 4 weeks"ExpiresDefault "access plus 30 days"
有效期可以通过增加"<num>
<type>
"子句进一步调整:
ExpiresByType text/html "access plus 1 month 15 days 2 hours"ExpiresByType p_w_picpath/gif "modification plus 5 hours 3 minutes"
注意,如果你使用基于最后修改日期的设置,"Expires:"头将不会被添加到那些并非来自于磁盘文件的内容。这是因为这些内容并不存在"最后修改时间"的属性。
<IfModule mod_expires.c> ExpiresActive On //启用有效期控制 ExpiresByType p_w_picpath/gif A2592000 //GIF有效期为1个月(秒数) ExpiresByType p_w_picpath/jpeg A2592000 ExpiresByType p_w_picpath/png A2592000 ExpiresByType p_w_picpath/x-icon A2592000 ExpiresByType application/x-javascript A604800 ExpiresByType text/plain A604800 ExpiresByType text/html M604800 //HTML文档的有效期是最后修改时刻后的一星期</IfModule>
"M"表示源文件的最后修改时刻,"A"表示客户端对源文件的访问时刻。后面的时间则以秒计算。重启 Apache 服务器。有关 Apache Expires Module 的介绍,可以参阅其官方文档:http://httpd.apache.org/docs/2.4/mod/mod_expires.html
3、Apache禁止目录遍历
将Options Indexes FollowSymLinks
中的Indexes
去掉,就可以禁止 Apache 显示该目录结构。Indexes 的作用就是当该目录下没有 index.html文件时,就显示目录结构。
4、apache 隐藏版本信息
测试默认 apache 的状态信息
[root@www htdocs]# curl -I 192.168.31.83HTTP/1.1 200 OKDate: Tue, 25 Oct 2016 16:09:09 GMTServer: Apache/2.4.23 (Unix)Last-Modified: Mon, 11 Jun 2007 18:53:14 GMTETag: "2d-432a5e4a73a80"Accept-Ranges: bytesContent-Length: 45Cache-Control: max-age=0Expires: Tue, 25 Oct 2016 16:09:09 GMTContent-Type: text/html
1、主配置中启用httpd-default.conf
Include conf/extra/httpd-default.conf
2、修改httpd-default.conf
文件:/usr/local/http-2.4.23/conf/extra/httpd-default.conf找到
ServerTokens FullServerSignature On
改成
ServerTokens ProdServerSignature off
3、重启 apache 测试
测试隐藏版本号后 apache 的状态信息
[root@www htdocs]# curl -I 192.168.31.83HTTP/1.1 200 OKDate: Tue, 25 Oct 2016 16:14:32 GMTServer: ApacheLast-Modified: Mon, 11 Jun 2007 18:53:14 GMTETag: "2d-432a5e4a73a80"Accept-Ranges: bytesContent-Length: 45Cache-Control: max-age=0Expires: Tue, 25 Oct 2016 16:14:32 GMTContent-Type: text/html
如果你需要彻底将版本之类的信息进行改头换面,你就需要在编译之前做准备或者进行从新编译了。在重新编译时,修改源码包下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日志切割
1、为什么要分割日志
随着网站的访问越来越大,WebServer产生的日志文件也会越来越大,如果不对日志进行分割,那么只能一次将大的日志(如Apache的日 志)整个删除,这样也丢失了很多对网站比较宝贵的信息,因为这些日志可以用来进行访问分析、网络安全监察、网络运行状况监控等,因此管理好这些海量的日志对网站的意义是很大的。
方法1:使用rotatelogs(apache自带的工具) 每隔一天记录一个日志
编辑Apache的主配置文件,更改内容如下:注释掉如下两行
ErrorLog logs/error_logCustomLog 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
注:其中86400为轮转的时间单位为秒验证:查看logs目录下的日志文件
[root@www ~]# ls /usr/local/http-2.4.23/logs/access20161026.log access_log deflate_log.log error20161026.log error_log httpd.pid
由于apache自带的日志轮询工具rotatelogs,据说在进行日志切割时容易丢日志,因此我们通常使用cronolog进行日志轮询。
方法2:使用 cronolog 为每一天建立一个新的日志
安装cronolog程序下载cronolog
[root@www ~]# tar zxf cronolog-1.6.2.tar.gz [root@www ~]# cd cronolog-1.6.2/[root@www cronolog-1.6.2]# ./configure && make && make install
主配置文件中的使用方法
ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y%m%d.log"CustomLog "|/usr/local/sbin/cronolog logs/access-%Y%m%d.log" combined
如果Apache中有多个虚拟主机,最好每个虚拟主机中放置一个这样的代码,并将日志文件名改成不同的名字。扩展:这个保证了每天一个文件夹 文件夹下 每个小时产生一个log:
CustomLog "|/usr/local/sbin/cronolog logs /%Y%m%d/access_log.%H" combined
按天轮询(生产环境常见用法,推荐使用):
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
验证:查看logs目录下的日志文件:
[root@www ~]# ls /usr/local/http-2.4.23/logs/access-20161026.log access_log deflate_log.log error-20161026.log error_log httpd.pid
注意:
这两个管道日志文件程序还有一点不同之处是使用cronolog
时如果日志是放在某个不存在的路径则会自动创建目录,而使用 rotatelogs
时不能自动创建,这一点要特别注意。
6、配置防盗链
有时候,你的网站莫名其妙的访问量变大,不要高兴的太早,有可能是被别人盗链了。举个例子:比如你搭了个discuz论坛,里面有些热点图片、视频;然后别人将他网站上访问图片的地址重定向到你的discuz上,这样他的服务器就可以空闲出来了;也就是说别人访问他网站的图片视频,消耗的确是你服务器的资源;解决这个问题的方法是配置下防盗链,让外来的盗不了链;
方法1:Apache 防盗链的第一种实现方法,可以用rewrite实现。
首先要确认 Apache 的rewrite module可用:
[root@www ~]# apachectl -M | grep rewriterewrite_module (shared)
打开 httpd.conf,确保有这么一行配置:
LoadModule rewrite_module modules/mod_rewrite.so
然后在找到自己网站对应的配置的地方(如在主配置文件中或虚拟主机中),加入下列代码:ServerName www.benet.com
此处我们用虚拟主机来测试
防盗链配置
RewriteEngine OnRewriteCond %{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/about/nolink.png [R,NC]
注:相关选项的解释1.RewriteEngine On
#启用rewrite,要想rewrite起作用,必须要写上
2.RewriteCond test-string condPattern
#写在RewriteRule之前,可以有一或N条,用于测试rewrite的匹配条件,具体怎么写,后面会详细说到。
3.RewriteRule Pattern Substitution
#规则
4.%{HTTP_REFERER}
#服务器变量,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
5.[NC]
指的是不区分大小写,[R]
强制重定向 redirect
防盗链配置的说明:
红色部分: 表示自己的信任站点。对我的站点来说,设置为 http://www.benet.com 和 http://benet.com
绿色部分: 要保护文件的扩展名(以
|
分开)。以这些为扩展名的文件,必须通过红色标注的网址引用,才可以访问。蓝色部分: 定义被盗链时替代的图片,让所有盗链 jpg、gif、swf 等文件的网页,显示网页文档根目录下的
about/nolink.png
文件。注意:替换显示的图片不要放在设置防盗链的目录中,并且该图片文件体积越小越好。当然你也可以不设置替换图片,而是使用下面的语句即可:RewriteRule .*\.(gif|jpg|png)$ - [F]
注:
[F]
(强制URL为被禁止的 forbidden),强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。
方法2:通过判断浏览器头信息来阻止某些请求,即利用SetEnvIfNoCase和access。
这个方法可以通过阻止某些机器人或蜘蛛爬虫抓取你的网站来节省你的带宽流量。
语法: SetEnvIfNoCase attribute regex [!]env-variable[=value][[!]env-variable[=value]]
...SetEnvIfNoCase
当满足某个条件时,为变量赋值,即根据客户端请求属性设置环境变量。注:Referer :指明了请求当前资源原始资源的URL,使用referer是可以防盗链然后在找到自己网站对应的配置的地方(如在主配置文件中或虚拟主机中),加入下列代码:
SetEnvIfNoCase Referer "^http://www.benet.com" local_refSetEnvIfNoCase Referer "^http://benet.com" local_ref<filesmatch "\.(mp3|mp4|zip|rar|jpg|gif|png)">
接着加入
# 2.4版本以下的 方法一: Order Deny,Allow Allow from env=local_ref Deny from all 方法二: Order Allow,Deny Allow from env=local_ref
#2.4版本以上,方法如下: Require all denied Require env local_ref</filesmatch>