【nginx網站性能優化篇(4)】理解nginx的高併發原理及其配置調優

Nginx 是如何實現高併發的?

Nginx 採用的是多進程(單線程) & 多路IO複用模型。使用了 I/O 多路複用技術的 Nginx,就成了」併發事件驅動「的服務器。其實現了異步,非阻塞,使用了epoll 和大量的底層代碼優化。android

若是一個server採用一個進程負責一個request的方式,那麼進程數就是併發數。正常狀況下,會有不少進程一直在等待中。nginx

而nginx採用一個master進程,多個woker進程的模式。後端

  • master進程主要負責收集、分發請求。每當一個請求過來時,master就拉起一個worker進程負責處理這個請求。
  • 同時master進程也負責監控woker的狀態,保證高可靠性
  • woker進程通常設置爲跟cpu核心數一致。nginx的woker進程在同一時間能夠處理的請求數只受內存限制,能夠處理多個請求。

Nginx 的異步非阻塞工做方式正把當中的等待時間利用起來了。在須要等待的時候,這些進程就空閒出來待命了,所以表現爲少數幾個進程就解決了大量的併發問題。瀏覽器

[info] 題外話: 這和PHP擴展swoole的原理同樣

圖片描述

每進來一個request,會有一個worker進程去處理。但不是全程的處理,處理到什麼程度呢?處理到可能發生阻塞的地方,好比向上遊(後端)服務器轉發request,並等待請求返回。那麼,這個處理的worker很聰明,他會在發送完請求後,註冊一個事件:「若是upstream返回了,告訴我一聲,我再接着幹」。因而他就休息去了。此時,若是再有request 進來,他就能夠很快再按這種方式處理。而一旦上游服務器返回了,就會觸發這個事件,worker纔會來接手,這個request纔會接着往下走。緩存

爲何 Nginx 不使用多線程?

Apache: 建立多個進程或線程,而每一個進程或線程都會爲其分配 cpu 和內存(線程要比進程小的多,因此worker支持比perfork高的併發),併發過大會耗光服務器資源。性能優化

Nginx: 採用單線程來異步非阻塞處理請求(管理員能夠配置Nginx主進程的工做進程的數量)(epoll),不會爲每一個請求分配cpu和內存資源,節省了大量資源,同時也減小了大量的CPU的上下文切換。因此才使得Nginx支持更高的併發。服務器

配置調優

1. 調整worker_processesswoole

指Nginx要生成的worker數量,最佳實踐是每一個CPU運行1個工做進程。瞭解系統中的CPU核心數,輸入網絡

grep processor  /proc/cpuinfo  |  wc -l

# 或者htop
htop

2. 最大化worker_connections多線程

Nginx Web服務器能夠同時提供服務的客戶端數。與worker_processes結合使用時,得到每秒能夠服務的最大客戶端數

最大客戶端數/秒=工做進程*工做者鏈接數

爲了最大化Nginx的所有潛力,應將worker_processes設置爲核心一次能夠運行的容許的最大進程數1024。

3. 啓用Gzip壓縮

壓縮文件大小,減小了客戶端http的傳輸帶寬,所以提升了頁面加載速度。

4.爲靜態文件啓用緩存

爲靜態文件啓用緩存,以減小帶寬並提升性能,能夠添加下面的命令,限定計算機緩存網頁的靜態文件

第三點和第四點 具體看前 《【nginx網站性能優化篇(1)】gzip壓縮與expire瀏覽器緩存》

5. Timeouts

keepalive鏈接減小了打開和關閉鏈接所需的CPU和網絡開銷,得到最佳性能須要調整的變量:

圖片描述

6. 禁用access_logs

訪問日誌記錄,它記錄每一個nginx請求,所以消耗了大量CPU資源,從而下降了nginx性能。

徹底禁用訪問日誌記錄

access_log off;

若是必須具備訪問日誌記錄,則啓用訪問日誌緩衝

access_log /var/log/nginx/access.log主緩衝區= 16k

7. fastcgi 調優

fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_temp_path/usr/local/nginx1.10/nginx_tmp;
fastcgi_intercept_errors on;
fastcgi_cache_path/usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g;
[info] 其實能夠參考網上的 lnmp一鍵壓縮包,配置得就很好

參考連接:

https://www.toutiao.com/i6673...

相關文章
相關標籤/搜索