Apache介紹:php
Apache是基於模塊化設計的,它的核心代碼並很少,大多數的功能都被分散到各個模塊中,各個模塊在系統啓動的時候按需載入。html
MPM(Multi -Processing Modules,多重處理模塊)是Apache的核心組件之一,Apache經過MPM來使用操做系統的資源,對進程和線程池進行管理。Apache爲了可以得到最好的運行性能,針對不一樣的平臺 (Unix/Linux、Window)作了優化,爲不一樣的平臺提供了不一樣的MPM,用戶能夠根據實際狀況進行選擇,其中最常使用的MPM有 prefork和worker兩種(兩種模式介紹http://my.oschina.net/shyl/blog/523070)。至於您的服務器正以哪一種方式運行,取決於安裝Apache過程當中指定的MPM編譯參數,在X系統上默認的編譯參數爲 prefork。前端
Apache的CGI和Module:nginx
區別在於一個進程池是web server的進程池,一個是php的進程池;FASTCGI這種模式下,能夠比較好的分離動態和靜態請求,php出了問題不會影響web server。web
Nginx介紹:apache
Nginx的模塊從結構上分爲核心模塊、基礎模塊和第三方模塊:後端
核心模塊:HTTP模塊、EVENT模塊和MAIL模塊瀏覽器
基礎模塊:HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊,緩存
第三方模塊:HTTP Upstream Request Hash模塊、Notice模塊和HTTP Access Key模塊。安全
Nginx的模塊從功能上分爲以下三類:
Handlers(處理器模塊)。此類模塊直接處理請求,並進行輸出內容和修改headers信息等操做。Handlers處理器模塊通常只能有一個。
Filters (過濾器模塊)。此類模塊主要對其餘處理器模塊輸出的內容進行修改操做,最後由Nginx輸出。
Proxies (代理類模塊)。此類模塊是Nginx的HTTP Upstream之類的模塊,這些模塊主要與後端一些服務好比FastCGI等進行交互,實現服務代理和負載均衡等功能。
CGI 和 FastCGI
FastCGI是一個可伸縮地、高速地在HTTP server和動態腳本語言間通訊的接口。多數流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等。同時,FastCGI也被許多腳本語言支持,其中就有PHP。
FastCGI是從CGI發展改進而來的。傳統CGI接口方式的主要缺點是性能不好,由於每次HTTP服務器遇到動態程序時都須要從新啓動腳本解析器來執行解析,而後將結果返回給HTTP服務器。這在處理高併發訪問時幾乎是不可用的。另外傳統的CGI接口方式安全性也不好,如今已經不多使用了。
FastCGI接口方式採用C/S結構,能夠將HTTP服務器和腳本解析服務器分開,同時在腳本解析服務器上啓動一個或者多個腳本解析守護進程。當HTTP服務器每次遇到動態程序時,能夠將其直接交付給FastCGI進程來執行,而後將獲得的結果返回給瀏覽器。這種方式可讓HTTP服務器專注地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提升了整個應用系統的性能。
Nginx和FastCGI
Nginx不支持對外部程序的直接調用或者解析,全部的外部程序(包括PHP)必須經過FastCGI接口來調用(不像Apache支持php Module)。FastCGI接口在Linux下是socket(這個socket能夠是文件socket,也能夠是ip socket)。
接下來以Nginx下PHP的運行過程來講明。PHP-FPM是管理FastCGI的一個管理器,它做爲PHP的插件存在。
FastCGI進程管理器php-fpm自身初始化,啓動主進程php-fpm和啓動start_servers個CGI 子進程。主進程php-fpm主要是管理fastcgi子進程,監聽9000端口。fastcgi子進程等待來自Web Server的鏈接。
當客戶端請求到達Web Server Nginx是時,Nginx經過location指令,將全部以php爲後綴的文件都交給127.0.0.1:9000來處理,即Nginx經過location指令,將全部以php爲後綴的文件都交給127.0.0.1:9000來處理。
FastCGI進程管理器PHP-FPM選擇並鏈接到一個子進程CGI解釋器。Web server將CGI環境變量和標準輸入發送到FastCGI子進程。
FastCGI子進程完成處理後將標準輸出和錯誤信息從同一鏈接返回Web Server。當FastCGI子進程關閉鏈接時,請求便告處理完成。
FastCGI子進程接着等待並處理來自FastCGI進程管理器(運行在 WebServer中)的下一個鏈接。
Apache、Nginx、Lighttpd優缺點對比:
Nginx輕量級,一樣的web服務,佔用資源少。
Nginx靜態文件處理能力強。能夠對靜態文件緩存
Nginx抗併發能力強,nginx 處理請求是異步非阻塞的,而apache則是阻塞型的,在高併發下nginx 能保持低資源低消耗高性能。在Apache+PHP(prefork)模式下,若是PHP處理慢或者前端壓力很大的狀況下,很容易出現Apache進程數飆升,從而拒絕服務的現象。Apache一個鏈接對應一個進程,nginx是異步的,多個鏈接(萬級別)能夠對應一個進程 ,所以,相似DOS這樣的攻擊對Nginx來講基本上是沒有任何做用的。
Nginx對cgi的處理能力較好
Apache的rewrite比nginx 的rewrite 強大
Apache模塊超多,基本想到的均可以找到
Apache穩定,bug少。
Apache對PHP支持比較簡單,Nginx須要配合其餘後端(php-mpm)用。
Apache對cgi的支持很差
Lighttpd基本和Nginx的優缺點差很少,Nginx徹底不支持動態庫so,因此它的模塊都必須靜態編譯,且不能動態加載。要加載哪些模塊,模塊按照怎樣的順序執行,都是在編譯期由 configure指定的,若是要調整,也只能從新編譯一遍,沒法經過改配置來實現。在這方面,Lighttpd作得比nginx好。Lighttpd支 持動態so,而且能夠在配置文件中調整各模塊的前後順序,在某些應用場景下,調整模塊的前後順序是頗有用的。
Apache 後臺服務器(主要處理php及一些功能請求 如:中文url)
Nginx 前端服務器(利用它佔用系統資源少得優點來處理靜態頁面大量請求)
Lighttpd 圖片服務器,跑CGI的不二人選。
參考:http://www.server110.com/nginx/201402/6543.html