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

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

請求 php腳本 特點 java類 是你 源碼 proc 總結 愛好者

就目前來說,網站主要分為靜態頁面和動態頁面,純靜態頁面的網站已經比較少見了,大型網站一般使用的是靜態頁面+動態頁面的建站技術,還有一部分網站是純動態頁面。
負責處理這些頁面的軟件我們通常稱之為web容器,是一種服務程序,負責處理客戶端(瀏覽器)發來的訪問請求,如果是靜態頁面會直接將文件內容呈現給客戶端(瀏覽器),如果是動態頁面會將其解析成靜態內容之後再呈現給客戶端(瀏覽器)。
技術分享圖片

一、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還需要消耗額外的資源。

三、網站頁面的處理流程

技術分享圖片
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為例,我們先來看一下處理動態頁面的三種方式。
技術分享圖片
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
<IfModule mime_module>
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  $document_root$fastcgi_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容器中獨立運行的程序,而不是嵌入在網站頁面裏的。

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