天天看點

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

[toc]

## Nginx 是如何實作高并發的?

Nginx 采用的是多程序(單線程) & 多路IO複用模型。使用了 I/O 多路複用技術的 Nginx,就成了”并發事件驅動“的伺服器。其實作了異步,非阻塞,使用了epoll 和大量的底層代碼優化。

如果一個server采用一個程序負責一個request的方式,那麼程序數就是并發數。正常情況下,會有很多程序一直在等待中。

而nginx采用一個master程序,多個woker程序的模式。

* master程序主要負責收集、分發請求。每當一個請求過來時,master就拉起一個worker程序負責處理這個請求。

* 同時master程序也負責監控woker的狀态,保證高可靠性

* woker程序一般設定為跟cpu核心數一緻。nginx的woker程序在同一時間可以處理的請求數隻受記憶體限制,可以處理多個請求。

Nginx 的異步非阻塞工作方式正把當中的等待時間利用起來了。在需要等待的時候,這些程序就空閑出來待命了,是以表現為少數幾個程序就解決了大量的并發問題。

>[info] 題外話: 這和PHP擴充swoole的原理一樣

![](https://box.kancloud.cn/c570433f949c547301942f8e823e9e78_562x292.png)

每進來一個request,會有一個worker程序去處理。但不是全程的處理,處理到什麼程度呢?處理到可能發生阻塞的地方,比如向上遊(後端)伺服器轉發request,并等待請求傳回。那麼,這個處理的worker很聰明,他會在發送完請求後,注冊一個事件:“如果upstream傳回了,告訴我一聲,我再接着幹”。于是他就休息去了。此時,如果再有request 進來,他就可以很快再按這種方式處理。而一旦上遊伺服器傳回了,就會觸發這個事件,worker才會來接手,這個request才會接着往下走。

## 為什麼 Nginx 不使用多線程?

Apache: 建立多個程序或線程,而每個程序或線程都會為其配置設定 cpu 和記憶體(線程要比程序小的多,是以worker支援比perfork高的并發),并發過大會耗光伺服器資源。

Nginx: 采用單線程來異步非阻塞處理請求(管理者可以配置Nginx主程序的工作程序的數量)(epoll),不會為每個請求配置設定cpu和記憶體資源,節省了大量資源,同時也減少了大量的CPU的上下文切換。是以才使得Nginx支援更高的并發。

## 配置調優

**1\. 調整worker\_processes**

指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和網絡開銷,獲得最佳性能需要調整的變量:

![](https://box.kancloud.cn/3b8464b54c4cedb4c7404d90a9c291ef_656x93.png)

**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://lnmp.org/),配置得就很好

參考連結:

https://www.toutiao.com/i6673796893761339911/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1&timestamp=1560408440&app=news_article&utm_source=weixin&utm_medium=toutiao_android&req_id=2019061314472001002307219700879DB&group_id=6673796893761339911