Nginx 採用的是多進程(單線程) & 多路IO複用模型。使用了 I/O 多路複用技術的 Nginx,就成了」併發事件驅動「的服務器。其實現了異步,非阻塞,使用了epoll 和大量的底層代碼優化。android
若是一個server採用一個進程負責一個request的方式,那麼進程數就是併發數。正常狀況下,會有不少進程一直在等待中。nginx
而nginx採用一個master進程,多個woker進程的模式。後端
Nginx 的異步非阻塞工做方式正把當中的等待時間利用起來了。在須要等待的時候,這些進程就空閒出來待命了,所以表現爲少數幾個進程就解決了大量的併發問題。瀏覽器
[info] 題外話: 這和PHP擴展swoole的原理同樣
每進來一個request,會有一個worker進程去處理。但不是全程的處理,處理到什麼程度呢?處理到可能發生阻塞的地方,好比向上遊(後端)服務器轉發request,並等待請求返回。那麼,這個處理的worker很聰明,他會在發送完請求後,註冊一個事件:「若是upstream返回了,告訴我一聲,我再接着幹」。因而他就休息去了。此時,若是再有request 進來,他就能夠很快再按這種方式處理。而一旦上游服務器返回了,就會觸發這個事件,worker纔會來接手,這個request纔會接着往下走。緩存
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一鍵壓縮包,配置得就很好
參考連接: