Apache深度优化
一、 开启apache的Gzip(defalte)功能
gzip 可以极大的加速网站,有时压缩比率高到 80%,最少都有 40%以上,还是相当不错的。 在 Apache2 之后的版本,模块名不叫 gzip,而叫 mod_deflate
在apache1.0版本软件本身不支持页面的压缩功能,通过第三方模块gzip完成,到2.2版本apache软件基金会自己开发了deflate压缩模块
deflate压缩模块相比gzip压缩效率低,消耗资源少,压缩速度快,在压缩过程中需要定义压缩等级0-9数字越大压缩比例越大,消耗资源越多,一般定义压缩等级时会去中间参数
如果要开启deflate的话,必须要打开两个模块:
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
安装mod_delfate的两种安装方法:
1、编译时安装:
编译安装是后面跟—enable-deflate即可安装
2、DSO方式安装:
如果在编译安装时没有开启—enable-deflate则可以使用这种方式安装:
[[email protected] ~]# cd /usr/src/httpd-2.4.23/modules/filters/ ##切换到apache源码包 mod_defalte所在的目录下
/usr/local/http-2.4.23/bin/apxs -c -i -a mod_deflate.c ##进行安装mod_deflate.c
-c:执行编译安装操作 -i:执行安装操作 -a:会自动在http.conf文件中增加一个LoadModule以启用此模块,如果此行已经存在,则直接启用
如果报错:
原因是缺少 zlib-devel 的安装包,装上就可以了:yum -y install zlib-devel,然后在此执行/usr/local/http-2.4.23/bin/apxs -c -i -a mod_deflate.c这个命令
检查mod_deflate是否安装:成功安装会在这里显示该文件
安装完成后修改apache配置文件开启gzip压缩传输:
在http.conf中修改
这样就可以启动这两个模块:
mod_deflate 是压缩模块,就是对要传输到客户端的代码进行 gzip 压缩
mod_headers 模块的作用是告诉浏览器页面使用了 gzip 压缩,如果不开启 mod_headers 那么浏览器就会 对 gzip 压缩过的页面进行下载,而无法正常显示
LoadModule /usr/lib64/libz.so:如果使用DSO方式安装的deflate模块需要声明,没用可以不用写
在文件最后添加压缩级别等参数:
DeflateCompressionLevel 9:压缩程度的等级,预设可以采用 6 这个数值,以维持 耗用处理器效能与网页压缩质量的平衡。
SetOutputFilter DEFLATE:设置输出过滤器,对输出启用压缩,必须的,就像一个 开关一样,告诉 apache 对传输到浏览器的内容进行压缩
AddOutputFilterByType DEFLATE text/*:设置对文件是文本的内容进行压缩,例如 text/html text/css text/plain 等
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary:设置不对后缀 gif,jpg,jpeg,png 的图片文件进行压缩。注:?:表示不会捕获 ( )里内容了
设置日志输出:
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:声明日志格式
修改完成后保存退出重启httpd服务
访问,测试:
在浏览器按F2(打开开发者工具)输入apache服务器的IP(192.168.1.10)
查看日志:
说明在传输时已经压缩
二、 开启apache的缓存功能,配置mod——expoires模块
这个非常有用的优化,mod_expires 可以减少 20-30%左右的重复请求,让重复的用户对指定 的页面请求结果都 CACHE 在本地,根本不向服务器发出请求。但要注意更新快的文件不要 这么做。
这个模块控制服务器应答时的 Expires 头内容和 Cache-Control 头的 max-age 指令。有效期 (expiration date)可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。
LoadModule expires_module modules/mod_expires.so ##在配置文件中去点注释
语法:ExpiresByType:定义缓存页面 text/html:指定缓存界面的类型 A60:缓存页面的时间
ExpireActive On:开启缓存功能
ExpiresByType text/html M60:页面最后一次修改缓存60
ExpiresByType image/png A60:图片缓存,和ExpiresByType image/png "access plus 1 month"意思相同
ExpiresDefault "now plus 0 minute":其他页面不进行缓存
测试:
三、 禁止apache目录遍历:
将 Options Indexes FollowSymLinks 中的 Indexes 去掉,就可以禁止 Apache 显示该目录结构。 Indexes 的作用就是当该目录下没有 index.html 文件时,就显示目录结构
首先制造一个没有index.html的现象,然后访问看一下
这样的话如果客户端访问就能看到公司内部的网站目录结构,这样不安全,然后禁止目录遍历即可
在下面位置将Options Indexes FollowSymLinks修改为Options FollowSymLinks即可:
DocumentRoot "/usr/local/httpd/htdocs"
<Directory "/usr/local/httpd/htdocs">
Options FollowSymLinks
四、 隐藏apache版本信息:
测试默认apache的状态信息:
编辑著配置文件调用httpd-defalut.conf配置文件:去掉注释
修改/usr/local/httpd/conf/extra/httpd-default.conf文件:
找到 ServerTokens Full修改为ServerTokens Prod
重启apache测试:
如果你需要彻底将版本之类的信息进行改头换面,你就需要在编译之前做准备或者进行从新编译了。在重新编译时,修改源码包下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 #
上述列出的行,已经给出了注释,大家可以修改成自己想要的,然后编译安装之后,对方就彻底不知道你的版本号了。
五、 apache日志切割:
为什么要分割日志:
随着网站的访问越来越大,WebServer 产生的日志文件也会越来越大,如果不对日志进行分 割,那么只能一次将大的日志(如 Apache 的日志)整个删除,这样也丢失了很多对网站比较 宝贵的信息,因为这些日志可以用来进行访问分析、网络安全监察、网络运行状况监控等, 因此管理好这些海量的日志对网站的意义是很大的。
方法一:使用 rotatelogs(apache 自带的工具)每隔一天记录一个日志
修改apache的主配置文件:
将如下两行注释:
ErrorLog logs/error_log
CustomLog logs/accesslog 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为轮转的时间单位为秒,也就是一天
注意:rotatelogs这个要写绝对路径,可以使用which来查询它的路径:
验证:查看logs目录下的日志文件:
由于 apache 自带的日志轮询工具 rotatelogs,据说在进行日志切割时容易丢日志,因此我们 通常使用 cronolog 进行日志轮询。
方法二:使用cronolog为每一天建立一个新的日志
下载安装cronolog程序:
还是在主配置文件中修改:
添加如下两行:
如果 Apache 中有多个虚拟主机,最好每个虚拟主机中放置一个这样的代码,并将日志文件 名改成不同的名字
扩展:
这个保证了每天一个文件夹文件夹下每个小时产生一个 log
CustomLog "|/usr/local/sbin/cronolog logs /%Y%m%d/access_log.%H" combined
验证:
cronolog和rotatelogs的区别:
使用 cronolog 时如果日志是放在某个不存 在的路径则会自动创建目录,而使用 rotatelogs 时不能自动创建,这一点要特别注意
六、 配置防盗链:
有时候,你的网站莫名其妙的访问量变大,不要高兴的太早,有可能是被别人盗链了。
举个例子:比如你搭了个 discuz 论坛,里面有些热点图片、视频;然后别人将他网站上访问 图片的地址重定向到你的 discuz 上,这样他的服务器就可以空闲出来了;也就是说别人访问 他网站的图片视频,消耗的确是你服务器的资源
解决这个问题的方法是配置下防盗链,让外来的盗不了链:
开启apache防盗链功能:
<Directory "/usr/local/httpd/htdocs">在这里面添加如下几行:
RewriteEngine On #启用 rewrite,要想 rewrite 起作用,必须要写上
R:强制重定向 NC:忽略大小写 L:表示如果能匹配本条规则,那么本条规则是最后一条(Last),忽略之后的规则
再打开一个虚拟机,安装httpd服务进行测试:
安装httpd服务:yum -y install httpd
web页面内容为:<a href="http://192.168.1.10/image.png">lianjie</a>
测试:
在浏览器输入httpd服务器的IP地址(192.168.1.20)访问:
原文地址:https://blog.51cto.com/14256937/2441962