1. 程式人生 > >淺談apache與nginx伺服器優缺點

淺談apache與nginx伺服器優缺點

APache :它可以執行在幾乎所有廣泛使用的計算機平臺上,由於其跨平臺和安全性被廣泛使用,是最流行的Web伺服器端軟體之一。它快速、可靠並且可通過簡單的API擴充,將Perl/Python直譯器編譯到伺服器中。 Nginx:是一款輕量級Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,並在一個BSD-like 協議下發行。其特點是佔有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好,因它的穩定性、豐富的功能集、示例配置檔案和低系統資源的消耗而聞名.中國大陸使用nginx網站使用者有:百度、京東新浪網易騰訊淘寶等。 Nginx相對於Apache的優點:
輕量級,同樣提供web服務,比Apache佔用更少的記憶體及資源。高度模組化的設計,編寫模組相對簡單。 抗併發,nginx 處理請求是非同步非阻塞,多個連線(萬級別)可以對應一個程序,而apache 則是阻塞型的,是同步多程序模型,一個連線對應一個程序,在高併發下nginx 能保持低資源低消耗高效能。  nginx處理靜態檔案好,Nginx 靜態處理效能比 Apache 高 3倍以上  Apache相對於Nginx的優點: Apacherewrite 比 nginx 的 的 rewrite 強大,模組超多,基本想到的都可以找到。Apache的效能比較穩定所以相對來說bug較少 ,nginx 相比下來的bug較多 Apache相對於Nginx的
區別: 這得益於Nginx使用了最新的epoll(Linux 2.6核心)和kqueue(freebsd)網路I/O模型,而Apache則使用的是傳統的select模型。目前Linux下能夠承受高併發訪問的 Squid、Memcached都採用的是epoll網路I/O模型 處理大量的連線的讀寫,Apache所採用的select網路I/O模型非常低效。 存在就必然會有理由,一般來說,對效能要求比較高的web 服務,用 nginx 。如果不需要效能 只求穩定,那就 apache吧。後者的各種功能模組實現得比前者,例如 ssl 的模組就比前者好,可配置項多。這裡要注意一點, epoll(freebsd 上是 kqueue )網路 IO 模型是 nginx 處理效能高的根本理由,但並不是所有的情況下都是epoll 大獲全勝的,如果本身提供靜態服務的就只有寥寥幾個檔案, apache 的select 模型或許比 epoll更高效能 。 select, poll和epoll的區別:
select select最早於1983年出現在4.2BSD中,它通過一個select()系統呼叫來監視多個檔案描述符的陣列,當select()返回後,該陣列中就緒的檔案描述符便會被核心修改標誌位,使得程序可以獲得這些檔案描述符從而進行後續的讀寫操作。 select目前幾乎在所有的平臺上支援,其良好跨平臺支援也是它的一個優點,事實上從現在看來,這也是它所剩不多的優點之一。 select的一個缺點在於單個程序能夠監視的檔案描述符的數量存在最大限制,在Linux上一般為1024,不過可以通過修改巨集定義甚至重新編譯核心的方式提升這一限制。 另外,select()所維護的儲存大量檔案描述符的資料結構,隨著檔案描述符數量的增大,其複製的開銷也線性增長。同時,由於網路響應時間的延遲 使得大量TCP連線處於非活躍狀態,但呼叫select()會對所有socket進行一次線性掃描,所以這也浪費了一定的開銷。 poll poll在1986年誕生於System V Release 3,它和select在本質上沒有多大差別,但是poll沒有最大檔案描述符數量的限制。  poll和select同樣存在一個缺點就是,包含大量檔案描述符的陣列被整體複製於使用者態和核心的地址空間之間,而不論這些檔案描述符是否就緒,它的開銷隨著檔案描述符數量的增加而線性增大。  另外,select()和poll()將就緒的檔案描述符告訴程序後,如果程序沒有對其進行IO操作,那麼下次呼叫select()和poll() 的時候將再次報告這些檔案描述符,所以它們一般不會丟失就緒的訊息,這種方式稱為水平觸發(Level Triggered)。 epoll 直到Linux2.6才出現了由核心直接支援的實現方法,那就是epoll,它幾乎具備了之前所說的一切優點,被公認為Linux2.6下效能最好的多路I/O就緒通知方法。 epoll可以同時支援水平觸發和邊緣觸發(Edge Triggered,只告訴程序哪些檔案描述符剛剛變為就緒狀態,它只說一遍,如果我們沒有采取行動,那麼它將不會再次告知,這種方式稱為邊緣觸發),理論上邊緣觸發的效能要更高一些,但是程式碼實現相當複雜。 epoll同樣只告知那些就緒的檔案描述符,而且當我們呼叫epoll_wait()獲得就緒檔案描述符時,返回的不是實際的描述符,而是一個代表 就緒描述符數量的值,你只需要去epoll指定的一個數組中依次取得相應數量的檔案描述符即可,這裡也使用了記憶體對映(mmap)技術,這樣便徹底省掉了 這些檔案描述符在系統呼叫時複製的開銷。 另一個本質的改進在於epoll採用基於事件的就緒通知方式。在select/poll中,程序只有在呼叫一定的方法後,核心才對所有監視的檔案描 述符進行掃描,而epoll事先通過epoll_ctl()來註冊一個檔案描述符,一旦基於某個檔案描述符就緒時,核心會採用類似callback的回撥 機制,迅速啟用這個檔案描述符,當程序呼叫epoll_wait()時便得到通知。