1. 程式人生 > >Apache伺服器和nginx的優缺點(轉)

Apache伺服器和nginx的優缺點(轉)

Apache伺服器和nginx的優缺點: 

我們之前大量使用Apache來作為HTTPServer。 Apache具有很優秀的效能,而且通過模組可以提供各種豐富的功能。

優點:

  1. 首先Apache對客戶端的響應是支援併發的 ,執行httpd這個daemon程序之後,它會同時產生多個孩子程序/執行緒,每個孩子程序/執行緒分別對客戶端的請求進行響應;
  2. 另外,Apache可以提供靜態和動態的服務 ,例如對於PHP的解析不是通過效能較差的CGI實現的而是通過支援PHP的模組來實現的(通常為mod_php5,或者叫做apxs2)。

缺點:

  1. Apache的這種Server為process-based server
     ,也就是基於多程序的HTTPServer,因為它需要對每個使用者請求建立一個孩子程序/執行緒進行響應;這樣的缺點是,如果併發的請求非常多(這在大型入口網站是很常見的)就會需要非常多的執行緒,從而佔用極多的系統資源CPU和記憶體。因此對於併發處理不是Apache的強項。

解決方法:

  • 目前來說出現了另一種WebServer,在併發方面表現更加優越,叫做asynchronous servers非同步伺服器。最有名的為Nginx和Lighttpd。 所謂的非同步伺服器是事件驅動程式模式的event-driven,除了使用者的併發請求通常只需要一個單一的或者幾個執行緒。因此佔用系統資源就非常少。這幾 種又被稱為lightweight web server。

舉例,對於10,000的併發連線請求,nginx可能僅僅使用幾M的記憶體;而Apache可能需要使用幾百M的記憶體資源。



實際中單一的使用

1)關於單一使用Apache來作為HTTPServer的情況我們不用再多做介紹,非常常見的應用;

上面我們介紹到Apache對於PHP等伺服器端指令碼的支援是通過自己的模組來實現的,而且效能優越。

2)我們同樣可以單單使用 nginx或者lighttpd來作為HTTPServer來使用。

nginx和lighttpd和Apache類似都通過各種模組可以對伺服器的功能進行豐富的擴充套件,同樣都是通過conf配置檔案對各種選項進行配置。

對於PHP等,nginx和lighttpd都沒有內建的 模組來對PHP進行支援,而是通過FastCGI來支援的。

Lighttpd 通過模組可以提供CGI, FastCGI和SCGI等服務,nginx則沒有自己提供處理PHP的功能,需要通過第三方的模組來提供對PHP進行FastCGI方式的整合。

反向代理Reverse Proxy 

1) 代理伺服器的概念proxy server: 

代理伺服器
 的概念很容易理解,就是通常作為兩臺機器中間的機器,需要提供的功能往往有:

  1. 快取caching,
  2. 安全,
  3. 負載均衡load banlancing。

所謂的負載均衡就是,很多機器使用一個代理的時候,代理伺服器需要對各個伺服器進行均衡。

我們常見的代理是正向的代理,例如我們機房有20臺電腦要上網,現在只有一個電腦可以上網,那麼可以使用這臺電腦作為代理伺服器,所有通過網路的資料傳輸 都要經過該代理伺服器。
而反向代理,是和正向代理相反的 ,正向代理針對服務接收方使用者來說,反向代理或者叫做伺服器端代理是針對伺服器端的,意思是有多臺伺服器,反向代理伺服器對使用者的請求代理髮送給其中的一 臺伺服器進行處理。

2) 實際中對於一個大型網站,我們通常使用很多臺sever來構成一個cluster來對使用者的各種請求進行響應。因此通常需要一臺或者多臺反向代理伺服器來對多臺Server進行服務。 

這個反向代理伺服器需要提供的功能一般都包括:

  1. 安全方面;
  2. 快取壓縮功能;
  3. 負載均衡 功能;

(需要注意反向代理伺服器和防火牆優點類似,但是防火牆一般只有安全方面的考慮,沒有快取和負載均衡方面的功能。)

3) 綜上,實際中Web伺服器端的架構 
通常是多臺Web伺服器執行並行地提 供服務;

同時還需要在Web伺服器前段部署一臺或者多臺反向代理伺服器,一方面快取一些靜態資料,或者將Web伺服器動態產生的一些內容快取,另一方面通過負載均衡功能,可以均勻地將使用者的併發請求傳遞給多臺Web伺服器進行處理。 

這樣一方面可以大大降低後面每臺Web伺服器的負擔;另一方 面可以實現多臺伺服器的負載均衡。 


nginx/lighttpd作為反向代理伺服器

nginx或lighttpd在前端作為反向代理伺服器,後臺佈置多臺ApacheHTTPServer: 

  • 上面說到,nginx和lighttpd的優點在於速度快,輕量級,在處理多使用者併發方面要大大優於Apache伺服器。 

             因此我們通常可以把他們作為反向代理伺服器放置到多臺的Apache Web伺服器前段,來一方面快取資料,另一方面實現多臺伺服器的負載均衡。

  • 當然了Apache本身通過mod_proxy和mod_cache也可以實現反向代理和快取功能 ,但是在處理高併發方面還是無法與nginx和lighttpd這種輕量的非同步模式的伺服器來比較。
  • 另外,利用nginx和lighttpd的反響代理功能,我們可以通過設定其configuration檔案,當客戶端請求的是靜態內容(例如一些圖片,js,html檔案等)的話,直接由nginx或者 lighttpd進行響應;
  • 如果需要訪問動態內容(通常需要實時從資料庫中讀取)的話,則通過反向代理,nginx等可以將請求傳送給後臺等待的Apache進行響應,然後Apache將相應的結果返回給nginx,後者再響應使用者的時候還可以進行快取。
  • 有時候還可以使用一些快取的工具,例如Squid。另外nginx也提供了對一些快取功能的支援,例如memcache 等。

因此如果從圖形來分析的話,nginx作為最前端的web cache系統,通常的架構如下:

這個結構的優點:

  1. 可以使用nginx前端進行諸多複雜的配置,這些配置從前在squid是沒法做或者做起來比較麻煩的,比如針對目錄的防盜鏈。
  2. nginx前端可以直接轉發部分不需要快取的請求。
  3. 因為nginx效率高於squid,所以某些情況下可以利用nginx的快取來減輕squid壓力。
  4. 可以實現url hash等分配策略
  5. 可以在最前端開啟gzip壓縮,這樣後面的squid快取的純粹是無壓縮文件,可以避免很多無謂的穿透。
  6. 因為nginx穩定性比較高,所以lvs不需要經常調整,通過nginx調整就可以。
  7. squid的檔案開啟數按預設的1024就綽綽有餘,不過處理的請求可一個都不會少。
  8. 可以啟用nginx的日誌功能取代squid,這樣做實時點選量統計時可以精確定位到url,不必要再用低效率的grep來過濾。
  9. 因為nginx的負載能力高於squid,所以在用lvs分流時可以不必分得特別均衡,出現單點故障的機率比較低。

nginx和squid配合搭建的web伺服器前端系統架構:

前端的lvs和squid,按照安裝方法,把epoll開啟,配置檔案照搬,基本上問題不多。

這個架構和app_squid架構的區別,也是關鍵點就是:加入了一級中層代理,中層代理的好處實在太多了:

  1. gzip壓縮:壓縮可以通過nginx做,這樣,後臺應用伺服器不管是apache、resin、lighttpd甚至iis或其他古怪伺服器,都不用考慮壓縮的功能問題。
  2. 負載均衡和故障遮蔽:nginx可以作為負載均衡代理使用,並有故障遮蔽功能,這樣,根據目錄甚至一個正則表示式來制定負載均衡策略變成了小case。
  3. 方便的運維管理,在各種情況下可以靈活制訂方案。
  4. 許可權清晰:這臺機器就是不寫程式的維護人員負責,程式設計師一般不需要管理這臺機器,這樣假如出現故障,很容易能找到正確的人。對於應用伺服器和資料庫伺服器,最好是從維護人員的視線中消失,我的目標是,這些服務只要能跑得起來就可以了,其它的事情全部可以在外部處理掉。