官網介紹:nginx
nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev.git
簡單來講:github
Nginx是一個Web服務器。redis
事件驅動的架構:可以併發處理百萬級別的TCP鏈接。數據庫
全異步的網絡I/O處理機制。緩存
極少的進程間切換。安全
高度模塊化的設計和自由的許可證。bash
使得擴展Nginx功能的第三方模塊層出不窮。服務器
Linux:(sendfile、epoll) Nginx支持其獨有的sendfile系統調用。這個系統調用能夠高效地把硬盤中的數據發送到網絡上(不須要先把硬盤數據複製到用戶態內存上再發送),這極大地減小了內核態與用戶態數據間的複製動做。 epoll是Linux上處理大併發網絡鏈接的利器。cookie
多進程的好處:
master只用於管理真正提供服務的worker進程,因此master進程能夠是惟一的,它僅專一於本身的純管理工做,爲管理員提供命令行服務,包括諸如啓動服務、中止服務、重載配置文件、平滑升級程序等。master進程須要擁有較大的權限,例如,一般會利用root用戶啓動master進程。worker進程的權限要小於或等於master進程,這樣master進程才能夠徹底地管理worker進程。
當任意一個worker進程出現錯誤從而致使coredump時,master進程會馬上啓動新的worker進程繼續服務。
多個worker進程處理互聯網請求不但能夠提升服務的健壯性(一個worker進程出錯後,其餘worker進程仍然能夠正常提供服務),最重要的是,這樣能夠充分利用如今常見的SMP多核架構,從而實現微觀上真正的多核併發處理。所以,用一個進程(master進程)來處理互聯網請求確定是不合適的。
另外,爲何要把worker進程數量設置得與CPU核心數量一致呢?這正是Nginx與Apache服務器的不一樣之處。在Apache上每一個進程在一個時刻只處理一個請求,所以,若是但願Web服務器擁有併發處理的請求數更多,就要把Apache的進程或線程數設置得更多,一般會達到一臺服務器擁有幾百個工做進程,這樣大量的進程間切換將帶來無謂的系統資源消耗。而Nginx則否則,一個worker進程能夠同時處理的請求數只受限於內存大小,並且在架構設計上,不一樣的worker進程之間處理併發請求時幾乎沒有同步鎖的限制,worker進程一般不會進入睡眠狀態,所以,當Nginx上的進程數與CPU核心數相等時(最好每個worker進程都綁定特定的CPU核心),進程間切換的代價是最小的。
nginx.conf配置master/worker:
是否以master/worker方式工做: 語法:master_process on|off; 默認:master_process on;
worker進程數的配置: 語法:worker_processes number; 默認:worker_processes 1;
設置每一個worker的鏈接數: events { worker_connections 1024; }
經過配置緩存,能夠大大下降服務器的壓力,提升響應速度。
Nginx設置靜態資源緩存:
location ~ \.(gif | jpg | jpeg | png | bmp | swf | ico)$ { root /www/local/static;
expires 30d;}
複製代碼
當指定時間時,可使用的單位包括:
Nginx提供了3種負載均衡策略:
負載均衡的配置以下:
服務器集羣Session共享問題的解決方案:
MySQL等關係型數據庫:
redis 或者 memcache 中: