Apache优化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache优化相关的知识,希望对你有一定的参考价值。
新增模块;
mod_proxy_fcgi(可提供fcgi代理)
mod_ratelimit(限制用户带宽)
mod_request(请求模块,对请求做过滤)
mod_remoteip(匹配客户端的IP地址)
对于基于IP的访问控制做了修改,不再支持allow,deny,order机制,而是统一使用require进行
1、MPM支持在运行时装载;不过要开启这种特性,在编译安装要启用这三种功能;--enable-mpms-shared=all --with-mpm=event
2、支持event
3、支持异步读写
4、在每个模块及每个目录上指定日志级别
5、增强版的表达式分析器
6、每请求配置:<If>, <Elseif>
7、毫秒级别的keepalive timeout
8、基于FQDN的虚拟主机不再需要NameVirtualHost指令
9、支持使用自定义变量
在编译安装时需要配置./configure;
相关参数解释:
--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调优的一个重要选项之一。
以上是安装前的优化;
那么接下来说安装后的优化:
pache所运行的硬件环境都是对性能影响最大的因素,即使不能对硬件进行升级,也最好给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要高,但是内存使用大得多不擅长处理高并发的场景。
Apache在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>
2、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选项引用
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选项引用
3、开启apache的Gzip(deflate)功能
gzip可以极大的加速网站,有时压缩比率高到80%,最少都有40%以上,还是相当不错的。在Apache2之后的版本,模块名不叫gzip,而叫mod_deflate
如果要开启deflate的话,一定要打开下面二个模块
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
a.编译时安装方法
编译的时候跟上--enable-deflate即可实现安装
b.DSO方式安装
[[email protected] ~]# 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中
配置mod_expires模块
这个非常有用的优化,mod_expires可以减少20-30%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求。但要注意更新快的文件不要这么做。
启用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 minutes"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresDefault "now plus 0 minutes"
</IfModule>
4、Apache禁止目录遍历
将Options Indexes FollowSymLinks中的Indexes 去掉,就可以禁止 Apache 显示该目录结构。Indexes 的作用就是当该目录下没有 index.html文件时,就显示目录结构。
5、apache 隐藏版本信息
测试默认 apache 的状态信息
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 Full
ServerSignature On
改成
ServerTokens Prod
ServerSignature off
重启 apache 测试
6、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
方法2、使用 cronolog 为每一天建立一个新的日志
安装cronolog程序
下载cronolog
[[email protected] ~]# tar zxf cronolog-1.6.2.tar.gz
[[email protected] ~]# cd cronolog-1.6.2/
[[email protected] 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
7、配置防盗链
有时候,你的网站莫名其妙的访问量变大,不要高兴的太早,有可能是被别人盗链了。
举个例子:比如你搭了个discuz论坛,里面有些热点图片、视频;然后别人将他网站上访问图片的地址重定向到你的discuz上,这样他的服务器就可以空闲出来了;也就是说别人访问他网站的图片视频,消耗的确是你服务器的资源;
解决这个问题的方法是配置下防盗链,让外来的盗不了链;
方法1:Apache 防盗链的第一种实现方法,可以用rewrite实现。
首先要确认 Apache 的rewrite module可用:
[[email protected] ~]# apachectl -M | grep rewrite
rewrite_module (shared)
打开 httpd.conf,确保有这么一行配置:
LoadModule rewrite_module modules/mod_rewrite.so
然后在找到自己网站对应的配置的地方(如在主配置文件中或虚拟主机中),加入下列代码:
ServerName www.***.com
本文出自 “12858388” 博客,转载请与作者联系!
以上是关于Apache优化的主要内容,如果未能解决你的问题,请参考以下文章