nginx大流量負載調優

優化nginx包括兩方面: css

1.是本身重寫nginx代碼(好比tengine)、自己nginx的代碼已經足夠優秀,若是不是每秒幾千的請求,就忽略這個部分吧。 node

2.另外一個就是和優化nginx的配置,這是中小型網站能夠重點優化的部分。 linux

nginx的配置文件是一種聲明式定義,控制nginx的每個細節。 nginx

所謂負載調優,就是提升單臺機器處理效率,下降單臺機器的負載。 chrome

爲了提升單臺機器的處理效率,cpu的處理速度是足夠快的,咱們能解決的就是下降磁盤I/O、網絡I/O,減小內存使用。 後端

下降單臺機器的負載咱們能作的就是負載均衡,把流量打到多臺機器處理。 瀏覽器

nginx推薦優化內容: 緩存

1.open files數量優化
ulimit -a查看系統參數
其中
open files (-n) 1024
表示系統同時最多能打開的文件數,linux下的全部設備均可以認爲是文件,包括網絡鏈接,若是同時超過1024個鏈接,那麼nginx的日誌就會報「24: Too many open files」 網絡

多以優化的第一步就是設置open files爲ulimit 負載均衡

修改/etc/profile,增長
ulimit -n 65535

2.Worker Processes數量優化
一般來講設置一個cpu核心對應一個worker processer,最多不超過4個,提升worker process的值是爲了提升計算能力,但通常在越到cpu瓶頸前,你會遇到別的瓶頸(如網絡問題)。

只有當你要處理大量靜態文件的磁盤I/O時,worker進程是單線程的,因此這個讀取文件的阻塞IO會下降CPU的處理速度,這是能夠增長worker進程數量,其它狀況是不須要的。

3.worker進程鏈接數優化(Worker Connections)
默認狀況下這個值是worker_connections 1024,也就是說考慮到keep-alive超時65秒,每一個瀏覽器平均消耗兩個連接(chrome會同時打開多個鏈接來提到加載速度)。

那麼默認狀況下nginx平均每秒能處理1024/65/2=8,那麼8*86440=64w,差很少至關於天天有60萬ip。

多以普通網站默認值就能夠了,若是你的流量一直提高,能夠考慮增長這個值爲2048或者更高。

3. CPU Affinity
用來設置worker進程使用哪一個cpu核心處理請求而且一直使用這個cpu核心。若是你不知道cpu調度,最好別碰這個,操做系統比你更懂如何調度。

4. Keep Alive

Keep alive 沒有數據傳輸的狀況下保持客戶端和服務端的鏈接,也就是保持空鏈接一段時間,避免重現創建連接的時間消耗。nginx處理空鏈接的效率很是高,1萬個空鏈接大約消耗2.5M內存。若是流量很是大的網站,減小創建鏈接的時間開銷是很是客觀的。keep alive的值設置在10-20s之間比較合理。

5. tcp_nodelay 和 tcp_nopush優化
這兩個指令影響nginx的底層網絡,它們決定操做系統如何處理網絡層buffer和何時把buffer內容刷新給終端用戶。若是你不懂,就能夠保持這兩個指令默認不變,對nginx性能影響不明顯。

6. access日誌優化
默認狀況下,access日誌會記錄全部請求到日誌文件,寫操做會增長IO操做,若是不須要統計信息,可使用百度統計或者cnzz統計,徹底能夠關閉日誌,來減小磁盤寫,或者寫入內存文件,提升IO效率。

7. Error日誌優化
錯誤日誌會記錄運行中的錯誤,若是設置的過低,會記錄的信息太多,會產生大量IO,推薦設置爲warn,這樣能夠記錄大部分信息,而不會有太多IO

8. Open File Cache
nginx會讀文件系統的許多文件,若是這些文件的描述符可以緩存起來,那麼會提升處理效率。詳見http://wiki.nginx.org/HttpCoreModule#open_file_cache

9. Buffers size優化
buffer的大小是你須要調優最重要參數。若是buffer size過小就會到致使nginx使用臨時文件存儲response,這會引發磁盤讀寫IO,流量越大問題越明顯。

client_body_buffer_size 處理客戶端請求體buffer大小。用來處理POST提交數據,上傳文件等。client_body_buffer_size 須要足夠大以容納若是須要上傳POST數據。

fastcgi_buffers,proxy_buffers 處理後端(PHP,Apache)響應。若是這個buffer不夠大,一樣會引發磁盤都系IO。須要注意的是它們有一個上限值,這個上限值受 fastcgi_max_temp_file_size 、 proxy_max_temp_file_size控制。

10.磁盤IO
若是能把數據全放到內存,不使用磁盤就能夠徹底去掉磁盤IO。 默認狀況下操做系統也會緩存頻繁訪問的數據以下降IO。因此預算足夠的狀況加,加大內存。

11.網絡IO
假設咱們沒有了磁盤IO,全部數據都在內存,那麼咱們的讀IO大概有3-6gbps。這種狀況下,若是你網絡差,同樣會很慢。因此儘量提升網絡帶寬,壓縮傳輸數據。

網絡帶寬買你能買的起的最大帶寬,nginx的gzip模塊能夠用來壓縮傳輸數據,一般gzip_comp_level 設爲 4-5,再高就是浪費cpu了。同時也能夠採用css,js壓縮技術,固然這些技術就與nginx優化無關了。。

絕招
若是你還想提升nginx處理能力,只能祭出大殺器了。別優化了,加機器吧。一點點優化是沒有用的,不如擴展機器來的快些。

ps 說道系統的擴展性一般有scale、和extension,區別是前者是數量上擴展,後者是功能上擴展。