首页 > 代码库 > 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调优