apache优化
# Apache工作模式
Apache 的核心模块叫多路处理模块(Multi-Processing Module,简称 MPM),Linux 平台下主要有两种模式:==prefork 模式和 worker 模式==
# Prefork模式
prefork 是一种多路处理模块(MPM),实现了一个进程型的、预派生的 Web 服务器,适合于没有线程安全库、需要避免线程兼容性问题的系统。
编译安装时没有指定工作模式,默认会使用 prefork 模式,可用 httpd -l 或 httpd-V查看
工作原理:
控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers 设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒 32 个,直到满足MinSpareServers 设置的值为止。这就是预派生(prefork)的由来。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。在要求每个请求相互独立的情况下具有很好的特性,若一个请求出现问题不会影响到其他请求。具有很强的自我调节能力,只需要很少的配置指令进行调整就可以适合于企业应用要求。最重要的是将 MaxClients 设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以避免所需要的内存超出物理内存的大小
工作方式:
一个单独的控制进程(父进程)负责产生子进程,子进程用于监听请求并作出应答,因此在内存中会一直存在一些备用的(spare)或是空闲的子进程用于接收和响应新的请求,可加快响应速度
重要参数:
cat /usr/local/httpd/conf/extra/httpd-mpm.conf
StartServers 服务器启动时建立的子进程数量
MinSpareServers 空闲子进程最小数量,当空闲子进程数少于该数值将产生新的子进程
MaxSpareServers 空闲子进程最大数量,当空闲子进程数大于该数值将杀死多于子进程,这个值不要设得过大,但如果设的值比 MinSpareServers 小,Apache 会自动把其调整为MinSpareServers+1
MaxClients 限定最大用户并发数,是对 Apache 性能影响最大的参数。其缺省值 150是远远不够的,如果请求总数已达到这个值(可通过 ps -ef|grep http|wc -l 来确认),那么后面的请求就需要排队,直到某个进程处理请求完毕。这就是系统资源还剩下很多而HTTP 访问却很慢的主要原因。系统管理员可以根据硬件配置和负载情况来动态调整这个值。虽然理论上这个值越大,可以处理的请求就越多,但 Apache 默认的限制不能大于256。如果把这个值设为大于 256,那么 Apache 将无法起动。事实上,256 对于负载稍重的站点也是不够的。在 Apache 1.3 中,这是个硬限制。如果要加大这个值,必须在“configure”前手工修改的源代码树下的src/include/httpd.h 中查找 256,就会发现“#define HARD_SERVER_LIMIT 256”这行。把 256 改为要增大的值(如 4000),然后重新编译 Apache 即可。在 Apache 2.0 中新加入了 ServerLimit 指令,使得无须重编译 Apache就可以加大 MaxClients,内存(以 MB 为单位)除以 2 ,约等于MaxClients的值.
MaxRequestsPerChild 每个子进程在其生存期内允许伺服的最大请求数量。如果设置为“0”,子进程将永远不会结束。其中MaxRequestsPerChild 建议设定为一个非零值,子进程服务的请求数超过设置的值的限制后,子进程将会自动销毁。如果设成非零值也有两点重要的好处,能够防止内存泄漏无限进行,从而避免内存耗尽,也有助于当服务器负载减轻的时候减少活动进程的数量
注意:如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers
2
3
4
5
6
7
8
9
10
11
12
13
配置优化建议:
StartServers 与 MinServers 应该一样,根据网站的访问量进行设置,如设置 MaxClients 的数量为较大的一个值,以满足请求;
MaxRequestsPerChild 应该设置一个值(经验值 10000~30000),要结合系统的内存数量及负载进行配置
默认的 MaxClients 最大是 150 个进程,如配置更大值,就得配置 ServerLimit(服务极限)这个参数,200000 是该参数的最大值,如果一定要再加大这个数值,对位于源代码树下 server/mpm/prefork/prefork.c 中以下两行做相应修改即可:
#define DEFAULT_SERVER_LIMIT 256 #define MAX_SERVER_LIMIT 200000
1
2
# Worker模式
worker 是多路处理模块(MPM),使服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的 MPM。但是也使用了多进程,每个进程又有多个线程,以获得基于进程的 MPM 的稳定性。
控制该 MPM 的最重要的指令是:控制每个子进程允许建立的线程数 ThreadsPerChild 指令和控制允许建立的总线程数的 MaxClients 指令。
使用源码安装时,在./configure --with-mpm=worker 后,进行 make 编译、make install 才可以支持。
Prefork | Worker |
---|---|
多进程 | 多进程多线程 |
较慢 | 较快 |
CPU 占用率高 | CPU 占用率低 |
稳定 | 较不稳定 |
对bug 自我排错 | 无法自我排错 |
小流量网站使用 | 大流量网站使用 |
工作原理:
由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的 ThreadsPerChild 线程数,各个线程独立地处理请求。同样,为了不再请求到来时再生成线程,MinSpareThreads 和 MaxSpareThreads 设置了最少和最多的空闲线程数;而 MaxClients 设置了所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程
重要参数:
vim /usr/local/httpd/conf/extra/httpd-mpm.conf
StartServers 服务器启动时建立的子进程数量
MaxClients 限定最大用户并发数(数值为 ServerLimit 的值乘以 ThreadsPerChild的值)
MinSpareThreads 空闲子线程最小数量,当空闲子线程数少于该数值将产生新的子线程,缺省值75(对性能影响不大)
MaxSpareServers 空闲子线程最大数量,当空闲子线程数大于该数值将杀死多于子线程,缺省值250(对性能影响不大)
MaxRequestsPerChild 每个子进程在其生存期内允许伺服的最大请求数量。如果设置为“0”,子进程将永远不会结束
ThreadsPerChild 是worker MPM 中与性能相关最密切的指令。ThreadsPerChild 的最大缺省值是 64,如果负载较大,64 也是不够的。这时要使用 ThreadLimit 指令,它的最大缺省值是 20000,上述两个值位于源码树 server/mpm/worker/worker.c 中的以下两行:
#define DEFAULT_THREAD_LIMIT 64
#define MAX_THREAD_LIMIT 20000 (根据实际需求更改)
Worker 模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild 值决定的,应该大于等于 MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是 16,加大时也需要声明 ServerLimit(最大值是20000)。这两个值位于源码树 server/mpm/worker/worker.c 中的以下两行:
#define DEFAULT_SERVER_LIMIT 16
#define MAX_SERVER_LIMIT 20000
需要注意的是,如果声明了 ServerLimit,那么它乘以 ThreadsPerChild 的值必须大于等于 MaxClients,而且 MaxClients 必须是 ThreadsPerChild 的整数倍,否则 Apache 将会自动调节到一个相应值(可能是个非期望值),
每个进程能够拥有的线程数量是固定的,服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程能够建立
ThreadsPerChild 数量的服务线程和一个监听线程,监听线程监听接入请求并将其传递给服务线程处理和应答。
Apache 总是会维持一个备用(spare)或是空闲的服务线程池,客户端无需等待新的线程或进程的建立即可得到服务
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Apache保持连接
HTTP 协议是基于 TCP 协议之上的,在进行 HTTP 连接之前,要先进行 TCP 连接(TCP 三次握手),在连接结束后要对 TCP 连接进行终止(TCP 四次断开)。建立与关闭连接对于HTTP 协议而言会消耗很多的内存与 CPU 资源。
- keepalive ON|OFF:是否打开保持连接功能。根据网站的并发请求量决定是否打开,高并发时打开,并发量不高时可选择关闭。
- keepalive timeout:一次连接多次请求之间的最大间隔时间,两次请求超过此时间连接将会断开。
- maxkeepaliverequestes:一次连接能够传输的最大请求数量
# 网页压缩功能
网页压缩的优势:
- 加快网页加载的速度,改善用户的浏览体验
- 降低网络传输带宽,服务器节省流量
- 网页压缩有利于搜索引擎的抓取
Apache2.X系列内建了 ==mod_deflate== 这个模块,用于取代 mod_gzip 模块,编译时加上--enable-deflate参数。
查看apache已安装的模块
apachectl -D DUMP_MODULES
# 配置网页的缓存时间
启用 ==mod_expires== 模块,会自动生成页面头部信息中的 Expires 标签和 Cache-Control 标签,从而降低客户端的访问频率和次数,达到减少不必要的流量和增加访问速度的目的。
编译时加上--enable-expires参数
# Apache防盗链
主要使用使用 ==mod_rewrite== 模块
- !^ 不以…开头
- .*$ 以任意字符结尾
- NC 不区分大小写
- R 强制跳转
规则匹配说明:
- RewriteEngine ON 打开网页重写功能
- RewriteCond 设置匹配规则
- RewriteRule 设置跳转动作
在<Directory “/usr/local/httpd/htdocs”> 容器中,添加:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://source.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://source.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.source.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.source.com$ [NC]
RewriteRule .*\.(gif|jpg|png|swf)$ http://www.source.com/error.html [R,NC]
2
3
4
5
6
# 配置Apache隐藏版本号
方法一:修改配置文件(适合已安装apache的场景)
vim /usr/local/httpd/conf/httpd.conf
412 Include conf/extra/httpd-default.conf
vim /usr/local/httpd/conf/extra/httpd-default.conf
55 ServerTokens Prod
65 ServerSignature Off
2
3
4
5
6
方法二:修改源码包(适合还未安装apache的场景)
vim /usr/src/httpd-2.2.31/include/ap_release.h //修改以下变量
#define AP_SERVER_BASEPRODUCT "Microsoft-IIS"
#define AP_SERVER_MAJORVERSION_NUMBER 7
#define AP_SERVER_MINORVERSION_NUMBER 0
#define AP_SERVER_PATCHLEVEL_NUMBER 0
2
3
4
5
6
# 日志轮询
Apache日志轮询的方式:
- 第 1 种:利用 apache 自带的日志轮循程序 rotatelogs
- 第 2 种:利用一个发展已经比较成熟的日志轮循工具 cronolog
- 第 3 种:利用定时任务和 shell 脚本做日志切割
重启apache命令:
apachectl -k graceful
会重新加载配置,但 不会停止现有的正在处理的请求。主进程和正在有请求的进程不会变化。但如果配置文件语法有错误,apache服务将会停止。
service httpd reload
会重新加载配置,现有的请求会被中断,除了主进程外其他的进程都被重建。如果配置文件有语法问题的话,不会加载新的配置操作,保持原有配置,apache服务也不会停止。
日志合并:
sort -m -t " " -k 4 -o log_all access_log1 access_log2 access_log3
-m 使用 merge 优化算法 -k 4 表示根据时间进行排序 -o 表示将排序结果存放到指定的文件中