1. 程式人生 > 實用技巧 >詳談Apache、Nginx和tomcat的區別以及處理靜態頁面和動態頁面的方式

詳談Apache、Nginx和tomcat的區別以及處理靜態頁面和動態頁面的方式

本文轉載於:https://blog.51cto.com/andyxu/2306579
就目前來說,網站主要分為靜態頁面和動態頁面,純靜態頁面的網站已經比較少見了,大型網站一般使用的是靜態頁面+動態頁面的建站技術,還有一部分網站是純動態頁面。
負責處理這些頁面的軟體我們通常稱之為web容器,是一種服務程式,負責處理客戶端(瀏覽器)發來的訪問請求,如果是靜態頁面會直接將檔案內容呈現給客戶端(瀏覽器),如果是動態頁面會將其解析成靜態內容之後再呈現給客戶端(瀏覽器)。
在這裡插入圖片描述

詳談Apache、Nginx和tomcat的區別以及處理靜態頁面和動態頁面的方式

一、Apache、Nginx和tomcat的區別

Apache

Apache HTTP Server(簡稱Apache)是Apache軟體基金會的一款開放原始碼的web伺服器軟體,可以在大多數計算機作業系統中執行,是目前最流行的web伺服器端軟體之一。apache支援的模組眾多,效能穩定,本身只支援靜態解析,但可以通過擴充套件指令碼、模組等支援動態頁面。常見的網站架構有:apache+php、apache+tomcat等。

Nginx

Nginx是一款開源的輕量級的web伺服器/反向代理伺服器軟體,其特點是佔用記憶體少,併發能力強,也是目前比較流行的web伺服器軟體之一。靜態頁面處理能力較強,尤其是反向代理服務表現突出,常被用作負載均衡和代理伺服器使用。常見的網站架構有:nginx+php、nginx+tomcat、nginx+apache+php等。

Tomcat

Tomcat是一款開源的Java web應用伺服器軟體,常被稱之為servlet容器,用來處理jsp頁面和執行servlet。tomcat技術先進、效能穩定、而且免費,因而深受Java愛好者的喜愛並得到了廣泛使用。tomcat靜態頁面處理能力較弱,它的強項是執行Jave Servlet(用Java編寫的伺服器端程式)。

這三款軟體各有優勢,身為運維人員需要清楚的知道,在哪個場合下使用哪個軟體。
如果你只是處理靜態頁面,那就使用nginx;
如果你需要處理php語言編寫的動態頁面,那就使用apache+php;
如果是java語言編寫的程式,那tomcat無疑是最好的選擇。

二、網站頁面的型別和區別

經常會有人問,什麼是靜態頁面,什麼是動態頁面,它們之間有什麼區別,那麼現在我們就來看一下靜態頁面和動態頁面,以及偽靜態都是什麼吧。

1、靜態頁面

通常是以html、htm、shtml等結尾的檔案,所有資料都是寫在檔案裡的。客戶端載入靜態頁面時,無須對資料庫進行操作,直接將檔案內容呈現出來。
優點:相對於另外兩種頁面(動態頁面和偽靜態),速度最快,不需要從資料庫裡面提取資料,也不會對伺服器產生壓力。
缺點:由於資料都是寫在檔案裡,很有可能會導致檔案非常大,佔用大量的伺服器磁碟空間,每次新增內容都會生成新的檔案。更改原始碼的話必須全部更改,而不能更改一個地方,全站的靜態頁面就自動更改了。

2、動態頁面

通常是以php、jsp、asp等結尾的檔案,不是獨立存在於伺服器上的網頁檔案,當用戶請求時伺服器才會返回一個完整的網頁。資料都是儲存在資料庫中,根據使用者發出的不同請求從資料庫裡提取不同的資料,從而提供個性化的網頁內容。
優點:佔用磁碟空間小,一般幾萬條資料的網站,檔案大小可能只有幾M。資料都是從資料庫裡提取出來,如果需要修改某些資料,可直接修改資料庫,所有動態頁面就都會自動更新。
缺點:相對於靜態頁面而言,訪問速度較慢,因為動態頁面需要處理成靜態內容,才能呈現給使用者。動態頁面的資料是從資料庫裡提取出來的,如果訪問量大的話,會導致資料庫的壓力很大。現在動態網站多數都使用了快取技術,但相對於靜態網站而言,伺服器的壓力比較大,訪問的人越多伺服器的壓力越大。

3、偽靜態

假靜態頁面,通過將動態頁面的URL地址重寫,改寫成以html、htm等結尾的靜態URL地址,實際上還是動態頁面。
優點:方便搜尋引擎進行收錄。在SEO方面,偽靜態和靜態頁面的功能是相同的。
缺點:相對於靜態頁面和動態頁面而言,伺服器的效能消耗是最大的。靜態頁面可以節省伺服器的資源消耗,而偽靜態是增加伺服器消耗,因為Rewrite還需要消耗額外的資源。

三、網站頁面的處理流程

詳談Apache、Nginx和tomcat的區別以及處理靜態頁面和動態頁面的方式

1、訪問靜態頁面

當用戶(瀏覽器)發起一個訪問網站資源的請求時,首先由DNS伺服器將域名解析為網站伺服器的IP地址,http或者https協議將使用者的請求傳送給此IP地址對應的web伺服器,web伺服器收到請求後就在自己的網站目錄下尋找相對應的頁面檔案(例如index.html),將檔案內容返回給使用者(瀏覽器),瀏覽器收到web伺服器的響應後,接收並下載伺服器的html靜態程式碼,然後瀏覽器解讀程式碼,最終將網頁內容呈現出來。

2、訪問動態頁面

流程和靜態頁面是一樣的,只不過是多一步解析動態指令碼的步驟。首先DNS域名解析,然後web伺服器收到使用者的請求後找到對應的php指令碼檔案,然後將此指令碼委託給php伺服器處理,php伺服器將指令碼解析成靜態程式碼,再將靜態程式碼返回給web伺服器,web伺服器再將靜態程式碼返回給使用者,最終在瀏覽器上呈現出來。

3、訪問資料庫

流程和動態頁面是一樣的,只不是多了一步訪問資料庫的步驟。首先DNS域名解析,web伺服器收到請求後找到對應的php指令碼檔案,將此指令碼委託給php伺服器處理,php伺服器通過解析指令碼去連線資料庫,從資料庫裡將資料取出來,再將資料生成靜態程式碼發給web伺服器,web伺服器再將靜態程式碼返回給使用者,最終在瀏覽器上呈現出來。

四、處理動態頁面的三種方式

關於動靜態分離,經常有人問,不是說apache本身不能處理動態頁面嗎,那為什麼會有人說用nginx處理靜態頁面,用apache處理動態頁面?
那我只能說是你理解錯了,apache本身是不支援動態頁面處理的,而是將動態頁面交由php或者tomcat等其他服務程式去處理,php或者tomcat等服務程式將處理後的靜態頁面返回給apache,apache再將靜態內容呈現給客戶。
那又有人說了,即然動態頁面是由php程式處理的,那為什麼會有人說apache處理動態頁面要比nginx好,既然都是由php處理動態頁面,那nginx和apache有什麼區別,不都是把處理後的靜態內容返回給客戶嗎,為什麼要說處理動態頁面apache要比nginx好呢?
那我只能說還是你理解錯了,應該說apache和php結合的更好一些,但這是以前,如果站在現在這個角度上講,誰好誰差還不一定呢,為什麼這麼說,請繼續往下看。
以php為例,我們先來看一下處理動態頁面的三種方式。
詳談Apache、Nginx和tomcat的區別以及處理靜態頁面和動態頁面的方式

1、mod_php

即模組的方式,把php服務做為模組來進行呼叫,模組將相關函式嵌入web服務請求處理流程,不需要額外的直譯器程序。例如apache的libphp5.so模組,注意libphp5.so是php提供的,不是apache自帶的。
下面是apache配置檔案裡php模組的配置內容

DirectoryIndex index.php index.html index.html.var
LoadModule php5_module modules/libphp5.so

AddType application/x-httpd-php .php
AddType applicaiton/x-httpd-php-source .phps
簡單來講,就是apache將php做為自己的一個模組來使用。

2、CGI

這個模式很少人使用,因為每次呼叫它都需要fork一個直譯器程序來執行php指令碼,執行結束後進程隨之退出。一個請求就需要fork一個程序,周而復始,效率低下不說,還大量消耗伺服器資源。
下面是apache關於CGI的配置
配置檔案裡啟用CGI模式

#LoadModule php5_module modules/libphp5.so
Action application/x-httpd-php /cgi-bin/php-cgi
然後將CGI指令碼檔案拷貝到apache的cgi-bin目錄下
cp /usr/bin/php-cgi /var/www/cgi-bin/

3、FastCGI

FastCGI模式是指由單獨的程序管理器如php-fpm啟動並管理多個直譯器程序,web伺服器只需將指令碼傳給php-fpm執行即可。執行完畢後直譯器程序不會退出,而是等待下一個請求。這種方式既適用於本地部署,也適用於分散式架構,並且多個程序並行處理,不僅配置靈活,而且效率高。
以下是nginx配置檔案裡關於FastCGI的配置內容

location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME d o c u m e n t r o o t document_root documentrootfastcgi_script_name;
include fastcgi_params;
}

4、簡單總結

假設web伺服器是一家公司,那麼mod_php方式就如同php是它的一個部門,關於php的問題這個部門可以直接處理;CGI模式相當於公司沒有專門處理php問題的部門,遇到php相關的事情需要處理,就臨時拉人成立一個工作小組,問題解決後這個臨時小組也就解散了;FastCGI模式相當於公司之間的合作,web和php分別是兩家公司,web公司將php業務外包給php公司負責。
說了這麼多,那到底在動態頁面處理方面,apache好還是nginx好呢?
其實無論是mod_php、還是FastCGI,都有其自己的優勢。以前在FastCGI技術還不成熟的時候,自然是mod_php穩定、處理速度更快一些,可是社會是不斷在向前進步的,現如今FastCGI技術已經非常成熟了,網上也有很多人做了相關的測試,說是FastCGI比mod_php更穩定、速度更快。我個人認為,如果是單機部署的話,可考慮使用mod_php方式,因為畢竟多啟一個程序對系統而言就多了一些資源消耗;如果分開部署的話,可考慮使用FastCGI,現在越來越多的人使用nginx+php架構了。

五、tomcat處理Jsp/Servlet

1、Jsp
Jsp全稱是Java Server Pages,它和Servlet技術一樣,都是SUN公司定義的一種用於開發動態web資源的技術。Jsp的最大特點在於,寫jsp就像在寫html,html只能為使用者提供靜態資料,而jsp技術允許 在頁面中巢狀java程式碼,為使用者提供動態資料。
tomcat在jsp頁面的處理上與php一樣,就是個解析器。tomcat與php相同的是,它們都是動態指令碼解析器;不同的是,tomcat本身還能處理靜態頁面,同時又是一個web伺服器。
2、Servlet
Java Servlet是Java Web的三大元件之一,是Java語言編寫的執行在伺服器端的小程式,由Servlet容器管理,用於互動式地瀏覽和修改資料,生成動態的內容。編寫一個Servlet,實際上就是按照Servlet規範編寫一個Java類。Servlet被編譯為平臺獨立的位元組碼,可以被動態地載入到支援Java技術的web伺服器中執行。
與jsp、php不同的是,它是在servlet容器中獨立執行的程式,而不是嵌入在網站頁面裡的。

本文轉載於:https://blog.51cto.com/andyxu/2306579