[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的原理一樣

每進來一個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結合使用時,獲得每秒可以服務的最大客戶端數
<br />
**最大客戶端數/秒=工作進程\*工作者連接數**
為了最大化Nginx的全部潛力,應將worker\_processes設置為核心一次可以運行的允許的最大進程數1024。
<br />
**3\. 啟用Gzip壓縮**
壓縮文件大小,減少了客戶端http的傳輸帶寬,因此提高了頁面加載速度。
<br />
**4\.為靜態文件啟用緩存**
為靜態文件啟用緩存,以減少帶寬并提高性能,可以添加下面的命令,限定計算機緩存網頁的靜態文件
> 第三點和第四點 具體看前 《【nginx網站性能優化篇(1)】gzip壓縮與expire瀏覽器緩存》
<br />
**5\. Timeouts**
keepalive連接減少了打開和關閉連接所需的CPU和網絡開銷,獲得最佳性能需要調整的變量:

<br />
**6\. 禁用access\_logs**
訪問日志記錄,它記錄每個nginx請求,因此消耗了大量CPU資源,從而降低了nginx性能。
完全禁用訪問日志記錄
access\_log off;
如果必須具有訪問日志記錄,則啟用訪問日志緩沖
access\_log /var/log/nginx/access.log主緩沖區= 16k
<br />
**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×tamp=1560408440&app=news_article&utm_source=weixin&utm_medium=toutiao_android&req_id=2019061314472001002307219700879DB&group_id=6673796893761339911
- Apache
- 【Apache運維基礎(1)】Apache的安裝與使用
- 【Apache運維基礎(2)】主配置文件說明
- 【Apache運維基礎(3)】虛擬主機配置說明
- 【Apache運維基礎(4)】Apache的Rewrite攻略(1)
- 【Apache運維基礎(5)】Apache的Rewrite攻略(2).htaccess文件
- 【Apache運維基礎(6)】Apache的日志管理與分析
- 工具篇
- supervisor進程管理器
- Haproxy安裝與配置
- Nginx
- 【nginx網站性能優化篇(1)】gzip壓縮與expire瀏覽器緩存
- 【nginx網站性能優化篇(2)】反向代理實現Apache與Nginx的動靜分離(LNMPA)
- 【nginx網站性能優化篇(3)】反向代理實現負載均衡
- 【nginx網站性能優化篇(4)】理解nginx的高并發原理及其配置調優
- 【nginx運維基礎(1)】Nginx的編譯安裝與使用
- 【nginx運維基礎(2)】Nginx的配置文件說明及虛擬主機配置示例
- 【nginx運維基礎(3)】Nginx的編譯PHP
- 【nginx運維基礎(4)】Nginx的日志管理(日志格式與定時分割日志)
- 【nginx運維基礎(5)】Nginx的location攻略
- 【nginx運維基礎(6)】Nginx的Rewrite語法詳解
- 【nginx運維基礎(7)】配置SSL支持https訪問
- 【nginx運維基礎(8)】配置支持http2協議
- 【nginx運維基礎(9)】了解PHP-FPM 與 Nginx 的通信機制
- 其它
- Apache與Nginx下php隱藏http頭部版本信息的實現方法
- CURL與PHP-CLI的應用【CLI篇】
- CURL與PHP-CLI的應用【Curl篇】
- Linux之SAMBA共享服務
- 【Linux常識篇(1)】所謂的正向代理與反向代理
- 【Linux常識篇(2)】理解inode
- 【Linux常識篇(3)】文件及文件夾的ctime atime mtime的含義詳解
- centOS使用手記
- 服務器日志分析
- 高頻命令
- df
- mv
- gzip
- cp
- tar
- touch
- cat
- uniq
- nl
- more
- rmdir
- less
- mkdir
- head
- rm
- tail
- 五大查詢命令
- vi&vim
- ls與目錄結構
- grep
- awk
- sed
- 其他高頻命令