1. 程式人生 > >Web Server與App Server

Web Server與App Server

Web Server
  常見的Web Server有Apache Server與Nginx。

  Apache Http Server是Apache軟體基金會下的一個專案,是一款開源的HTTP伺服器軟體(它也可以作為郵件代理伺服器、通用的TCP代理伺服器)。

  Nginx之前有配置它的博文,大多數用它來做負載均衡。

  這兩者基本相同,HTTP伺服器本質上也是一種應用程式——通常執行在伺服器之上,繫結伺服器的IP地址並監聽某一個tcp埠來接收並處理HTTP請求,這樣客戶端(各種瀏覽器)就能夠通過HTTP協議來獲取伺服器上的網頁(HTML格式)、文件(PDF格式)、音訊(MP4格式)、視訊(MOV格式)包括CSS、JS等等資源。下圖描述的就是這一過程:

這裡寫圖片描述

  Web Server一般至於企業防火牆之外,這個防火牆可以認為是一個路由器,然後再CISCO路由器上開放了兩個埠為:80和443。其中80埠用於正常的http訪問。443埠用於https訪問,即如果你在瀏覽器中輸入https://www.xxx.com這樣的地址,預設走的是443這個埠。
總而言之,Web Server起到了佔用伺服器埠和只能解析一些靜態檔案的作用。

  一個HTTP Server關心的是HTTP協議層面的傳輸和訪問控制,所以在Apache/Nginx上你可以看到代理、負載均衡等功能。客戶端通過HTTP Server訪問伺服器上儲存的資源(HTML檔案、圖片檔案等等)。通過CGI技術,也可以將處理過的內容通過HTTP Server分發,但是一個HTTP Server始終只是把伺服器上的檔案如實的通過HTTP協議傳輸給客戶端。

App Server
  其至於企業防火牆之內,它和Web Server之間的連線必須且一定為內部IP連線。外部IP:即Internet IP地址,我們的Web伺服器一般會有一個內部IP和一個外部IP,因此在這裡,我們的App Server沒有任何外部IP,只有內部IP,所以我們在這裡說App Server與Web Server只能以內部IP形式連線。比如說我們用的App Server是Tomcat,它的埠為8080,那麼這個IP地址上的8080埠只能由任何內部IP才能訪問,外部的Internet是訪問不了的,這樣做就是為了安全!

  App Server用於解析我們的任何需要Java編譯器才能解析的“動態”網頁,其實App Server本身也能解析任何靜態網頁的。

  Apache HTTP Server和Nginx本身不支援生成動態頁面,但它們可以通過其他模組來支援(例如通過Shell、PHP、Python指令碼程式來動態生成內容)。
如果想要使用Java程式來動態生成資源內容,使用這一類HTTP伺服器很難做到。Java Servlet技術以及衍生的Java Server Pages技術可以讓Java程式也具有處理HTTP請求並且返回內容(由程式動態控制)的能力,Tomcat正是支援執行Servlet/JSP應用程式的容器(Container):

  Tomcat是Apache軟體基金會下的另一個專案,與Apache HTTP Server相比,Tomcat能夠動態的生成資源並返回到客戶端。Apache HTTP Server和Nginx都能夠將某一個文字檔案的內容通過HTTP協議返回到客戶端,但是這個文字檔案的內容是固定的——也就是說不能和網頁進行一些互動,只能做簡單的頁面跳轉,比如:包含顯示當前時間的頁面;顯示當前IP地址的頁面;

  Tomcat執行在JVM之上,它和HTTP伺服器一樣,繫結IP地址並監聽TCP埠,同時還包含以下職責:管理Servlet程式的生命週期;將URL對映到指定的Servlet進行處理;與Servlet程式合作處理HTTP請求——根據HTTP請求生成HttpServletResponse物件並傳遞給Servlet進行處理,將Servlet中的HttpServletResponse物件生成的內容返回給瀏覽器。

  Tomcat可以認為是HTTP伺服器,但通常它仍然會和Nginx配合在一起使用:
  動靜態資源分離——運用Nginx的反向代理功能分發請求:所有動態資源的請求交給Tomcat,而靜態資源的請求(例如圖片、視訊、CSS、JavaScript檔案等)則直接由Nginx返回到瀏覽器,這樣能大大減輕Tomcat的壓力;負載均衡,當業務壓力增大時,可能一個Tomcat的例項不足以處理,那麼這時可以啟動多個Tomcat例項進行水平擴充套件,而Nginx的負載均衡功能可以把請求通過演算法分發到各個不同的例項進行處理。

為什麼既要有Web Server,又要有App Server?
  我們可以讓專門負責解析靜態網頁的Web Server來解析HTML等內容,而讓App Server專門用於解析任何需要Java編譯器才能解析的東西,讓它們“兩人”各司其職。
  這樣的好處:

1.為App Server“減壓”,同時也提高了performance(效能)。
2.不用再把8080這個埠暴露在Internet上了,這樣很安全;-),畢竟App Server上是有我們的程式碼的,就算是編譯過的程式碼class檔案,也是容易被“反編譯”的。
3.這也為將來的進一步的“叢集擴充套件”打好了基礎。