首页 > 代码库 > Apache调优
Apache调优
1、调整文件描述符大小,默认Linux系统的文件描述符是1024,对于squid等一些服务来说
在高负载的情况下这些文件描述符是远远不够的,所以在部署该类服务器时修改文件描述符是必要进行的操作
# ulimit –n #查看文件描述符大小
1024
# vim /etc/security/limits.conf #添加下面两行,重启系统永久生效
* soft nofile 65536
* hard nofile 65536
2、Xshell、SSH等远程连接异常断开:这可能是由于SSH超时断开连接导致的,解决办法如下
# vim /etc/ssh/sshd_config
ClientAliveInterval 60 #去掉注释,ClientAliveInterval,对应的0改成60
ClientAliveCountMax 3 #去掉注释,ClientAliveCountMax, 使用默认值3即可
# service sshd restart #重启sshd服务
3、内核参数优化
说明:本优化适合apache,nginx,squid等多种web应用,特殊的业务可能需要略做调整
# vim /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1 #表示开启SYN Cookies;当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击
net.ipv4.tcp_tw_reuse = 1 #表示开启重用;允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1 #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_fin_timeout = 30 #修改系統默认的 TIMEOUT 时间,从60改成30
net.ipv4.tcp_max_syn_backlog = 16384 #表示TCP三次握手建立阶段接受SYN请求队列的最大长度,默认为1024 将其设置大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的连接请求
net.ipv4.tcp_keepalive_time = 600 #启用keepalive时,TCP发送keepalive消息的频度,默认是2小时,设置小一些能更快地清理无效的连接
net.ipv4.tcp_sack = 1 #使TCP只是重发丢失的数据包,不用发送后续的所有数据包,提高了数据的传输效率
net.ipv4.tcp_timestamps = 1 #以一种比重发超市更精确的方法来启用对RTT的计算
net.ipv4.tcp_window_scaling = 1 #启用 TCP 窗口伸缩使客户机能够以更高的速度下载数据
net.core.rmem_max = 16777216 #最大的TCP数据接收缓冲,增加 TCP接收缓冲区
net.core.wmem_max = 16777216 #最大的TCP数据发送缓冲,增加 TCP发送缓冲区
net.ipv4.ip_local_port_range = 4000 65000 #定义了在UDP和TCP连接中本地(不包括连接的远端)端口的取值范围
net.ipv4.tcp_max_tw_buckets = 36000 #表示操作系统允许TIME_WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字
将立刻被清除并打印警告信息;该参数默认为180 000,过多的TIME_WAIT套接字会使Web服务器变慢
net.ipv4.route.gc_timeout = 100 #路由缓存刷新频率,当一个路由失败后多长时间跳到另一个,默认是300
net.core.somaxconn = 16384 #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值
net.core.netdev_max_backlog = 16384 #表示socket监听(listen)的backlog上限
backlog就是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog
net.ipv4.tcp_max_orphans = 16384 #系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上
这个限制仅仅是为了防止简单的DOS攻击,不能过分依赖,如果增加内存,就要增加这个值
net.ipv4.tcp_syn_retries = 1 #对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃
不应该大于255,默认值是5,对应于180秒左右,属于Nginx内核参数优化
net.ipv4.tcp_synack_retries = 1 #为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK
即三次握手中的第二次握手,这个设置决定了内核放弃连接之前发送SYN+ACK包的数量
调整以上参数后再执行以下命令,让修改结果立即生效:/sbin/sysctl -p
4、开启gzip压缩,修改httpd.conf配置文件(自己虚拟机安装路径为/etc/httpd/conf/httpd.conf)
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
将配置文件中上面两行的#去掉;这样apache就会启用这两个模块
其中mod_deflate是压缩模块,就是对要传输到客户端的代码进行gzip压缩
mod_headers模块的作用是告诉浏览器页面使用了gzip压缩
如果不开启mod_headers那么浏览器就会对gzip压缩过的页面进行下载,而无法正常显示
* 在配置文件中添加如下压缩配置:
# 压缩等级 9 //压缩等级越高,cpu开销也增多,压缩越厉害
DeflateCompressionLevel 4
# 压缩类型 html、xml、php、css、js
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/css text/javascript
AddOutputFilter DEFLATE js css
5、配静态文件缓存
1)开启apache扩展模块mod_expires.so,在apache的配置文件中加入下面一行代码
LoadModule expires_module modules/mod_expires.so
2)配置缓存,在apache配置文件中加入下面一段代码
配置缓存失效的时间
ExpiresActive on
ExpiresByType image/gif "access plus 7 days" 规定哪些格式缓存多长时间失效
ExpiresByType image/jpeg "access plus 7 days"
ExpiresByType image/png "access plus 7 days"
ExpiresByType text/css "now plus 3 days"
ExpiresByType application/x-javascript "now plus 3 days"
ExpiresByType application/x-shockwave-flash "now plus 3 days"
ExpiresDefault "now plus 120 min" 除了以上这些格式之外的不缓存
# /usr/local/apache2/bin/apachectl -t 检测错误
# /usr/local/apache2/bin/apachectl restart 重启Apache
6、避免使用域名跳转配置,域名跳转模块不用注释,不配置该模块就好了
7、访问日志若不用记录,就不记录,若非要记录,一定要把图片等静态文件访问日志过滤出来,不记录图片
# vim /etc/httpd/conf/httpd.conf
ErrorLog "logs/error_log"
SetEnvIf Request_URI \.gif$ gif-image
SetEnvIf Request_URI \.GIF$ gif-image
SetEnvIf Request_URI \.jpg$ gif-image
SetEnvIf Request_URI \.jpeg$ gif-image
SetEnvIf Request_URI \.JPG$ gif-image
SetEnvIf Request_URI \.png$ gif-image
SetEnvIf Request_URI \.js$ gif-image
SetEnvIf Request_URI \.bmp$ gif-image
SetEnvIf Request_URI \.css$ gif-image
SetEnvIf Request_URI \.mid$ gif-image
SetEnvIf Request_URI \.swf$ gif-image
CustomLog "logs/access_log" combined env=!gif-image
# service httpd restart 重启Apache,看到日志记录的都没有图片文件
# cat /var/log/httpd/access_log 查看日志
8、日志切割 rotatelogs (Apache自带的工具)
rotatelogs是一个配合Apache管道日志功能使用的简单程序
举例:CustomLog "|bin/rotatelogs /var/logs/logfile 86400" common
此配置会建立文件/var/logs/logfile.nnnn
其中的nnnn是名义上的日志启动时的系统时间(此时间总是回卷时间的倍数
可以用于cron脚本的同步),在回卷时间到达时(在此例中是24小时以后),会产生一个新的日志
举例:CustomLog "|/opt/apache/bin/rotatelogs /opt/apache/logs/access_log.%d-%m-%y 800M" common
此配置会在日志文件大小增长到800兆字节时回卷该日志,rotationtime日志文件回卷的以秒为单位的间隔时间
Apache日志切割:# vim /etc/httpd/conf/httpd.conf
ErrorLog "/var/log/httpd/error_log"
CustomLog "logs/access_log" combined env=!gif-image
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_log 86400" common
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/error_log 86400" common
# service httpd restart 重启Apache,看到日志记录的都没有图片文件
# cat /var/log/httpd/access_log 查看日志
9、在挂载文件系统的时候,使用 noatime 选项
在Linux下面挂载文件系统的时候设置noatime可以显著提高文件系统的性能
默认情况下,Linux ext2/ext3文件系统在文件被访问、创建、修改的时候记录下了文件的时间戳
比如:文件创建时间、最近一次修改时间和最近一次访问时间
系统运行的时候要访问大量文件,如果能减少一些动作(比如减少时间戳的记录次数等)
将会显著提高磁盘IO效率、提升文件系统性能,Linux提供了noatime这个参数来禁止记录最近一次访问时间戳
设置:给文件系统挂载的时候加上noatime参数能大幅提高文件系统性能
修改设置后只需要重新挂载文件系统、不需要重启就可以应用新设置
# vim /etc/fstab
/dev/mapper/vg_appserver-LogVol02 / ext4 defaults,noatime 1 1
UUID=58cfd42c-d876-4110-8025-ab7735a07f3b /boot ext4 defaults,noatime 1 2
/dev/mapper/vg_appserver-lv_root /var ext4 defaults,noatime 1 2
/dev/mapper/vg_appserver-lv_swap swap swap defaults,noatime 0 0
# mount -o remount /
# mount -o remount /boot
# mount -o remount /var
# mount
10、在apache安装过程中的编译步骤通过添加参数,进行优化
--with-mpm=worke 选择apache mpm的模式为worker模式;因为worker模式原理是更多的使用
线程来处理请求,所以可以处理更多的并发请求,而系统资源的开销(内存)小于基于进程的MPM prefork
--enable-cache 启用基于URL间的内容动态缓存(内存或者磁盘),Cache尽量加上,提高apache性能
--enable-disk-cache 启用基于磁盘的缓冲管理器
--enable-mem-cache 基于内存的缓冲管理器,详情见:http://blog.sina.com.cn/s/blog_72c948d701019rqf.html
--enable-file-cache 提供文件描述符缓存支持,从而提高apache性能
--enable-rewrite 提供基于URL规则的重写功能,根据已知URL地址,转换其他想要的url地址
--enable-ssl 使用安全套接字层(ssl)和传输层安全(tls)协议实现高强度加密传输,使支持https.
11、httpd.conf其他项调整
# vim /etc/httpd/conf/httpd.conf
timeout 120 //指定客户端与服务器连接超时的时间间隔;超过这个时间服务器没响应,就断开连接
keepalive timeout 15 //一次连接多次请求之间的间隔时间,如果一次连接后
在完成一次请求后,在这个间隔时间之内,没有收到下一个请求就中断连接,以秒为单位
Mod_cache配置:开启缓存,详情见:http://www.gosoa.com.cn/apache缓存mod_cache配置
12、调整线程,进程数,主要通过修改apache配置文件中的httpd-mpm.conf文件
StartServers 8 //初始化进程数
MinSpareServers 5 //设置为5,但是页面中显示为6.其中有一个为守护进程:/etc/sbin/httpd
MaxSpareServers 20 //最大的空闲
ServerLimit 1000 //最大值是2000,如果想设置更大的话需要编译时配置上ServerLimit这个参数
MaxClients 500 //修改最大连接数,默认最大250,在MaxClients前面设置ServerLimit,值大于MaxClients
MaxRequestsPerChild 10000
重启httpd后,通过反复执行pgrep httpd|wc -l来观察连接数
当连接数在达到MaxClients设值后不再增加,访问网站也顺畅,就可以不再修改了
13、服务器性能评估ab -c 并发个数 -n 请求个数,请求个数一定大于并发个数
# ls /usr/local/apache/bin
# ulimit -n 10000 设置最多请求进程数
服务器压力测试:# ab -c 10 -n 100 http://www.a.org/index.html
# ab -r -c 1000 -n 10000 http://www.a.org/index.html
说明:-c 1000 每次并发1000个,-n 10000 共发送10000个请求
测试失败个数为0,则是正常,失败个数不为0,你需要降低并发继续测试
复制内容多的文件:# cp /var/log/messages /www/a.org/test.html
再次压力测试:# ab -r -c 1000 -n 9000 http://www.a.org/test.html
复制大数据:# dd if=/dev/zero of=/www/a.org/new.html bs=1M count=2
压力测试:# ab -r -c 1000 -n 9000 http://www.a.org/new.html
大并发测试调优:企业自建web缓存一般不用apache或者nginx
都用varnish或者squid,大并发一般前面要用CDN来顶着,建议购买CDN
并发数最主要就是调两个方向:内核参数和mpm配置,网上搜:高并发、内核调优
Apache调优