Apache优化

Apache优化
一、执行安装脚本,安装Apache。
apache 所运行的硬件环境都是对性能影响最大的因素,即使不能对硬件进行升级,也最好给 apache 一个单独的主机以免受到其他应用的干扰。各个硬件指标中,对性能影响最大的是内存,对于静态内容(图片、javascript 文件、css 文件等),它决定了 apache 可以缓存多少内容,它缓存的内容越多,在硬盘上读取内容的机会就越少,大内存可以极大提高静态站点的速度;对动态高负载站点来说,每个请求保存的时间更多一些,apache 的 mpm 模块会为每个请求派生出相应的进程或线程分别处理,而进程或线程的数量与内存的消耗近似成正比,因此增大内存对提高动态站点的负载和运行速度也极为有利
其次是硬盘的速度,静态站点尤为突出,apache 不断的在读取文件并发送给相应的请求,硬盘的读写是极其频繁的;动态站点也要不断的加载 web 程序(php 等),一个请求甚至要读取十几个文件才能处理完成,因此尽可能的提高硬盘速度和质量对提高 apache 的性能是有积极意义的。最后是 cpu 和网络,cpu 影响的是 web 程序执行速度,网络影响流量大小。
1、Apache的工作模式;
Apache HTTP 服务器被设计为一个强大的、灵活的能够在多种平台以及不同环境下工作的服务器。这种模块化的设计就叫做“多进程处理模块”(Multi-Processing Module,MPM),也叫做工作模式。
Prefork 模式(一个非线程型的):其主要工作方式是:当 Apache 服务器启动后,mpm_prefork 模块会预先创建多个子进程(认为 5 个),每个子进程只有一个线程,当接收到客户端的请求后,mpm_prefork 模块再将请求转交给子进程处理,并且每个子进程同时只能用于处理单个请求。如果当前的请求数将超过预先创建的子进程数时,mpm_prefork 模块就会创建新的子进程来处理额外的请求。Apache 总是试图保持一些备用的或者是空闲的子进程用于迎接即将到来的请求。这样客户端的请求就不需要在接收后等候子进程的产生。由于在 mpm_prefork 模块中,每个请求对应一个子进程,因此其占用的系统资源相对其他两种模块而言较多。不过 mpm_prefork 模块的优点在于它的每个子进程都会独立处理对应的单个请求,这样,如果其中一个请求出现问题就不会影响到其他请求。Prefork 在效率上要比 Worker 要高,但是内存使用大得多不擅长处理高并发的场景。 2、Worker 模式(多线程多进程):
和 prefork 模式相比,worker 使用了多进程和多线程的混合模式,worker 模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比 prefork 有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响 Apache 的一部分,而不是全部。由于用到多进程多线程,
需要考虑到线程的安全了,在使用 keep-alive 长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在 prefork 模式下也存在)总的来说,prefork 方式速度要稍高于 worker,然而它需要的 cpu 和 memory 资源也稍多于woker。 3、Event 模式:
这是 Apache 最新的工作模式,是 worker 模式的变种,它把服务进程从连接中分离出来,一worker 模式不同的是在于它解决了 keep-alive 长连接的时候占用线程资源被浪费的问题,在event 工作模式中,会有一些专门的线程用来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。event 模式不能很好的支持 https 的访问(HTTP 认证相关的问题)。 4、进程与线程的区别
线程是指进程内的一个执行单元,也是进程内的可调度实体.
与进程的区别:
(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
(3)线程是处理器调度的基本单位,但进程不是.
(4)二者均可并发执行.进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:简而言之,一个程序至少有一个进程,一个进程至少有一个线程.线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
二、开启 apache 的 Gzip(deflate)功能
gzip 可以极大的加速网站,有时压缩比率高到 80%,最少都有 40%以上,还是相当不错的。在 Apache2 之后的版本,模块名不叫 gzip,而叫 mod_deflate未使用 Gzip
1、如果要开启 deflate 的话,一定要打开下面二个模块
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
设置压缩比率,取值范围在 1(最低) 到 9(最高)之间,不建议设置太高,虽然有很高的压缩率,但是占用更多的 CPU 资源.
mod_deflate 模块检查及安装(如果没有此模块那么下面有安装方法) 

如果没有安装:
a.编译时安装方法
编译的时候跟上--enable-deflate 即可实现安装
b.DSO 方式安装[root@www ~]# cd /root/httpd-2.4.23/modules/filters/ #切到 apache 源码包 mod_deflate 所在的目录下#/usr/local/http-2.4.23/bin/apxs -c -i -a mod_deflate.c #以 dso 的方式编译安装到 apache 中
# /usr/local/http2.2/bin/apxs -c -i -a /root/httpd-2.2.17/modules/metadata/mod_headers.c#以
dso 的方式编译安装到 apache 中
如果报错:
原因是缺少 zlib-devel 的安装包,装上就可以了。
[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 这行的上一行添加 LoadFile/usr/lib64/libz.so 即可。
重新启动 httpd:
# /usr/local/http2.4.23/bin/apachectl graceful #优雅启动 httpd 服务
修改 Apache 配置文件开启 gzip 压缩传输:
http.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
SetOutputFilter DEFLATE
注:在添加代码前最好先查一查要添加的代码是否存在
<IfModule mod_deflate.c>
DeflateCompressionLevel 9
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/*
AddOutputFilterByType DEFLATE application/ms* application/vnd*
AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
</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@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 压缩的。 

四、配置 mod_expires 模块

这个非常有用的优化,mod_expires 可以减少 20-30%左右的重复请求,让重复的用户对指定的页面请求结果都 CACHE 在本地,根本不向服务器发出请求。但要注意更新快的文件不要这么做。这个模块控制服务器应答时的 Expires 头内容和 Cache-Control 头的 max-age 指令。有效期(expiration date)可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。未启用 expire 的效果:
 

启用 expire 缓存:
mod_expires 的安装配置:
启用 expires_module
LoadModule 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 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 minute"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresDefault "now plus 0 minute"
</IfModule>
验证:

五、Apache 禁止目录遍历(配置文件里面找)
将 Options Indexes FollowSymLinks 中的 Indexes 去掉,就可以禁止 Apache 显示该目录结构。Indexes 的作用就是当该目录下没有 index.html 文件时,就显示目录结构。
六、apache 隐藏版本信息
测试默认 apache 的状态信息
 

文件:/usr/local/http-2.4.23/conf/extra/httpd-default.conf
找到
ServerTokens Full
ServerSignature On
改成
ServerTokens Prod
ServerSignatureoff
重启 apache 测试
测试隐藏版本号后 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 的日志)整个删除,这样也丢失了很多对网站比较
宝贵的信息,因为这些日志可以用来进行访问分析、网络安全监察、网络运行状况监控等,
因此管理好这些海量的日志对网站的意义是很大的。
方法 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
注:其中 86400 为轮转的时间单位为秒
验证:查看 logs 目录下的日志文件

由于 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 时不能自动创建,这一点要特别注意 八、配置防盗链
有时候,你的网站莫名其妙的访问量变大,不要高兴的太早,有可能是被别人盗链了。举个例子:比如你搭了个 discuz 论坛,里面有些热点图片、视频;然后别人将他网站上访问图片的地址重定向到你的 discuz 上,这样他的服务器就可以空闲出来了;也就是说别人访问
他网站的图片视频,消耗的确是你服务器的资源;解决这个问题的方法是配置下防盗链,让外来的盗不了链; 方法 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 192.168.24.128
#防盗链配置
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
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,L]
(第二台服务器配置)
 [root@localhost htdocs]# cat test.html 
<img src=http://192.168.135.15/1.jpg>
(第一台服务器配置)
[root@localhost htdocs]# ll
total 556
-rw-r--r--  1 root root 561276 Apr 20 16:36 1.png
drwxr-xr-x. 2 root root     23 Apr 20 16:43 about
-rw-r--r--. 1 root root     45 Jun 12  2007 index.html
[root@localhost htdocs]# cd about/
[root@localhost about]# ll
total 860
-rw-r--r-- 1 root root 879394 Jul 14  2009 nolink.png
注:相关选项的解释
1.RewriteEngine On #启用 rewrite, 要想 rewrite 起作用,必须要写上
2.RewriteCond test-string condPattern #写在 RewriteRule 之前,可以有一或 N 条,用于测试rewrite 的匹配条件,具体怎么写,后面会详细说到。
3.RewriteRule Pattern Substitution #规则
4. %{HTTP_REFERER} :服务器变量, HTTPReferer 是 header 的一部分,当浏览器向 web服务器发送请求的时候,一般会带上 Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就
能够从 HTTP Referer 中统计出每天有多少用户点击我主页上的链接访问他的网站。
5.[ NC]指的是不区分大小写,[R]强制重定向 redirect
6. 字母 L 表示如果能匹配本条规则,那么本条规则是最后一条(Last),忽略之后的规则
注:
RewriteCond %{HTTP_REFERER} !^$
上面这一行意在允许空“ HTTP_REFERER”的访问,即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。
RewriteCond %{HTTP_REFERER} !benet\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !www\.benet\.com/.*$ [NC]
设置允许访问的 HTTP 来源,包括网站自身。
RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png [R,NC,L]
将不满足 referer 条件的访问重定向至 nolink.png。 nolink.png 位于允许“盗链”的目录 about中,要相当注意,不然,警告信息和图片将无法在对方网站上显示。
注意:测试时要清除济浏览器缓存
防盗链配置的说明:
1. 红色部分: 表示自己的信任站点。对我的站点来说,设置为 http://www.benet.com 和http://benet.com
2. 绿色部分: 要保护文件的扩展名(以| 分开)。以这些为扩展名的文件,必须通过红色标注的网址引用,才可以访问。
3. 蓝色部分: 定义被盗链时替代的图片,让所有盗链 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 是可以防盗链
然后在找到自己网站对应的配置的地方(如在主配置文件中或虚拟主机中),加入下列代码:(绿色的部分添自己的IP地址)
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)">
# 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>


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值