一、調整文件描述符大小,默認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