2016年9月12日 星期一

debian 8.5版之apache2.4優調(避免流量暴增時掛點)

  1. vim /etc/apache2/apache2.conf
    • Timeout 60 預設值300
      不論接收或傳送,當持續連線等待超過 60 秒則該次連線就中斷。
    • KeepAlive On 預設
      如果你的網頁內含很多圖檔,那麼一次連線就會將所有的資料送完。
    • MaxKeepAliveRequests 500 預設值100
      該次連線能夠傳輸的最大傳輸數量,0 代表不限制。
    • KeepAliveTimeout 5 預設值5
      該次連線在最後一次傳輸後等待延遲的秒數,如設太高則在較忙碌的系統上將會有較多的 Apache 程序佔用資源。
  2. MPM (Mutil-Processing Module)設定(重要,連接數設定)
    1. MPM 有兩種:prefork 和 worker。debian 8.5預設啟動prefork
    2. 可執行apachectl -V 做確認,prefork設定
      • vim /etc/apache2/mods-available/mpm_prefork.conf
        • ServerLimit 500 伺服器限制,預設無,如果想將MaxRequestWorkers設超過256,必須設定,且放在MaxRequestWorkers上面。
        • StartServers 5 預設,啟動 apache2 時,喚醒幾個 PID 來處理服務。
        • MinSpareServers 5 預設,最小的預備使用的 PID 數量
        • MaxSpareServers 10 預設,最大的預備使用的 PID 數量
        • MaxRequestWorkers 500 預設150,最大連線數到 apache2
        • MaxConnectionsPerChild 0 預設0,每個程序所能夠提供的最大傳輸次數要求,0代表無限制。
      • 執行 apachectl configtest 測試參數是否正確
  3. 關閉apache後,再開啟。不可使用restart的方式
  4. 本文參考
減少不必要的等待(參考廖子儀文件
vim /etc/apache2/apache2.conf
為了效能,建議關閉 DNS 的查尋和提高 MaxKeepAliveRequests 的選項、把 Timeout 值調低。
Timeout 值要縮短,在一個大流量的網路服務(良好的硬體設備,高頻寬的網路速度),在同一時間是需要能夠服務更多的使用者,如果 Timeout 太高,那麼在連線佔滿時下一個連線請求就要等到有連線結束掉才能夠被服務;相反的若設定太低那麼就要常常重新連線。
當一個連線被建立之後,使用者很有可能會在短時間之內又提出新的請求,所以為了避免再次
的連線,就會在本次要求結束後,保持連線 KeepAliveTimeout 秒,若是超過了keepAliveTimeout秒,其 Timeout 就會轉交給連線逾時,也就是 Timeout 秒之後,會自動斷掉連線。
  1. Timeout 60 連線超過 60 秒失敗就重試
  2. KeepAlive On
  3. MaxKeepAliveRequests 5000
  4. KeepAliveTimeout 3 KeepAlive 多久要自動 Timeout 掉
  5. HostnameLookups Off 關掉那費時的 DNS 查尋
減少TIME_WAIT避免造成伺服器無法訪問
linux指令:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

說明:
SYN_RECV表示正在等待處理的請求數
ESTABLISHED表示正常數據傳輸狀態
TIME_WAIT表示處理完畢,等待超時結束的請求數。

改變系統內核
sysctl -a 查詢系統目前狀態(設定值)

改變系統內核設定
vim /etc/sysctl.conf
  1. net.ipv4.tcp_syncookies=1 表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,默認為0
  2. net.ipv4.tcp_tw_reuse=1 允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0
  3. net.ipv4.tcp_tw_recycle=1 表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0
  4. net.ipv4.tcp_keepalive_time = 1200  預設7200秒
  5. net.ipv4.tcp_keepalive_intvl = 30  預設75秒
  6. net.ipv4.tcp_keepalive_probes = 3 預設9次
如果TCP連接1200秒後,內核發起probe,如果probe3次(每次30秒)不成功,內核才徹底放棄,認為該連接已失效。
sysctl -p 執行