後端程序員必須要懂的Tomcat服務器

目錄結構

Tomcat是一款純綠色安裝的軟件,從官網下載下來以後解壓即可使用,期目錄結構如下圖所示

  • bin:  tomcat服務器的可執行文件和腳本文件
  • conf: tomcat的配置信息文件
  • lib:   tomcat的依賴jar包
  • log:  tomcat的日誌信息
  • temp:  tomcat的臨時文件
  • webapps:存放web應用的目錄,web應用會部署到該目錄下
  • work: 存放jsp編譯後產生的字節碼文件

當服務器上沒有部署任何項目時,啓動服務器默認訪問的是webapps下的ROOT文件夾下的index.jsp文件

整體架構

HTTP服務器

瀏覽器發送給服務端的是一個http格式的需求,http服務器收到這個請求後,需要調用服務端程序來處理,所謂的服務端程序就是我們寫的java類,一般來說,不同的請求需要不同的Java類來處理

  1. 圖1表示服務器直接調用具體業務類,此時他們是耦合的
  2. 圖2 HTTP服務器不直接調用業務類,而是將請求分發給Servlet容器來處理,容器再通過Servlet接口來調用業務類處理。正是因爲Servlet接口和Servlet容器的出現,使得HTTP服務器和業務類實現瞭解耦。我們把Servlet接口和Servlet容器這一整套規範稱作Servlet規範。Tomcat按照Servlet規範實現了Servlet容器,同時它也具有HTTP服務器的功能。所以這也是爲什麼Java程序員只需要實現一個Servlet接口就能處理一個請求的原因所在,即我們負責實現,tomcat負責調用。

Servlet容器運行原理

由前面我們知道,Servlet容器解決了HTTP服務器和業務類之間的耦合關係,業務類的具體調用交由自己處理,那麼它是如何處理的呢?

當客戶請求某個資源時,HTTP服務器會用一個ServletRequest對象把客戶的請求信息封裝起來,然後調用Servlet容器的service方法;Servlet容器拿到請求信息後,會根據請求的URL和Servlet的映射關係找到對應的Servlet,如果Servlet還沒有被加載,就會利用反射機制創建這個Servlet對象,然後調用init()方法來完成初始化,接着調用service()方法來處理請求,最後返回給HTTP服務器一個ServletResponse對象,HTTP服務器會把響應的數據發送給客戶端;如下圖所示

容器(Catalina)

Tomcat是一個由一系列可配置的組件構成的Web容器,而Catalina是Tomcat的Servlet容器;Catalina是Servlet容器的具體實現,它集成了安全,管理,集羣,會話等Servlet容器架構的各個方面;它在Tomcat整體架構中的位置如下圖所示

Tomcat的本質是一款Servlet容器,因此Catalina纔是Tomcat的核心,其他模塊都是爲Calina提供支持的。那麼Catalina的內部組成又是如何的呢?它的主要結構如下

如上圖所示,Catalina負責管理Server,而Server表示整個服務器,Server下面又有多個Service,每個Service包含着多個Connector(連接器組件)和一個容器組件Container。在Tomcat啓動的時候,會初始化一個Catalina對象。

各組件的職責如下

相關配置

Tomcat服務器的配置主要集中於conf文件夾下的catalina.policy,Catalina.properties,context.xml,server.xml,tomcat-users.xml以及web.xml中

服務配置

服務配置的相關信息主要都封裝在server.xml文件中

Executor(線程池)

默認情況下service並未添加共享線程池配置,如果我們想添加一個,可以在<service>下添加如下配置

相關的屬性說明如下

附:我們可以通過JDK提供的JConsole來監控線程變化

Connector(連接器)

Connector用於創建鏈接器實例。默認情況下,server.xml配置來兩個鏈接器,一個支持HTTP協議,一個支持AJP協議,因此大多數情況下,我們並不需要增減鏈接器配置,只是根據需要對已有鏈接器進行優化

相關的屬性說明

  1. port:端口號,用於創建服務端Socket並進行監聽,如果屬性值設置爲0,tomcat會隨機分配一個可用端口號給當前連接器用
  2. protocol:當前連接器支持的訪問協議。默認爲HTTP/1.1
  3. connectionTimeOut:連接器接收連接後的等待超時時間,單位毫秒,-1表示不超時
  4. redirectPort:當前connector不支持SSL請求,當需要SSL傳輸時指定的一個端口
  5. executor:指定共享線程池的名稱
  6. URIEncoding:用於指定URI的字符編碼,Tomcat8以上默認是UTF-8

關於protocol配置的簡單補充

Engine(引擎)

Engine作爲Servlet引擎的頂級元素,內部可以嵌入Cluster,Listener,Value和Hosts

屬性說明

  1. name:用於指定Engine的名稱,默認爲Catalina。該名稱會影響部分文件的存儲路徑
  2. defaultHost:默認使用的虛擬主機名稱,當客戶端請求指向的主機無效時,將交由默認的虛擬主機處理,默認爲localhost

Host(主機)

Host元素用於配置一個虛擬主機,它支持很多嵌套原色

屬性說明

  1. name:當前Host通用的網絡名稱,必須與DNS(域名)服務器上的註冊信息一致
  2. appBase:當前Host應用的基礎目錄,當前部署的項目應都在該目錄下,默認爲webapps
  3. unpackWARs:設置爲true,Host啓動時會將war包解壓,false則不解壓
  4. autoDeploy:控制tomcat是否在運行時定期監測並自動部署新增或變更的web應用

Context

用來配置一個web應用,默認配置如下

屬性描述

  1. docBase:Web應用目錄或者War包的部署路徑,可以是絕對路徑也可以是Host/appBase的相對路徑
  2. path:Web應用的Context路徑,如果我們Host名爲localhost,則web應用的訪問跟路徑爲http://localhost:8080/myApp/

管理配置

Tomcat作爲一個服務器軟件,本身對外提供了虛擬主機管理和對部署的所有web應用的管理,如下圖所示

這兩個模塊都默認添加了訪問權限控制,當你點擊某個按鈕時都需要你輸入用戶名和密碼登入,所以想要訪問該頁面,必須在conf/tomcat-users.xml中配置並分配對應的角色

Host Manager

配置如下:

其中

  1. admin-gui:用於控制頁面訪問權限
  2. admin-script:用於控制以簡單文本的形式訪問

Manager

配置如下

服務器安全

Tomcat 作爲一個運行我們項目的服務器,如何保證其安全是我們必須要關注的問題,通常我們會從配置安全,應用安全以及傳輸安全這三個方面同時加強系統的安全性。

配置安全

  1. 刪除webapps下的目錄
  2. 註釋或刪除tomcat-users.xml文件內的所有用戶權限
  3. 配置異常頁面
  4. 更改關閉tomcat指令或禁用:Tomcat的server.xml中定義了可以直接關閉tomcat實例的管理端口。可以通過telnet連接上端口以後,輸入SHUTDOWN(默認關閉指令)即可關閉tomcat實例(注意,此時雖然實例關閉了但是進程依然存在),由與默認的端口和指令都很簡單,所以我們可以通過一下方式修改或禁用

     

應用安全

在大部分web應用中,特別是一些後臺應用系統,都會實現自己的安全管理模塊或者說是權限模塊,用於控制應用系統的安全訪問,基本包含兩個部分:認證(登入/單點登入)和授權(功能權限和數據權限)兩個部分。對於當前的業務系統,可以自己做一套適用於自己系統的安全管理模塊,也可以用一些功能完善的安全模塊,將其集成到我們的系統中來,如Spring-security,shiro等

傳輸安全

HTTPS介紹

至此,僅剩調優部分的知識了,有時間再更新

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章