Apache調優

   一、調整文件描述符大小,默認Linux系統的文件描述符是1024,對於squid等一些服務來講
                在高負載的狀況下這些文件描述符是遠遠不夠的,因此在部署該類服務器時修改文件描述符是必要進行的操做

                # ulimit –n                                          #查看文件描述符大小
                  1024  
                # vim /etc/security/limits.conf             #添加下面兩行,重啓系統永久生效
                   *        soft     nofile     65536
                   *        hard     nofile     65536             

           二、Xshell、SSH等遠程鏈接異常斷開:這多是因爲SSH超時斷開鏈接致使的,解決辦法以下
                # vim /etc/ssh/sshd_config         
                   ClientAliveInterval 60                       #去掉註釋,ClientAliveInterval,對應的0改爲60
                   ClientAliveCountMax 3                     #去掉註釋,ClientAliveCountMax, 使用默認值3便可

                # service sshd restart                        #重啓sshd服務 

           三、內核參數優化
                說明:本優化適合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

            四、開啓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

            五、配靜態文件緩存
               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

            六、避免使用域名跳轉配置,域名跳轉模塊不用註釋,不配置該模塊就行了

            七、訪問日誌若不用記錄,就不記錄,若非要記錄,必定要把圖片等靜態文件訪問日誌過濾出來,不記錄圖片
                  # 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                                查看日誌

           八、日誌切割 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                                查看日誌

            九、在掛載文件系統的時候,使用 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

          十、在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.

          十一、httpd.conf其餘項調整
                  # vim /etc/httpd/conf/httpd.conf 

                  timeout 120                  //指定客戶端與服務器鏈接超時的時間間隔;超過這個時間服務器沒響應,就斷開鏈接
                  keepalive timeout   15   //一次鏈接屢次請求之間的間隔時間,若是一次鏈接後
                  在完成一次請求後,在這個間隔時間以內,沒有收到下一個請求就中斷鏈接,以秒爲單位
                  Mod_cache配置:開啓緩存,詳情見:http://www.gosoa.com.cn/apache緩存mod_cache配置

          十二、調整線程,進程數,主要經過修改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設值後再也不增長,訪問網站也順暢,就能夠再也不修改了

          1三、服務器性能評估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配置,網上搜:高併發、內核調優javascript

相關文章
相關標籤/搜索