apache 优化
目录
- I.安装
apache2.4.23
- II.
Apache
的优化配置
I.安装apache2.4.23
i.新版本的httpd-2.4
新增以下特性
1.新增模块
mod_proxy_fcgi
(可提供fcgi代理)mod_ratelimit
(限制用户带宽)mod_request
(请求模块,对请求做过滤)mod_remoteip
(匹配客户端的IP地址)
对于基于IP的访问控制做了修改,不再支持allow
,deny
,order
机制,而是统一使用require
进行
2.新特性
- 1、MPM支持在运行时装载;不过要开启这种特性,在编译安装要启用这三种功能;
--enable-mpms-shared=all
--with-mpm=event
- 2、支持
event
- 3、支持异步读写
- 4、在每个模块及每个目录上指定日志级别
- 5、增强版的表达式分析器
- 6、每请求配置:
<If>
,<Elseif>
- 7、毫秒级别的
keepalive timeout
- 8、基于
FQDN
的虚拟主机不再需要Name VirtualHost
指令 - 9、支持使用自定义变量
ii.安装apache2.4.23
安装环境:操作系统:Centos7.2
,关闭selinux
1.检查是否安装httpd
检查httpd
包是否安装,如查安装则卸载
[root@www ~]# rpm -q httpd
下载源码包:
httpd-2.4.23.tar.gz
apr-1.5.2.tar.gz
apr-util-1.5.4.tar.gz
zlib-1.2.8.tar.gz
pcre-8.39.tar.gz
注:apr(Apache Portable Runtime)Apache可移植运行库,它是一个对操作系统调用的抽象库,用来实现Apache内部组件对操作系统的使用,提高系统的可移植性。
2.安装apr
和apr-util
[root@www ~]# tar zxf apr-1.5.2.tar.gz
[root@www ~]# cd apr-1.5.2/
[root@www apr-1.5.2]# ./configure --prefix=/usr/local/apr
[root@www apr-1.5.2]# make && make install
[root@www ~]# tar zxf apr-util-1.5.4.tar.gz
[root@www ~]# cd apr-util-1.5.4/
[root@www apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@www apr-util-1.5.4]# make && make install
3.安装zlib
[root@www ~]# tar zxf zlib-1.2.8.tar.gz
[root@www ~]# cd zlib-1.2.8/
[root@www zlib-1.2.8]# ./configure --prefix=/usr/local/zlib
[root@www zlib-1.2.8]# make && make install
4.安装pcre
[root@www ~]# tar zxf pcre-8.39.tar.gz
[root@www ~]# cd pcre-8.39/
[root@www pcre-8.39]# ./configure --prefix=/usr/local/pcre
[root@www pcre-8.39]# make && make install
5.安装openssl
安装apache2.4.23
时提示openssl
版本过低,centos7自带版本openssl-1.0.1e
下载openssl
# wget https://www.openssl.org/source/openssl-1.0.1u.tar.gz
[root@www ~]# tar zxf openssl-1.0.1u.tar.gz
[root@www ~]# cd openssl-1.0.1u/
[root@www openssl-1.0.1u]# ./config -fPIC --prefix=/usr/local/openssl enable-shared
[root@www openssl-1.0.1u]# make && make install
[root@www ~]# mv /usr/bin/openssl /usr/bin/openssl.1.0.1e
[root@www ~]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
6.安装apache2.4.23
[root@www ~]# tar zxf httpd-2.4.23.tar.gz
[root@www ~]# cd httpd-2.4.23/
[root@www httpd-2.4.23]# ./configure --prefix=/usr/local/http-2.4.23 --enable-so --enable-cgi --enable-cgid --enable-ssl --with-ssl=/usr/local/openssl --enable-rewrite --with-pcre=/usr/local/pcre --with-z=/usr/local/zlib --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mods-shared=most --enable-mpms-shared=all --with-mpm=event --enable-proxy --enable-proxy-fcgi --enable-expires --enable-deflate
6.1相关参数解释
参数 | 作用 |
---|---|
--enable-so : |
支持动态共享模块(即打开DSO支持) |
--enable-rewrite : |
支持url重写 |
--enable-ssl : |
支持ssl |
--with-ssl=/usr/local/openssl : |
指定ssl安装位置 |
--enable-cgi : |
启用cgi |
--enable-cgid:MPM |
使用的是event或worker要启用cgid |
--enable-modules=most : |
明确指明要静态编译到httpd二进制文件的模块,<MODULE-LIST> 为空格分隔的模块名列表、all或者most,all表示包含所有模块,most表示包含大部分常用模块 |
--enable-mods-shared=most : |
明确指明要以DSO方式编译的模块,<MODULE-LIST> 为空格分隔的模块名列表、all或者most,all表示包含所有模 块,most表示包含大部分模块 |
--enable-mpms-shared=all : |
启用MPM所有支持的模式,这样event、worker、prefork就会以模块化的方式安装,要用哪个就在 httpd.conf 里配置就好了。多处理动态模块 |
--with-mpm=event : |
指定启用的mpm模式,默认使用enevt模式,在apache的早期版本2.0默认prefork,2.2版本是worker,2.4版本是event. |
--with-pcre=/usr/local/pcre : |
支持pcre |
--with-z=/usr/local/zlib : |
使用zlib压缩库 |
--with-apr=/usr/local/apr : |
指定apr的安装路径 |
--with-apr-util=/usr/local/apr-util : |
指定apr-util的安装路径 |
--enable-expires : |
激活彧通过配置文件控制HTTP的“Expires:”和“Cache-Control:”头内容,即对网站图片、js、css等内容,提供客户端浏览器缓存的设置。这个是apache调优的一个重要选项之一。 |
--enable-deflate : |
提供对内容的压缩传输编码支持,一般是html、js、css等内容的站点。使用此参数会打打提高传输速度,提升访问者访问的体验。在生产环境中,这是apache调优的一个重要选项之一。 |
--enable-mpms-shared=all
: This switch ensures that all MPM (Multi Processing Modules) are built as Dynamic Shared Objects (DSOs), so the user can choose which one to use at runtime.
Dynamic Shared Object (DSO) Support
[root@www httpd-2.4.23]# make && make install
7.优化http
程序执行路径
[root@www httpd-2.4.23]# ln -s /usr/local/http-2.4.23/bin/* /usr/local/bin/
修改配置文件httpd.conf
,设置其中的ServerName
值
例如:ServerName www.benet.com
8.开启apache服务器
# /usr/local/http-2.4.23/bin/apachectl start
8.1apache
优雅启动
[root@nfs ~]# apachectl stop
[root@nfs ~]# netstat -anptlu | grep 80
[root@nfs ~]# apachectl graceful
httpd not running, trying to start
[root@nfs ~]# apachectl graceful
9.开机后自动启动
[root@www httpd-2.4.23]# cp /usr/local/http-2.4.23/bin/apachectl /etc/init.d/httpd
编辑/etc/init.d/httpd
文件,在首行 #!/bin/sh
下面加入两行:
[root@www httpd-2.4.23]# vi /etc/init.d/httpd
# chkconfig: 35 85 15
# description: apache 2.4.23
10.将 Apache
加入开机自动启动
[root@www httpd-2.4.23]# chkconfig --add httpd
[root@www httpd-2.4.23]# chkconfig httpd on
11.启动编译好的 Apache 2.4.23
[root@www httpd-2.4.23]# service httpd start
[root@www httpd-2.4.23]# netstat -anplt | grep 80
tcp6 0 0 :::80 :::* LISTEN 4807/httpd
客户端测试访问(注意防火墙)
II.Apache
的优化配置
apache所运行的硬件环境都是对性能影响最大的因素,即使不能对硬件进行升级,也最好给apache一个单独的主机以免受到其他应用的干扰。各个硬件指标中,对性能影响最大的是内存,对于静态内容(图片、javascript文件、css文件等),它决定了apache可以缓存多少内容,它缓存的内容越多,在硬盘上读取内容的机会就越少,大内存可以极大提高静态站点的速度;对动态高负载站点来说,每个请求保存的时间更多一些,apache的mpm
模块会为每个请求派生出相应的进程或线程分别处理,而进程或线程的数量与内存的消耗近似成正比,因此增大内存对提高动态站点的负载和运行速度也极为有利
其次是硬盘的速度,静态站点尤为突出,apache不断的在读取文件并发送给相应的请求,硬盘的读写是极其频繁的;动态站点也要不断的加载web程序(php等),一个请求甚至要读取十几个文件才能处理完成,因此尽可能的提高硬盘速度和质量对提高apache的性能是有积极意义的。
最后是cpu和网络,cpu影响的是web程序执行速度,网络影响流量大小。
内存-->硬盘-->cpu
,网络
i.apache
的工作模式
Apache HTTP服务器被设计为一个强大的、灵活的能够在多种平台以及不同环境下工作的服务器。这种模块化的设计就叫做“多进程处理模块
”(Multi-Processing Module
,MPM
),也叫做工作模式。
1.Prefork
模式(一个非线程型的):
其主要工作方式是:当Apache服务器启动后,mpm_prefork
模块会预先创建多个子进程(默认为5
个),每个子进程只有一个线程,当接收到客户端的请求后,mpm_prefork
模块再将请求转交给子进程处理,并且每个子进程同时只能用于处理单个请求。如果当前的请求数将超过预先创建的子进程数时,mpm_prefork
模块就会创建新的子进程来处理额外的请求。Apache总是试图保持一些备用的或者是空闲的子进程用于迎接即将到来的请求。这样客户端的请求就不需要在接收后等候子进程的产生。
由于在mpm_prefork
模块中,每个请求对应一个子进程,因此其占用的系统资源相对其他两种模块而言较多。不过mpm_prefork
模块的优点在于它的每个子进程都会独立处理对应的单个请求,这样,如果其中一个请求出现问题就不会影响到其他请求。Prefork
在效率上要比Worker
要高,但是内存使用大得多不擅长处理高并发的场景。
1.1Apache
在prefork
工作模式下影响性能的重要参数说明
# prefork MPM
<IfModule mpm_prefork_module>
StartServers 5
#apache启动时候默认开始的子进程数
MinSpareServers 5
#最小的闲置子进程数
MaxSpareServers 10
#最大的闲置子进程数
MaxRequestWorkers 250
#MaxRequestWorkers设置了允许同时的最大接入请求数量。任何超过MaxRequestWorkers限制的请求将进入等候队列,在apache2.3.1以前的版本MaxRequestWorkers被称为MaxClients,旧的名字仍旧被支持。
MaxConnectionsPerChild 500
#设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxConnectionsPerChild”个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:1、可防止意外的内存泄漏。2、在服务器负载下降的时侯会自动减少子进程数。因此,可根据服务器的负载来调整这个值。在Apache2.3.9之前称之为MaxRequestsPerChild。
</IfModule>
注1:
MaxRequestWorkers
是这些指令中最为重要的一个,设定的是Apache
可以同时处理的请求,是对Apache
性能影响最大的参数。如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l
来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。虽然理论上这个值越大,可以处理的请求就越多,建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000
。
注2:
prefork
控制进程在最初建立StartServers
个子进程后,为了满足MinSpareServers
设置的需要创建一个进程,等待一秒钟,继续创建两 个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers
设置的值为止。这种模式 可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。MaxSpareServers
设置了最大的空闲进程数,如果空闲进程数大于这个 值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers
小,Apache会自动把其调整为MinSpareServers+1
。如果站点负载较大,可考虑同时加大MinSpareServers
和MaxSpareServers
。
注3:
ServerLimit
和MaxClients
(MaxRequestWorkers
)有什么区别呢? 是因为在apache1时代,控制最大进程数只有MaxClients
这个参数,并且这个参数最大值为256,并且是写死了的,试图设置为超过256是无效的,这是由于apache1时代的服务器硬件限制的。但是apache2时代由于服务器硬件的升级,硬件已经不再是限制,所以使用ServerLimit
这个参数来控制最大进程数,ServerLimit
值>=MaxClient
值才有效。ServerLimit
要放在MaxClients
之前,值要不小于MaxClients
。
注4:查看Apache加载的模块
[root@www ~]#apachectl -t -D DUMP_MODULES
或
[root@www ~]# apachectl -M
或
[root@www ~]# apachectl –l
如何查看Apache的工作模式呢?可以使用httpd -V
命令查看,另外使用httpd -l
也可以查看到
1.2apache
查看编译参数
[root@nfs ~]# cat /usr/local/http-2.4.23/build/config.nice
#! /bin/sh
#
# Created by configure
"./configure" \
"--prefix=/usr/local/http-2.4.23" \
"--enable-so" \
"--enable-cgi" \
"--enable-cgid" \
"--enable-ssl" \
"--with-ssl=/usr/local/openssl" \
"--enable-rewrite" \
"--with-pcre=/usr/local/pcre" \
"--with-z=/usr/local/zlib" \
"--with-apr=/usr/local/apr" \
"--with-apr-util=/usr/local/apr-util" \
"--enable-modules=most" \
"--enable-mods-shared=most" \
"--enable-mpms-shared=all" \
"--with-mpm=event" \
"--enable-proxy" \
"--enable-proxy-fcgi" \
"--enable-expires" \
"--enable-deflate" \
"$@"
注5:如何修改
prefork
参数和启用prefork
模式
[root@www ~]# vi /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf
[root@www ~]# vi /usr/local/http-2.4.23/conf/httpd.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
Include conf/extra/httpd-mpm.conf
3.重启httpd
服务
2.Worker
模式(多线程多进程):
和prefork
模式相比,worker
使用了多进程和多线程的混合模式,worker
模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比prefork
有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全了,在使用keep-alive
长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在prefork
模式下也存在)
总的来说,prefork
方式速度要稍高于worker
,然而它需要的cpu和memory资源也稍多于woker。
2.1Apache
在worker
工作模式下影响性能的重要参数说明
# worker MPM
<IfModule mpm_worker_module>
StartServers 3
#apache启动时候默认开始的子进程数
MinSpareThreads 75
#最小空闲数量的工作线程
MaxSpareThreads 250
#最大空闲数量的工作线程
ThreadsPerChild 25
#每个子进程产生的线程数量
MaxRequestWorkers 400
#与prefork模式相同
MaxConnectionsPerChild 0
#与prefork模式相同
</IfModule>
注1: Worker 由主控制进程生成
StartServers
个子进程,每个子进程中包含固定的ThreadsPerChild
线程数,各个线程独立地处理请求。同样, 为了不在请求到来时再生成线程,MinSpareThreads
和MaxSpareThreads
设置了最少和最多的空闲线程数;而MaxRequestWorkers
设置了同时连入的clients
最大总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程MinSpareThreads
和MaxSpareThreads
的最大缺省值分别是75
和250
。这两个参数对Apache
的性能影响并不大,可以按照实际情况相应调节 。
注2:
ThreadsPerChild
是worker MPM
中与性能相关最密切的指令。ThreadsPerChild
的最大缺省值是64
,如果负载较大,64
也是不够的。这时要显式使用ThreadLimit
指令,它的最大缺省值是20000
。
注3: Worker模式下所能同时处理的请求总数是由子进程总数乘以
ThreadsPerChild
值决定的,应该大于等于MaxRequestWorkers
。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16
,加大时 也需要显式声明ServerLimit
(系统配置的最大进程数量,最大值是20000
)。需要注意的是,如果显式声明了ServerLimit
,那么它乘以ThreadsPerChild
的值必须大于等于MaxRequestWorkers
,而且MaxRequestWorkers
必须是ThreadsPerChild
的整数倍,否则 Apache将会自动调节到一个相应值。
注4:进程与线程的区别 线程是指进程内的一个执行单元,也是进程内的可调度实体.
2.2线程与进程的区别
- (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
- (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
- (3)线程是处理器调度的基本单位,但进程不是.
- (4)二者均可并发执行.
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。 进程和线程的区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
3.Event
模式:
这是Apache最新的工作模式,是worker
模式的变种,它把服务进程从连接中分离出来,一worker
模式不同的是在于它解决了keep-alive
长连接的时候占用线程资源被浪费的问题,在event
工作模式中,会有一些专门的线程用来管理这些keep-alive
类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。event
模式不能很好的支持https
的访问(HTTP认证相关的问题)。
ii.apache
配置参数
1.KeepAlive
On/Off
KeepAlive指的是保持连接活跃,换一句话说,如果将KeepAlive
设置为On,那么来自同一客户端的请求就不需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担。一般情况下,图片较多的网站应该把KeepAlive
设为On。
2.KeepAliveTimeOut
number
如果第二次请求和第一次请求之间超过KeepAliveTimeOut
的时间的话,第一次连接就会中断,再新建第二个连接。它的设置一般考虑图片或者JS等文件两次请求间隔,一般设置为3-5
秒。
3.MaxKeepAliveRequests
100
一次连接可以进行的HTTP请求的最大请求次数。将其值设为0将支持在一次连接内进行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面,通常达不到这个上限就完成连接了。
4.HostnameLookups
on|off|double
如果是使用on
,那么只有进行一次反查,如果用double
,那么进行反查之后还要进行一次正向解析,只有两次的结果互相符合才行,而off
就是不进行域名验证。
如果为了安全,建议使用double
;为了加快访问速度,建议使用off
。
域名查找开启这个会增加apache的负担, 减慢访问速度建议关闭
5.timeout
5
推荐5 这个是 apache接受请求或者发出相应的时间超过这个时间 断开
注:以上配置项可在/usr/local/http-2.4.23/conf/extra/httpd-default.conf
设置并在httpd.conf
文件中通过include
选项引用
iii.MPM
这个比较关键是影响并发效率的主要因素
1.StartServers
10
设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所以一般没有必要调整这个参数。
2.MinSpareServers
10
设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers
,那么Apache将以最大每秒一个的速度产生新的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。
3.MaxSpareThreads
75
设置空闲子进程的最大数量。如果当前有超过MaxSpareServers
数量的空闲子进程,那么父进程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比MinSpareServers
小,Apache将会自动将其修改成MinSpareServers+1
。
4.ServerLimit
2000
服务器允许配置的进程数上限。只有在你需要将MaxClients
设置成高于默认值256
的时候才需要使用。要将此指令的值保持和MaxClients
一样。修改此指令的值必须完全停止服务后再启动才能生效,以restart方式重启动将不会生效。
5.MaxClients
/ MaxRequestWorkers
256
用于客户端请求的最大请求数量(最大子进程数),任何超过MaxClients
限制的请求都将进入等候队列。默认值是256
,如果要提高这个值必须同时提高ServerLimit的值。建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000
。
6.MaxRequestsPerChild
/ MaxConnectionsPerChild
0
设置的是每个子进程可处理的请求数。每个子进程在处理了MaxRequestsPerChild
个请求后将自动销毁。0
意味着无限,即子进程永不销毁。内存较大的服务器可以设置为0
或较大的数字。内存较小的服务器不妨设置成30、50、100。所以一般情况下,如果你发现服务器的内存直线上升,建议修改该参数试试。
注:以上配置项可在/usr/local/http-2.4.23/conf/extra/httpd-mpm.conf
设置并在httpd.conf
文件中通过include
选项引用
iv.开启apache
的Gzip
(deflate
)功能
gzip
可以极大的加速网站,有时压缩比率高到80%,最少都有40%以上,还是相当不错的。在Apache2
之后的版本,模块名不叫gzip
,而叫mod_deflate
1.未使用Gzip
2.开启使用Gzip
2.1如果要开启deflate
的话,一定要打开下面二个模块
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
设置压缩比率,取值范围在1
(最低) 到9
(最高)之间,不建议设置太高,虽然有很高的压缩率,但是占用更多的CPU资源.
2.2mod_deflate
模块检查及安装
[root@www ~]# /usr/local/http-2.4.23/bin/apachectl -M | grep deflate
deflate_module (shared)
如果没有安装:
3.编译时安装方法
编译的时候跟上--enable-deflate
即可实现安装
4.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
[root@localhost filters]# apxs -c -i -a mod_deflate.c
/usr/local/apr/build-1/libtool --silent --mode=compile gcc -std=gnu99 -prefer-pic -DLINUX -D_REENTRANT -D_GNU_SOURCE -g -O2 -pthread -I/usr/local/http-2.4.23/include -I/usr/local/apr/include/apr-1 -I/usr/local/apr-util/include/apr-1 -c -o mod_deflate.lo mod_deflate.c && touch mod_deflate.slo
mod_deflate.c:51:18: fatal error: zlib.h: No such file or directory
#include "zlib.h"
^
compilation terminated.
apxs:Error: Command failed with rc=65536
.
添加这一行LoadFile /usr/lib/libz.so
到httpd.conf
中
[root@localhost filters]# apachectl graceful
httpd: Syntax error on line 108 of /usr/local/http-2.4.23/conf/httpd.conf: Cannot load /usr/lib/libz.so into server: /usr/lib/libz.so: cannot open shared object file: No such file or directory
[root@localhost filters]# grep libz.so /usr/local/http-2.4.23/conf/httpd.conf
LoadFile /usr/lib/libz.so
[root@localhost filters]#
需要在 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
[root@localhost ~]# ln -sv /usr/lib64/libz.so /usr/lib/libz.so
‘/usr/lib/libz.so’ -> ‘/usr/lib64/libz.so’
[root@localhost ~]# apachectl graceful
httpd: Syntax error on line 108 of /usr/local/http-2.4.23/conf/httpd.conf: Cannot load /usr/lib/libz.so into server: /usr/lib/libz.so: cannot open shared object file: No such file or directory
[root@localhost lib]# ln -sv /usr/lib64/libz
libzapojit-0.0.so.0 libzapojit-0.0.so.0.0.0 libz.so.1 libz.so.1.2.7
[root@localhost lib]# ln -sv /usr/lib64/libz.so.1 /usr/lib/libz.so
‘/usr/lib/libz.so’ -> ‘/usr/lib64/libz.so.1’
[root@localhost lib]# apachectl stop
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using ::1. Set the 'ServerName' directive globally to suppress this message
httpd (no pid file) not running
[root@localhost lib]# apachectl start
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using ::1. Set the 'ServerName' directive globally to suppress this message
[root@localhost lib]# apachectl -M | grep deflate
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using ::1. Set the 'ServerName' directive globally to suppress this message
deflate_module (shared)
这里要注意的是ln -sv /usr/lib64/libz.so /usr/lib/libz.so
这种方式是无效的,因为/usr/lib64/
下面并没有libz.so
这个文件,而当使用ln -sv /usr/lib64/libz.so.1 /usr/lib/libz.so
的时候是好使的。
这里的报错是正确的报错,的确是没有这个文件。
重新启动httpd :
# /usr/local/http2.4.23/bin/apachectl graceful #优雅启动httpd服务
5.修改Apache
配置文件开启gzip
压缩传输
5.1http.conf
修改、增加配置参数
LoadModule deflate_module modules/mod_deflate.so
LoadModule 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 image/*
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>
#设置日志输出!
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 ~]# tail -11 /usr/local/http-2.4.23/conf/httpd.conf
<IfModule mod_deflate.c>
DeflateCompressionLevel 9
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/*
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
</IfModule>
6.实际测试结果图
chrome
firefox
7.查看deflate_log
日志
[root@localhost logs]# cat deflate_log.log
"GET /apache.html HTTP/1.1" -/- (-%)
"GET /apache.html HTTP/1.1" 12493/43670 (28%)
"GET /favicon.ico HTTP/1.1" -/- (-%)
"GET /favicon.ico HTTP/1.1" -/- (-%)
"GET /apache.html HTTP/1.1" -/- (-%)
"GET /lemp.html HTTP/1.1" 7021/35902 (19%)
"GET /Learning_Python.txt HTTP/1.1" 1242271/4426564 (28%)
[root@localhost logs]# grep deflate_module /usr/local/http-2.4.23/conf/httpd.conf
#LoadModule deflate_module modules/mod_deflate.so
[root@localhost logs]# tail -11 /usr/local/http-2.4.23/conf/httpd.conf
#<IfModule mod_deflate.c>
# DeflateCompressionLevel 9
# SetOutputFilter DEFLATE
# AddOutputFilterByType DEFLATE text/*
# 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
#</IfModule>
[root@localhost logs]# apachectl graceful
v.配置mod_expires
模块
这个非常有用的优化,mod_expires
可以减少20-30%
左右的重复请求,让重复的用户对指定的页面请求结果都CACHE
在本地,根本不向服务器发出请求。但要注意更新快的文件不要这么做.
这个模块控制服务器应答时的Expires
头内容和Cache-Control
头的max-age
指令。有效期(expiration date
)可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。
1.未启用expire
的效果
[root@www htdocs]# curl -I 192.168.31.83/12.png
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 15:52:37 GMT
Server: Apache/2.4.23 (Unix)
Last-Modified: Sun, 23 Oct 2016 15:34:10 GMT
ETag: "8c9f-53f8a01b18080"
Accept-Ranges: bytes
Content-Length: 35999
Vary: Accept-Encoding
Content-Type: image/png
2.启用expire
缓存
mod_expires
的安装配置:
2.1启用expires_module
LoadModule expires_module modules/mod_expires.so
2.2然后添加Expires
配置规则
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "now plus 1 month"
ExpiresByType application/x-javascript "now plus 5 day"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/bmp "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType image/png "access plus 1 minutes"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresDefault "now plus 0 minutes"
</IfModule>
[root@apache ~]# tail -7 /usr/local/http-2.4.23/conf/httpd.conf
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "now plus 1 month"
ExpiresByType image/png "access plus 1minutes"
ExpiresDefault "now plus 0 minutes"
</IfModule>
[root@apache ~]# grep expires_module /usr/local/http-2.4.23/conf/httpd.conf
LoadModule expires_module modules/mod_expires.so
[root@apache ~]# apachectl graceful
AH00526: Syntax error on line 531 of /usr/local/http-2.4.23/conf/httpd.conf:
'ExpiresByType image/png access plus 1minutes': bad expires code, missing <type>
[root@apache ~]# tail -7 /usr/local/http-2.4.23/conf/httpd.conf
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "now plus 1 month"
ExpiresByType image/png "access plus 1 minutes"
ExpiresDefault "now plus 0 minutes"
</IfModule>
[root@apache ~]# apachectl graceful
1
和minutes
之间是有空格的
3.验证
[root@www htdocs]# curl -I 192.168.31.83/12.png
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 16:00:57 GMT
Server: Apache/2.4.23 (Unix)
Last-Modified: Sun, 23 Oct 2016 15:34:10 GMT
ETag: "8c9f-53f8a01b18080"
Accept-Ranges: bytes
Content-Length: 35999
Cache-Control: max-age=60
Expires: Tue, 25 Oct 2016 16:01:57 GMT
Vary: Accept-Encoding
Content-Type: image/png
[root@apache ~]# curl -I 192.168.142.56/test.png
HTTP/1.1 200 OK
Date: Fri, 28 Oct 2016 13:08:36 GMT
Server: Apache/2.4.23 (Unix)
Last-Modified: Sun, 11 Sep 2016 13:21:03 GMT
ETag: "f4b3-53c3b404bcdc0"
Accept-Ranges: bytes
Content-Length: 62643
Cache-Control: max-age=60
Expires: Fri, 28 Oct 2016 13:09:36 GMT
Content-Type: image/png
ExpiresDefault
和ExpiresByType
指令同样能够用易懂的语法格式进行定义:
ExpiresDefault "<base> [plus] {<num> <type>}"
ExpiresByType type/encoding "<base> [plus] {<num> <type>}"
其中<base>
是下列之一:
access
now
(等价于access
')modification
plus
关键字是可选的。<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 image/gif "modification plus 5 hours 3 minutes"
注意,如果你使用基于最后修改日期的设置,Expires:
头将不会 被添加到那些并非来自于磁盘文件的内容。这是因为这些内容并不存在"最后修改时间"的属性。
# GIF有效期为1个月(秒数)
ExpiresByType image/gif A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/png A2592000
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A604800
ExpiresByType text/plain A604800
# HTML文档的有效期是最后修改时刻后的一星期
ExpiresByType text/html M604800
</IfModule>
"M"表示源文件的最后修改时刻,"A"表示客户端对源文件的访问时刻。后面的时间则以秒计算。 有关 Apache Expires Module 的介绍,可以参阅其官方文档
vi.Apache
禁止目录遍历
将Options Indexes FollowSymLinks
中的Indexes
去掉,就可以禁止 Apache 显示该目录结构。Indexes
的作用就是当该目录下没有 index.html
文件时,就显示目录结构。
[root@apache ~]# grep FollowSymLinks /usr/local/http-2.4.23/conf/httpd.conf
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
# Options Indexes FollowSymLinks
Options FollowSymLinks
[root@apache ~]# cd /usr/local/http-2.4.23/htdocs/
[root@apache htdocs]# ls
apache.html index.html Learning_Python.txt lemp.html test.png
[root@apache htdocs]# mv index.html index.jsp
[root@apache ~]# grep FollowSymLinks /usr/local/http-2.4.23/conf/httpd.conf
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
# Options Indexes FollowSymLinks
Options Indexes FollowSymLinks
[root@apache ~]# apachectl graceful
vii.apache
隐藏版本信息
测试默认 apache 的状态信息
[root@www htdocs]# curl -I 192.168.31.83
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 16:09:09 GMT
Server: Apache/2.4.23 (Unix)
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Cache-Control: max-age=0
Expires: Tue, 25 Oct 2016 16:09:09 GMT
Content-Type: text/html
1、主配置中启用httpd-default.conf
Include conf/extra/httpd-default.conf
[root@apache ~]# grep httpd-default.conf /usr/local/http-2.4.23/conf/httpd.conf
Include conf/extra/httpd-default.conf
2、修改httpd-default.conf
文件:/usr/local/http-2.4.23/conf/extra/httpd-default.conf
找到
ServerTokens Full
ServerSignature On
改成
ServerTokens Prod
ServerSignature off
[root@apache ~]# grep ServerTokens /usr/local/http-2.4.23/conf/extra/httpd-default.conf
# ServerTokens
# ServerTokens Full
ServerTokens Prod
[root@apache ~]# grep ServerSignature /usr/local/http-2.4.23/conf/extra/httpd-default.conf
# ServerSignature Off
ServerSignature Off
重启 apache 测试
[root@apache ~]# apachectl graceful
测试隐藏版本号后 apache 的状态信息
[root@www htdocs]# curl -I 192.168.31.83
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 16:14:32 GMT
Server: Apache
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Cache-Control: max-age=0
Expires: Tue, 25 Oct 2016 16:14:32 GMT
Content-Type: text/html
[root@apache ~]# curl -I 192.168.142.56
HTTP/1.1 200 OK
Date: Fri, 28 Oct 2016 13:42:12 GMT
Server: Apache
Cache-Control: max-age=0
Expires: Fri, 28 Oct 2016 13:42:12 GMT
Content-Type: text/html;charset=ISO-8859-1
如果你需要彻底将版本之类的信息进行改头换面,你就需要在编译之前做准备或者进行从新编译了。在重新编译时,修改源码包下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 #
上述列出的行,已经给出了注释,大家可以修改成自己想要的,然后编译安装之后,对方就彻底不知道你的版本号了。
viii.Apache
日志切割
1.为什么要分割日志
随着网站的访问越来越大,WebServer产生的日志文件也会越来越大,如果不对日志进行分割,那么只能一次将大的日志(如Apache的日志)整个删除,这样也丢失了很多对网站比较宝贵的信息,因为这些日志可以用来进行访问分析、网络安全监察、网络运行状况监控等,因此管理好这些海量的日志对网站的意义是很大的。
2.rotatelogs
使用方法
方法1:使用rotatelogs
(apache自带的工具) 每隔一天记录一个日志
辑Apache的主配置文件,更改内容如下:
注释掉如下两行
ErrorLog logs/error_log
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
[root@apache ~]# grep ErrorLog /usr/local/http-2.4.23/conf/httpd.conf
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# ErrorLog "logs/error_log"
ErrorLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/error_%Y%m%d.log 86400"
[root@apache ~]# grep CustomLog /usr/local/http-2.4.23/conf/httpd.conf
# a CustomLog directive (see below).
# CustomLog "logs/access_log" common
CustomLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/acces_%Y%m%d.log 86400" combined
#CustomLog "logs/access_log" combined
# CustomLog logs/deflate_log.log deflate
注:其中86400
为轮转的时间单位为秒
验证:查看
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
访问以下网站
[root@apache ~]# apachectl graceful
[root@apache ~]# ls /usr/local/http-2.4.23/logs/
acces_20161028.log access_log deflate_log.log error_20161028.log error_log httpd.pid
[root@apache logs]# tail acces_20161028.log
192.168.142.1 - - [28/Oct/2016:21:58:15 +0800] "GET / HTTP/1.1" 200 403 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"
由于apache
自带的日志轮询工具rotatelogs
,据说在进行日志切割时容易丢日志,因此我们通常使用cronolog
进行日志轮询。
3.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
[root@apache ~]# grep ErrorLog /usr/local/http-2.4.23/conf/httpd.conf
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# ErrorLog "logs/error_log"
ErrorLog "|/usr/local/sbin/cronolog logs/error_cronolog_%Y%m%d.log "
[root@apache ~]# grep CustomLog /usr/local/http-2.4.23/conf/httpd.conf
# a CustomLog directive (see below).
# CustomLog "logs/access_log" common
CustomLog "|/usr/local/sbin/cronolog logs /%Y%m%d/acces_log.%H " combined
#CustomLog "logs/access_log" combined
# CustomLog logs/deflate_log.log deflate
[root@apache ~]# apachectl graceful
[root@apache logs]# ls
acces_20161028.log cronolog-1.6.2 deflate_log.log error_cronolog_20161028.log httpd.pid
access_log cronolog-1.6.2.tar.gz error_20161028.log error_log
[root@apache logs]# grep CustomLog /usr/local/http-2.4.23/conf/httpd.conf
# a CustomLog directive (see below).
# CustomLog "logs/access_log" common
CustomLog "|/usr/local/sbin/cronolog logs /acces_cronolog_%Y%m%d.log " combined
#CustomLog "logs/access_log" combined
# CustomLog logs/deflate_log.log deflate
[root@apache logs]# apachectl graceful
"/usr/local/http-2.4.23/conf/httpd.conf" 536L, 19840C written
[root@apache logs]#
[root@apache logs]# grep CustomLog /usr/local/http-2.4.23/conf/httpd.conf
# a CustomLog directive (see below).
# CustomLog "logs/access_log" common
# CustomLog "|/usr/local/sbin/cronolog logs /acces_cronolog_%Y%m%d.log " combined
CustomLog "|/usr/local/sbin/cronolog logs/access-%Y%m%d.log" combined
#CustomLog "logs/access_log" combined
# CustomLog logs/deflate_log.log deflate
[root@apache logs]# apachectl graceful
[root@apache logs]# ls
acces_20161028.log cronolog-1.6.2 deflate_log.log error_cronolog_20161028.log httpd.pid
access_log cronolog-1.6.2.tar.gz error_20161028.log error_log
[root@apache logs]# ls
acces_20161028.log access_log cronolog-1.6.2.tar.gz error_20161028.log error_log
access-20161028.log cronolog-1.6.2 deflate_log.log error_cronolog_20161028.log httpd.pid
[root@apache logs]# tail access-20161028.log
192.168.142.1 - - [28/Oct/2016:22:14:14 +0800] "GET /test.png HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"
logs/access
关键就是这里你上面的logs /acces_cronolog_%Y%m%d.log
在logs
和/access
之间有空格,这两个中间不能有空格。
如果Apache中有多个虚拟主机,最好每个虚拟主机中放置一个这样的代码,并将日志文件名改成不同的名字。
4.扩展
这个保证了每天一个文件夹 文件夹下 每个小时产生一个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
时不能自动创建,这一点要特别注意
ix.配置防盗链
有时候,你的网站莫名其妙的访问量变大,不要高兴的太早,有可能是被别人盗链了。
举个例子:比如你搭了个discuz论坛,里面有些热点图片、视频;然后别人将他网站上访问图片的地址重定向到你的discuz上,这样他的服务器就可以空闲出来了;也就是说别人访问他网站的图片视频,消耗的确是你服务器的资源; 解决这个问题的方法是配置下防盗链,让外来的盗不了链;
1. rewrite
实现防盗
方法1:Apache 防盗链的第一种实现方法,可以用rewrite
实现。
首先要确认 Apache 的
rewrite module
可用:
[root@www ~]# apachectl -M | grep rewrite
rewrite_module (shared)
打开
httpd.conf
,确保有这么一行配置:
LoadModule rewrite_module modules/mod_rewrite.so
然后在找到自己网站对应的配置的地方(如在主配置文件中或虚拟主机中),加入下列代码:
ServerName www.benet.com
#防盗链配置
RewriteEngine On
RewriteCond %{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.1相关选项的解释
参数 | 作用 |
---|---|
RewriteEngine On |
#启用rewrite ,要想rewrite起作用,必须要写上 |
RewriteCond test-string condPattern |
#写在RewriteRule之前,可以有一或N条,用于测试rewrite的匹配条件,具体怎么写,后面会详细说到。 |
RewriteRule Pattern Substitution |
#规则 |
%{HTTP_REFERER} : |
服务器变量,HTTP Referer 是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer 中统计出每天有多少用户点击我主页上的链接访问他的网站。 |
[ NC] |
指的是不区分大小写 |
[R] |
强制重定向 redirect |
2.防盗链配置的说明
颜色 | 解释 |
---|---|
红色部分 | 表示自己的信任站点。对我的站点来说,设置为 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.1超链接测试
[root@nfs htdocs]# cat index.html
<html>
<title>Jason</title>
<body><h1>This is jason!</h1></body>
<a href='http://192.168.142.56/test.png'><font color=red>Rewrite Test</font></a>
</html>
2.2超链接语法
[root@nfs htdocs]# cat index.html
<html>
<title>Jason</title>
<body><h1>This is jason!</h1></body>
<a href="http://192.168.142.56/test.png"><font color=red>Rewrite Test</font></a>
</html>
将'
变成 "
General
Request URL:http://192.168.142.56/test.png
Request Method:GET
Status Code:200 OK (from disk cache)
Remote Address:192.168.142.56:80
Response Headers
Accept-Ranges:bytes
Cache-Control:max-age=60
Content-Length:62643
Content-Type:image/png
Date:Fri, 28 Oct 2016 23:16:52 GMT
ETag:"f4b3-53c3b404bcdc0"
Expires:Fri, 28 Oct 2016 23:17:52 GMT
Last-Modified:Sun, 11 Sep 2016 13:21:03 GMT
Server:Apache
Request Headers
Provisional headers are shown
Referer:http://192.168.142.59/
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
测试成功
而且可以看到这里是from disk cache
还有Referer
是链接到这里的地址-http://192.168.142.59/
[root@apache ~]# apachectl -M | grep rewrite
rewrite_module (shared)
[root@apache ~]# grep rewrite_module /usr/local/http-2.4.23/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so
[root@apache ~]# grep Rewrite /usr/local/http-2.4.23/conf/httpd.conf
RewriteEngine On
RewriteCond %{HTTP_PREFERER} !^http://192.168.142.56/.*$ [NC]
RewriteRule .*\.(png)$ http://192.168.142.56/about/noti.html [N,RC]
[root@apache ~]# cd /usr/local/http-2.4.23/htdocs/
[root@apache htdocs]# mkdir about
[root@apache htdocs]# cd about/
[root@apache about]# cat noti.html
<h1><font color=red>Warning !</font></h1>
[root@apache about]# apachectl graceful
AH00526: Syntax error on line 218 of /usr/local/http-2.4.23/conf/httpd.conf:
RewriteRule: unknown flag 'RC'
[root@apache ~]# grep Rewrite /usr/local/http-2.4.23/conf/httpd.conf
RewriteEngine On
RewriteCond %{HTTP_PREFERER} !^http://192.168.142.56/.*$ [NC]
RewriteRule .*\.(png)$ http://192.168.142.56/about/noti.html [R,NC]
[root@apache ~]# apachectl graceful
3.SetEnvIfNoCase
和access
实现防盗
方法2:通过判断浏览器头信息来阻止某些请求,即利用SetEnvIfNoCase
和access
。
这个方法可以通过阻止某些机器人或蜘蛛爬虫抓取你的网站来节省你的带宽流量。
语法:
SetEnvIfNoCase attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...
SetEnvIfNoCase
当满足某个条件时,为变量赋值,即根据客户端请求属性设置环境变量。
注:Referer
:指明了请求当前资源原始资源的URL
,使用referer
是可以防盗链
然后在找到自己网站对应的配置的地方(如在主配置文件中或虚拟主机中),加入下列代码:
SetEnvIfNoCase Referer "^http://www.benet.com" local_ref
SetEnvIfNoCase Referer "^http://benet.com" local_ref
<filesmatch "\.(mp3|mp4|zip|rar|jpg|gif|png)">
SetEnvIfNoCase Referer "^http://192.168.142.56" local_ref
<filesmatch "\.(png)">
Require all denied
Require env local_ref
</filesmatch>
[root@apache ~]# apachectl graceful
4.2.4版本以下
方法一: 回目录
Order Deny,Allow
Allow from env=local_ref
Deny from all
方法二: 回目录
Order Allow,Deny
Allow from env=local_ref
5.2.4版本以上
Require all denied
Require env local_ref
</filesmatch>