一、了解一些簡單的概念
HTTP服務器程序:
httpd(apache)
nginx
lighttpd(功能和nginx差不多,活躍度不如ng)
應用程序服務器:
IIS
Tomcat(開源jsp容器),jetty(開源輕量級jsp容器),jboss(2次封裝tomcat-jsp),resin(教學)、webshpere(重量級)、weblogic(bea公司大量市場份額),oc4j(oracle的,已經把bea公司買了,oc4j已經沒有市場)
二、HTTPD(Apache)
httpd:apache(a patchy server)
ASF(軟件基金會):apache software foundation
1、httpd特性
①、高度模塊化:core + modules,
運行再編譯或運行時,選擇哪些模塊將會加載到服務器,來確定服務器特性
②、DSO:Dynamic Shared Object 動態共享對象
③、MPM:Multipath Processing Modules 多路處理模塊
能夠更好的為有特殊要求的站點定制,例如,要求高伸縮性的站點可以選擇線程的MPM,(worker,event);需要可靠性或者與舊軟件兼容站點可以使用prefork。
httpd-2.4支持,MPM支持運行DSO機制;以模塊形式按需加載;
1)prefork:多進程模型,每個進程響應一個請求;
一個主進程:負責生成n個子進程,子進程也稱為工作進程,每個子進程處理一個用戶請求;即便沒有用戶請求,也會預先生成多個空閑經常,隨時等待請求到達;最大不會超過1024個;
主進程:管理子進程,創建套接字,接受用戶請求,並派發某個子進程
子進程:處理請求和響應請求
2)worker:多線程模型,每個現成響應一個請求;(比prefork不相上寫,每天15萬)
一個主進程:生成多個子進程,每個子進程負責多個線程,每個線程響應一個請求;m進程,n線程;m*n
主進程:管理子進程,創建套接字,接受用戶請求,並派發給某個子進程處理
子進程:負責管理線程
線程:處理請求和響應請求;
3)event:事件驅動模型,每個線程響應N個請求;,和worker很像,多個進程+多個線程的混合模式,但是event模型下每個進程會有一個單獨的線程來管理這些keep-alive類型的線程,當新的請求過來的時候,管理線程會把請求交給其他空閑線程處理,這樣舊避免了每個線程都被keep-alive阻塞。但是event模型並不是所有情況都通用,再https協議下會退化成worker模型。
一個主進程:生成M個子進程,每個進程直接n個請求,m*n
主進程:管理子進程,創建套接字,接受用戶請求,並派發給某個子進程
子進程:處理請求和響應請求
httpd-2.2,event為測試使用,不支持DSO機制的MPM
httpd-2.4,event為生產使用,production ready,支持DSO機制的MPM。
2、HTTPD的功能特性:
虛擬主機:能夠標識虛擬主機的方式:IP + PORT + HOSTNAME(IP、Port、FQDN)
CGI:common gateway interface ,通用網關接口;
反向代理 :reverse proxy
負責均衡 :基於流量(bytraffic),基於業務(bybusiness),基於請求(byrequest)
路徑別名
豐富的用於認證機制:basic、digest
支持第三方模塊
三、Nginx
1、簡介
nginx2004年正式發布,Apache是1995年
Apache以穩定著稱但是隨着互聯網的日漸壯大,網站的並發變大,Apache就出現了一個C10K的問題,即一個物理服務器達到並發量1w的時候apache就會承受不了,后來2004年nginx很好的解決了c10k的問題。
淘寶用的Tengine nginx,簡稱tng
2、特性
模塊化設計、較好擴展性(不支持動態裝卸載,tng支持)
高可靠性
master--->worker
nginx服務器使用的異步機制是異步非阻塞方式,也就是master-->worker,每個工作進程使用異步非阻塞方式,可以處理多個客戶端請求,當某個工作進程接收到客戶端的請求,調用IO進行處理,如果不能立即獲得結果,就去處理其他的請求,而客戶端再此期間也無需等待響應,可以去處理其他事情,當IO返回時,就會通知此工作進程,該進程得到通知,暫時掛起當前處理的失誤區響應客戶端請求。
nginx采用異步非阻塞方式處理請求,處理請求具體到系統底層就是讀寫事件(所謂阻塞調用方式即請求事件還沒准備好,線程只能一直等待,等事件准備好了再處理;而非阻塞即事件沒准備好,馬上返回ENGAIN,告訴你事件還沒准備好,而再這期間可以先去做其他事,再回頭看看事件准備好了嗎,時不時的看,需要的開銷也是不小的)
異步可以理解為循環處理多個准備好的事件,不會導致無畏的資源浪費,當有更多的並發數只會占用更多的內存而已
低內存消耗
10000個keep-alive連接再ningx僅消耗2.5MB
支持熱部署
不停機而更新配置文件、更好日志文件、更新服務器程序版本
支持事件驅動、AIO(異步io,epoll等)、mmap(內存映射)
3、基本功能
處理靜態資源的web服務器,能緩存打開的文件描述符,索引文件以及自動索引;
http,smtp,pop3協議的反向代理服務器加速,緩存、負載均衡;
支持FastCGI(fpm,LNMP),uWSGI(python),memcached server等;
模塊化,非DSO機制,過濾器包括zip,圖形大小調整、byte ranges,chunked responses以及SI-filter,在SSI過濾器中,到同一個proxy或FastCGI的多個子請求並發處理;
支持SSL,TLS SNI;
4、nginx結構與擴展
一個master進程,生成一個或多個worker;
事件驅動:epoll(邊緣觸發,支持linux2.6+),kqueue(BSD 4.1+),/dev/poll(event prots,solaris 7 11/99+);
消息通知(復用器):select,poll,rt signals(實施信號);
支持sendfile(linux2.2+),sendfile64(linux2.4.21+),sendfilev(solaris 8 7/01+);
支持輸入過濾(freeBSD 4.1+)及TCP_DEFER_ACCEPT(linux2.4+);
最小化的數據庫拷貝操作;
5、擴展功能
基於名稱和IP 的多虛擬主機站點
支持keepalive和pipelined(管道)連接
支持平滑升級,不中斷業務
定制訪問日志,支持使用日志緩沖區提高日志存儲性能
4xx-5xx錯誤代碼重定向;
支持URL, 基於PCRE的rewrite重寫模塊,及正則表達式
支持路徑別名
支持基於IP 及用戶的訪問控制
支持速率限制,支持並發數限制
支持 PUT,DELETE,MKCOL,COPY及MOVE等較特殊的HTTP請求
可以做HTTP反向代理及加速緩存,即負載均衡功能,內置都RS節點服務器健康檢查功能,這相當於專業的Haproxy軟件或LVS功能
具備Squid等專業緩存軟件等緩存功能
支持FLV(flash視頻);
6、nginx的工作模式
非阻塞、事件驅動、一個master生成一個或多個worker,每個worker響應n個請求;
worker*n 國人單機最高並發達到52000個
nginx是一個高性能得web服務器,能夠同時處理大量得並發請求,它結合多進程機制和異步機制,異步機制使用得異步非阻塞方式,接下來就給大家
7、五大模塊
核心模塊、標准HTTP模塊、可選HTTP模塊、郵件服務模塊和第三方模塊。
1)、核心模塊:nginx最基本的核心服務,進程管理、權限控制、錯誤日志記錄等;
2)、標准HTTP模塊:標准HTTP模塊支持標准的HTTP功能;
3)、可選HTTP模塊:主要用於擴展標准HTTP功能,讓Nginx能處理一些特殊服務;
4)、郵件服務模塊:主要用於支持Nginx的郵件服務;
5)、第三方模塊:擴展Nginx服務器應用,完成開發者想要的功能;
模塊圖如下:
8、nginx,master-worker模型架構圖
9、nginx整體架構圖
主進程
nginx啟動時,會生成兩種類型的進程,一個是主進程master,一個或多個工作進程worker,主進程並不處理網絡請求,主要負責調度工作進程,加載配置、啟動工作進程及非停升級。所以nginx啟動后查看系統進程,就能看到至少兩個nginx進程
工作進程
服務器實際處理網絡請求及響應的是工作進程worker,在類unix系統上,nginx可以配置多個worker,每個worker進程都可以同時處理數以千計的網絡請求。
模塊化設計
包括核心和功能性模塊,核心模塊負責維持要給運行循環run-loop,執行網絡請求處理的不同階段的模塊功能,比如:網絡讀寫、存儲讀寫、內容傳輸、外出過濾,以及將請求發往上游服務器等,而其代碼模塊化設計,也使得我們可以根據需要對功能模塊進行適當的選擇和修改,編譯成具有特定功能的服務器
事件驅動模型
基於異步及非阻塞的事件模型,可以說是nginx得以獲得高並發、高性能得關鍵因素,同時也得益於對linux、solaris及類BSD等操作系統內核中事件通知及I/O性能增強功能得采用,如kqueue、epoll及event ports。
代理設計
代理設計,可以說是nginx深入骨髓得設計無論是對於HTTP,還是FastCGI、Memcache、Redis等得網絡請求或響應,本質上都采用了代理機制,所以,Nginx天生就是高性能得代理服務器。