博文结构
Apache的Gzip(deflate)功能
Apache的缓存设置
Apache禁止目录遍历
Apache隐藏版本目录
Apache日志分割
Apache配置防盗链
关于apache源码包安装参考apache安装及工作模式
一.apache的Gzip(deflate)功能
开启 apache 的 Gzip(deflate)功能 gzip 可以极大的加速网站,有时压缩比率高到 80%,最少都有 40%以上,还是相当不错的。 在 Apache2 之后的版本,模块名不叫 gzip,而叫 mod_deflate
- 未使用 Gzip
- 开启使用
- 如果要使用gzip(deflate)的功能,一定要打开两个模块
注:进入主配置文件里面把前面#号去掉就可以
如图:
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf
LoadModule deflate_module modules/mod_deflate.so
//模块的作用:对传输到客户端的代码进行gzip压缩
LoadModule headers_module modules/mod_headers.so
/模块的作用:告诉客户端的浏览器,传输的文件使用了gzip压缩。如果不开启的话,则无法正常显示网页内容
- mod_deflate 模块检查及安装
[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:表示需要执行编译操作。
- 在安装时会报错如图:
- 这是需要yum安装zlib-devel
[root@localhost ~]# yum -y install zlib-devel
- 在Apache主配置文件的 LoadModule deflate_module modules/mod_deflate.so 这行的上一行添加
- LoadFile /usr/local/zlib/lib/libz.so
[root@localhost /]# vim /usr/local/http-2.4.23/conf/httpd.conf
[root@localhost /]# apachectl -t
Syntax OK
[root@localhost /]# apachectl restart
-
接下来修改Apache主配置文件,使其开启gzip压缩传输功能
- 在Apache主配置文件中在末尾添加如下内容:
[root@localhost /]# vim /usr/local/http-2.4.23/conf/httpd.conf
DeflateCompressionLevel 9
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/*
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
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
解释:
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
\\声明日志格式
CustomLog logs/deflate_log.log deflate
//指定日志的存放路径
- 修改完成后保存退出并重启 httpd 服务,使用浏览器测试访问,如下图显示结果:(提示:在访问测试页之前按 F12 键)
注:访问之前需要把网页内容调的大一些,多复制几行
[root@localhost /]# vim /usr/local/http-2.4.23/htdocs/index.html
[root@localhost /]# apachectl -t
Syntax OK
[root@localhost /]# apachectl restart
- 可以看到页面已经被压缩
- 查看日志
[root@localhost ~]# cat /usr/local/http-2.4.23/logs/deflate_log.log
"GET / HTTP/1.1" 77/5265 (1%)
"GET /favicon.ico HTTP/1.1" -/- (-%)
"GET / HTTP/1.1" 77/5265 (1%)
"GET / HTTP/1.1" 77/5265 (1%)
[root@localhost ~]#
注:图片是不需要启用 GZip 压缩的,从 GZip 检测结果来看,压缩后的图片体积竟然大过原 体积!这就解释了为什么图片不用启用 GZip 压缩的原因了
apache的缓存配置
这个是非常有用的优化,mod_expires 可以减少 20-30%左右的重复请求,让重复的用户对指定 的页面请求结果都 CACHE 在本地,根本不向服务器发出请求。但要注意更新快的文件不要 这么做。 这个模块控制服务器应答时的 Expires 头内容和 Cache-Control 头的 max-age 指令。有效期 (expiration date)可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻
- 未启用 mod_expires模块expire缓存的效果
- 启用 expire 缓存
进入主配置里面搜索expires把前面#去掉
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf
- 然后添加 Expires 配置规则 (在Apache主配置文件末尾添加以下内容)
ExpiresActive On
ExpiresByType text/html "access plus 2 minute"
ExpiresByType image/jpeg "access plus 1 mouth"
ExpiresDefault "now plus 0 minute"
注释:
//表示启用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"
//其他默认没有被定义的不进行缓存
- 测试效果如下:
其中 是下列之一:
• access
• now (等价于'access ')
• modification
plus 关键字是可选的。必须是整数,是下列之一:
• years
• months
• weeks
• days
• hours
• minutes
• seconds
- Apache禁止目录遍历
将 Options Indexes FollowSymLinks 中的 Indexes 去掉,就可以禁止 Apache 显示该目录结构
Indexes 的作用就是当该目录下没有 index.html 文件时,就显示目录结构。
[root@localhost ~]# cd /usr/local/http-2.4.23/htdocs/
[root@localhost htdocs]# mv index.html /index.html.bak
[root@localhost htdocs]# mkdir aaa
[root@localhost htdocs]# mkdir 123
[root@localhost htdocs]# vim /usr/local/http-2.4.23/conf/httpd.conf
[root@localhost htdocs]# apachectl restar
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf
[root@localhost ~]# apachectl restart
报403没有权限访问
显示目录结构:把主配置文件里面刚删除的写回来
报200访问成功
apache隐藏版本
- 默认 apache 的状态信息
- 这样轻易的出现在互联网上,显然是不安全的。可以通过以下操作进行优化处理,方法如下:
[root@localhost /]# vim /usr/local/http-2.4.23/conf/httpd.conf
进入主配置文件把前面#号去掉
- 修改 httpd-default.conf
[root@localhost /]# vim /usr/local/http-2.4.23/conf/extra/httpd-default.conf
找到 ServerTokens Full ServerSignature On 改成 ServerTokens Prod ServerSignatureoff 重启 apache 测试
[root@localhost /]# apachectl restart
[root@localhost /]# curl -I 127.0.0.1
- 如果你需要彻底将版本之类的信息进行改头换面,你就需要在编译之前做准备或者进行从新 编译了。在重新编译时,修改源码包下 include 目录下的 ap_release.文件
#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 #
日志分割
随着网站的访问越来越大,WebServer 产生的日志文件也会越来越大,如果不对日志进行分割,那么只能一次将大的日志(如 Apache 的日志)整个删除,这样也丢失了很多对网站比较宝贵的信息,因为这些日志可以用来进行访问分析、网络安全监察、网络运行状况监控等,因此管理好这些海量的日志对网站的意义是很大的。
- 方法一
使用 rotatelogs(apache 自带的工具)每隔一天记录一个日志
[root@localhost /]# vim /usr/local/http-2.4.23/conf/httpd.conf
修改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为轮转的时间,单位是秒(也就是一天生成一个日志文件)。
- 然后添加如下两行
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
[root@localhost /]# ls /usr/local/http-2.4.23/logs/
access_20191221.log access-20191221.log access_log error_20191221.log error-20191221.log error_log httpd.pid
[root@localhost /]#
由于 apache 自带的日志轮询工具 rotatelogs,据说在进行日志切割时容易丢日志,因此我们通常使用 cronolog 进行日志轮询。
- 方法二
下载cronlog
使用 cronolog 为每一天建立一个新的日志安装 cronolog 程序
[root@localhost /]# tar zxf cronolog-1.6.2.tar.gz
[root@localhost /]# cd 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
//测试访问一下,访问日志和错误日志即可产生
[root@localhost /]# ls /usr/local/http-2.4.23/logs/
- 生产环境下,常用方法:
按天轮询:
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 时不能自动创建,这一点要特别注意 !
配置防盗链
有时候会突然发现网站的访问量越来越,千万不要高兴的太早,很有可能是被别人盗链了。打个比方说:你自己搭建了一个视频网站,然后别人将他网站上的视频的地址重定向到你的服务器上。这样你的网站访问量就会越来越大,消耗的资源也就越来越多!如何避免这种可能的发生,那么就需要使用防盗链。
- 方法一
服务器配置如下:
用 rewrite 实现
[root@localhost htdocs]# ls
a.jpg b.jpg
[root@localhost htdocs]# mkdir about
[root@localhost htdocs]# mv a.jpg b.jpg about
[root@localhost about]# mv b.jpg error.png
[root@localhost htdocs]# cd about/
[root@localhost about]# ls
a.jpg error.png
[root@localhost about]# pwd
/usr/local/http-2.4.23/htdocs/about
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so
//找到这一行,默认是注释的,将#号删除即可
……………………
//必须写在网站的根目录下
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://192.168.222.130/.*$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://192.168.222.130/about/error.png [R,NC,L]
输入本地服务器的IP
- 注:相关选项的解释
RewriteEngine On #启用 rewrite,要想 rewrite 起作用,必须要写上
RewriteCond test-string condPattern #写在 RewriteRule 之前,可以有一或 N 条,用于测试 rewrite 的匹配条件,具体怎么写,后面会详细说到。
RewriteRule Pattern Substitution #规则
%{HTTP_REFERER}:服务器变量,HTTPReferer 是 header 的一部分,当浏览器向 web 服务器发送请求的时候,一般会带上 Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从 HTTP Referer 中统计出每天有多少用户点击我主页上的链接访问他的网站。
[ NC]指的是不区分大小写,[R]强制重定向 redirect
字母 L 表示如果能匹配本条规则,那么本条规则是最后一条(Last),忽略之后的规则
如图:
- 客户端配置如下:
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# vim /var/www/html/index.html
lianjie
\\编写一个超链接,指定服务器的IP
- 测试: