-
1 # 守方
-
2 # 華強北小徐
非同步,非阻塞,使用了epoll 和大量的底層程式碼最佳化。
如果一個server採用一個程序負責一個request的方式,那麼程序數就是併發數。正常情況下,會有很多程序一直在等待中。
而nginx採用一個master程序,多個woker程序的模式。
master程序主要負責收集、分發請求。每當一個請求過來時,master就拉起一個worker程序負責處理這個請求。
同時master程序也負責監控woker的狀態,保證高可靠性
woker程序一般設定為跟cpu核心數一致。nginx的woker程序在同一時間可以處理的請求數只受記憶體限制,可以處理多個請求。
Nginx 的非同步非阻塞工作方式正把當中的等待時間利用起來了。在需要等待的時候,這些程序就空閒出來待命了,因此表現為少數幾個程序就解決了大量的併發問題。
每進來一個request,會有一個worker程序去處理。但不是全程的處理,處理到什麼程度呢?處理到可能發生阻塞的地方,比如向上遊(後端)伺服器轉發request,並等待請求返回。那麼,這個處理的worker很聰明,他會在傳送完請求後,註冊一個事件:“如果upstream返回了,告訴我一聲,我再接著幹”。於是他就休息去了。此時,如果再有request 進來,他就可以很快再按這種方式處理。而一旦上游伺服器返回了,就會觸發這個事件,worker才會來接手,這個request才會接著往下走。
最佳化配置有哪些?
(1) 調整worker_processes
指Nginx要生成的worker數量,最佳實踐是每個CPU執行1個工作程序。
瞭解系統中的CPU核心數,輸入
$ grep processor / proc / cpuinfo | wc -l
(2) 最大化worker_connections
Nginx Web伺服器可以同時提供服務的客戶端數。與worker_processes結合使用時,獲得每秒可以服務的最大客戶端數
最大客戶端數/秒=工作程序*工作者連線數
為了最大化Nginx的全部潛力,應將工作者連線設定為核心一次可以執行的允許的最大程序數1024。
(3) 啟用Gzip壓縮
壓縮檔案大小,減少了客戶端http的傳輸頻寬,因此提高了頁面載入速度
建議的gzip配置示例如下:( 在http部分內)
(4) 為靜態檔案啟用快取
為靜態檔案啟用快取,以減少頻寬並提高效能,可以新增下面的命令,限定計算機快取網頁的靜態檔案:
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}
(5) Timeouts
keepalive連線減少了開啟和關閉連線所需的CPU和網路開銷,獲得最佳效能需要調整的變數可參考:
(6) 禁用access_logs
訪問日誌記錄,它記錄每個nginx請求,因此消耗了大量CPU資源,從而降低了nginx效能。
完全禁用訪問日誌記錄
access_log off;
如果必須具有訪問日誌記錄,則啟用訪問日誌緩衝
access_log /var/log/nginx/access.log主緩衝區= 16k
4. 502報錯可能原因有哪些?
(1) FastCGI程序是否已經啟動
(2) FastCGI worker程序數是否不夠
(3) FastCGI執行時間過長
(4) FastCGI Buffer不夠
nginx和apache一樣,有前端緩衝限制,可以調整緩衝引數
fastcgi_buffer_size 32k;
fastcgi_buffers 8 32k;
(5) Proxy Buffer不夠
如果你用了Proxying,調整
proxy_buffer_size 16k;
proxy_buffers 4 16k;
(6) php指令碼執行時間過長
將php-fpm.conf的
<value name="request_terminate_timeout">0s</value>
0s改成一個時間
回覆列表
單純用nginx無法實現。高併發會設計很多問題,建議可以從一些網站上找些高併發的課程,即使有些付費不買;可以看下目錄也知道自己該掌握哪些知識如常用的框架(netty,Disruptor, spring cloud 家族系列),常用的中介軟體(如快取,訊息佇列...等等);以及一些工具的最佳化如tomcat,nginx等等。