一、Web服務(wù)
1.web服務(wù)器分類
Unix和Linux平臺(tái)下使用最廣泛的免費(fèi)HTTP服務(wù)器是Apache服務(wù)器,而Windows平臺(tái)的服務(wù)器通常使用IIS作為Web服務(wù)器。選擇Web服務(wù)器應(yīng)考慮的因素有:性能、安全性、日志和統(tǒng)計(jì)、虛擬主機(jī)、代理服務(wù)器、緩沖服務(wù)和集成應(yīng)用程序等。下面是對(duì)常見(jiàn)服務(wù)器的簡(jiǎn)介:
IIS:Microsoft的Web服務(wù)器產(chǎn)品,全稱是Internet Information Services。IIS是允許在公共Intranet或Internet上發(fā)布信息的Web服務(wù)器。IIS是目前最流行的Web服務(wù)器產(chǎn)品之一,很多著名的網(wǎng)站都是建立在IIS的平臺(tái)上。IIS提供了一個(gè)圖形界面的管理工具,稱為Internet服務(wù)管理器,可用于監(jiān)視配置和控制Internet服務(wù)。IIS是一種Web服務(wù)組件,其中包括Web服務(wù)器、FTP服務(wù)器、NNTP服務(wù)器和SMTP服務(wù)器,分別用于網(wǎng)頁(yè)瀏覽、文件傳輸、新聞服務(wù)和郵件發(fā)送等方面,它使得在網(wǎng)絡(luò)(包括互聯(lián)網(wǎng)和局域網(wǎng))上發(fā)布信息成了一件很容易的事。它提供ISAPI(Intranet Server API)作為擴(kuò)展Web服務(wù)器功能的編程接口;同時(shí),它還提供一個(gè)Internet數(shù)據(jù)庫(kù)連接器,可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的查詢和更新。
Kangle:Kangle Web服務(wù)器是一款跨平臺(tái)、功能強(qiáng)大、安全穩(wěn)定、易操作的高性能Web服務(wù)器和反向代理服務(wù)器軟件。此外,Kangle也是一款專為做虛擬主機(jī)研發(fā)的Web服務(wù)器。實(shí)現(xiàn)虛擬主機(jī)獨(dú)立進(jìn)程、獨(dú)立身份運(yùn)行。用戶之間安全隔離,一個(gè)用戶出問(wèn)題不影響其他用戶。支持PHP、ASP、ASP.NET、Java、Ruby等多種動(dòng)態(tài)開(kāi)發(fā)語(yǔ)言。
WebSphere:WebSphere Application Server是功能完善、開(kāi)放的Web應(yīng)用程序服務(wù)器,是IBM電子商務(wù)計(jì)劃的核心部分,它是基于Java的應(yīng)用環(huán)境,用于建立、部署和管理Internet和Intranet Web應(yīng)用程序,適應(yīng)各種Web應(yīng)用程序服務(wù)器的需要。
WebLogic:WebLogic Server是一款多功能、基于標(biāo)準(zhǔn)的Web應(yīng)用服務(wù)器,為企業(yè)構(gòu)建企業(yè)應(yīng)用提供了堅(jiān)實(shí)的基礎(chǔ)。針對(duì)各種應(yīng)用開(kāi)發(fā)、關(guān)鍵性任務(wù)的部署,各種系統(tǒng)和數(shù)據(jù)庫(kù)的集成、跨Internet協(xié)作等Weblogic都提供了相應(yīng)的支持。由于它具有全面的功能、對(duì)開(kāi)放標(biāo)準(zhǔn)的遵從性、多層架構(gòu)、支持基于組件的開(kāi)發(fā)等優(yōu)勢(shì),很多公司的企業(yè)級(jí)應(yīng)用都選擇它來(lái)作為開(kāi)發(fā)和部署的環(huán)境。WebLogic Server在使應(yīng)用服務(wù)器成為企業(yè)應(yīng)用架構(gòu)的基礎(chǔ)方面一直處于領(lǐng)先地位,為構(gòu)建集成化的企業(yè)級(jí)應(yīng)用提供了穩(wěn)固的基礎(chǔ)。
Apache:目前Apache仍然是世界上用得最多的Web服務(wù)器,其市場(chǎng)占有率很長(zhǎng)時(shí)間都保持在60%以上(目前的市場(chǎng)份額約40%左右)。世界上很多著名的網(wǎng)站都是Apache的產(chǎn)物,它的成功之處主要在于它的源代碼開(kāi)放、有一支強(qiáng)大的開(kāi)發(fā)團(tuán)隊(duì)、支持跨平臺(tái)的應(yīng)用(可以運(yùn)行在幾乎所有的Unix、Windows、Linux系統(tǒng)平臺(tái)上)以及它的可移植性等方面。
Tomcat:Tomcat是一個(gè)開(kāi)放源代碼、運(yùn)行Servlet和JSP的容器。Tomcat實(shí)現(xiàn)了Servlet和JSP規(guī)范。此外,Tomcat還實(shí)現(xiàn)了Apache-Jakarta規(guī)范而且比絕大多數(shù)商業(yè)應(yīng)用軟件服務(wù)器要好,因此目前也有不少的Web服務(wù)器都選擇了Tomcat。
Nginx:讀作"engine x",是一個(gè)高性能的HTTP和反向代理服務(wù)器,也是一個(gè)IMAP/POP3/SMTP代理服務(wù)器。 Nginx是由Igor Sysoev為俄羅斯訪問(wèn)量第二的Rambler站點(diǎn)開(kāi)發(fā)的,第一個(gè)公開(kāi)版本0.1.0發(fā)布于2004年10月4日。其將源代碼以類BSD許可證的形式發(fā)布,因它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名。在2014年下半年,Nginx的市場(chǎng)份額達(dá)到了14%。
2、web.xml文件中可以配置哪些內(nèi)容?
答:web.xml用于配置Web應(yīng)用的相關(guān)信息,如:監(jiān)聽(tīng)器(listener)、過(guò)濾器(filter)、 Servlet、相關(guān)參數(shù)、會(huì)話超時(shí)時(shí)間、安全驗(yàn)證方式、錯(cuò)誤頁(yè)面等,下面是一些開(kāi)發(fā)中常見(jiàn)的配置:
① 配置Spring上下文加載監(jiān)聽(tīng)器加載Spring配置文件并創(chuàng)建IoC容器:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
② 配置Spring的OpenSessionInView過(guò)濾器來(lái)解決延遲加載和Hibernate會(huì)話關(guān)閉的矛盾:
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
③ 配置會(huì)話超時(shí)時(shí)間為10分鐘:
<session-config>
<session-timeout>10</session-timeout>
</session-config>
④ 配置404和Exception的錯(cuò)誤頁(yè)面:
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>
⑤ 配置安全認(rèn)證方式:
<security-constraint>
<web-resource-collection>
<web-resource-name>ProtectedArea</web-resource-name>
<url-pattern>/admin/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
<security-role>
<role-name>admin</role-name>
</security-role>
說(shuō)明:對(duì)Servlet(小服務(wù))、Listener(監(jiān)聽(tīng)器)和Filter(過(guò)濾器)等Web組件的配置,Servlet 3規(guī)范提供了基于注解的配置方式,可以分別使用@WebServlet、@WebListener、@WebFilter注解進(jìn)行配置。
補(bǔ)充:如果Web提供了有價(jià)值的商業(yè)信息或者是敏感數(shù)據(jù),那么站點(diǎn)的安全性就是必須考慮的問(wèn)題。安全認(rèn)證是實(shí)現(xiàn)安全性的重要手段,認(rèn)證就是要解決“Are you who you say you are?”的問(wèn)題。認(rèn)證的方式非常多,簡(jiǎn)單說(shuō)來(lái)可以分為三類:
A. What you know? — 口令
B. What you have? — 數(shù)字證書(U盾、密保卡)
C. Who you are? — 指紋識(shí)別、虹膜識(shí)別
在Tomcat中可以通過(guò)建立安全套接字層(Secure Socket Layer, SSL)以及通過(guò)基本驗(yàn)證或表單驗(yàn)證來(lái)實(shí)現(xiàn)對(duì)安全性的支持。
二、Tomcat總結(jié)
1.Tomcat架構(gòu)

Tomcat中最頂層的容器是Server,代表著整個(gè)服務(wù)器,從上圖中可以看出,一個(gè)Server可以包含至少一個(gè)Service,用于具體提供服務(wù)。
Service主要包含兩個(gè)部分:
Connector和Container。從上圖中可以看出 Tomcat 的心臟就是這兩個(gè)組件,他們的作用如下:
- Connector用于處理連接相關(guān)的事情,并提供Socket與Request和Response相關(guān)的轉(zhuǎn)化;
- Container用于封裝和管理Servlet,以及具體處理Request請(qǐng)求;
一個(gè)Tomcat中只有一個(gè)Server,一個(gè)Server可以包含多個(gè)Service,一個(gè)Service只有一個(gè)Container,但是可以有多個(gè)Connectors,這是因?yàn)橐粋€(gè)服務(wù)可以有多個(gè)連接,如同時(shí)提供Http和Https鏈接,也可以提供向相同協(xié)議不同端口的連接,示意圖如下

小結(jié):
(1)Tomcat中只有一個(gè)Server,一個(gè)Server可以有多個(gè)Service,一個(gè)Service可以有多個(gè)Connector和一個(gè)Container;
(2)Server掌管著整個(gè)Tomcat的生死大權(quán);
(4)Service 是對(duì)外提供服務(wù)的;
(5)Connector用于接受請(qǐng)求并將請(qǐng)求封裝成Request和Response來(lái)具體處理;
(6)Container用于封裝和管理Servlet,以及具體處理request請(qǐng)求;
Connector和Container的微妙關(guān)系
由上述內(nèi)容我們大致可以知道一個(gè)請(qǐng)求發(fā)送到Tomcat之后,首先經(jīng)過(guò)Service然后會(huì)交給我們的Connector,Connector用于接收請(qǐng)求并將接收的請(qǐng)求封裝為Request和Response來(lái)具體處理,Request和Response封裝完之后再交由Container進(jìn)行處理,Container處理完請(qǐng)求之后再返回給Connector,最后在由Connector通過(guò)Socket將處理的結(jié)果返回給客戶端,這樣整個(gè)請(qǐng)求的就處理完了!
Connector最底層使用的是Socket來(lái)進(jìn)行連接的,Request和Response是按照HTTP協(xié)議來(lái)封裝的,所以Connector同時(shí)需要實(shí)現(xiàn)TCP/IP協(xié)議和HTTP協(xié)議!
2.解釋什么是Jasper?
Jasper是Tomcat的JSP引擎,它解析JSP文件,將它們編譯成JAVA代碼作為servlet。在運(yùn)行時(shí),Jasper允許自動(dòng)檢測(cè)JSP文件的更改并重新編譯它們
3.請(qǐng)解釋Tomcat的默認(rèn)端口是什么?
Tomcat的默認(rèn)端口是8080。在本地機(jī)器上初始化Tomcat之后,可以驗(yàn)證Tomcat是否正在運(yùn)行URL:http://localhost:8080
4.請(qǐng)解釋Tomcat中使用的連接器是什么?
在Tomcat中,使用了兩種類型的連接器:
HTTP連接器:它有許多可以更改的屬性,以確定它的工作方式和訪問(wèn)功能,如重定向和代理轉(zhuǎn)發(fā)
AJP連接器:它以與HTTP連接器相同的方式工作,但是他們使用的是HTTP的AJP協(xié)議。AJP連接器通常通過(guò)插件技術(shù)mod_jk在Tomcat中實(shí)現(xiàn)
5.解釋如何使用WAR文件部署web應(yīng)用程序?
在Tomcat的web應(yīng)用程序目錄下,jsp、servlet和它們的支持文件被放置在適當(dāng)?shù)淖幽夸浿?。你可以將web應(yīng)用程序目錄下的所有文件壓縮到一個(gè)壓縮文件中,以.war文件擴(kuò)展名結(jié)束。你可以通過(guò)在webapps目錄中放置WAR文件來(lái)執(zhí)行web應(yīng)用程序。當(dāng)一個(gè)web服務(wù)器開(kāi)始執(zhí)行時(shí),它會(huì)將WAR文件的內(nèi)容提取到適當(dāng)?shù)膚ebapps子目錄中。
6.解釋什么是Tomcat Valve?說(shuō)明Tomcat配置了多少個(gè)Valve?
Tomcat Valve——Tomcat 4引入的新技術(shù),它允許您將Java類的實(shí)例鏈接到一個(gè)特定的Catalina容器。Tomcat配置了四種類型的Valve:
- 訪問(wèn)日志
- 遠(yuǎn)程地址過(guò)濾
- 遠(yuǎn)程主機(jī)過(guò)濾器
- 客戶請(qǐng)求記錄器
7.解釋servlet如何完成生命周期?
在Tomcat上運(yùn)行的典型servlet生命周期如下:
- Tomcat通過(guò)它的其中一個(gè)連接器接收來(lái)自客戶端的請(qǐng)求
- 進(jìn)程請(qǐng)求Tomcat將此請(qǐng)求映射為適當(dāng)?shù)腟ervlet
- 一旦請(qǐng)求被定向到適當(dāng)?shù)膕ervlet,Tomcat就會(huì)驗(yàn)證servlet類是否已經(jīng)加載。如果不是,Tomcat將servlet包裝成Java字節(jié)碼,這是由JVM執(zhí)行的,并形成servlet的實(shí)例
- Tomcat通過(guò)調(diào)用它的init來(lái)啟動(dòng)servlet,它包含能夠篩選Tomcat配置文件并相應(yīng)地采取行動(dòng)的代碼,并聲明它可能需要的任何資源
- 一旦servlet啟動(dòng),Tomcat就可以調(diào)用servlet的服務(wù)方法來(lái)進(jìn)行請(qǐng)求
- 在servlet的生命周期中,Tomcat和servlet可以通過(guò)使用偵聽(tīng)器類來(lái)進(jìn)行協(xié)調(diào)或通信,從而跟蹤各種狀態(tài)變化的servlet
- 刪除servlet,Tomcat調(diào)用servlet銷毀方法
8.Tomcat優(yōu)化經(jīng)驗(yàn)
一、關(guān)掉對(duì)web.xml的監(jiān)視,把jsp提前編輯成Servlet。有富余物理內(nèi)存的情況,加大tomcat使用的jvm的內(nèi)存
二、服務(wù)器資源。服務(wù)器所能提供CPU、內(nèi)存、硬盤的性能對(duì)處理能力有決定性影響。
(1) 對(duì)于高并發(fā)情況下會(huì)有大量的運(yùn)算,那么CPU的速度會(huì)直接影響到處理速度。
(2) 內(nèi)存在大量數(shù)據(jù)處理的情況下,將會(huì)有較大的內(nèi)存容量需求,可以用-Xmx -Xms -XX:MaxPermSize等參數(shù)對(duì)內(nèi)存不同功能塊進(jìn)行劃分。我們之前就遇到過(guò)內(nèi)存分配不足,導(dǎo)致虛擬機(jī)一直處于full GC,從而導(dǎo)致處理能力嚴(yán)重下降。
(3) 硬盤主要問(wèn)題就是讀寫性能,當(dāng)大量文件進(jìn)行讀寫時(shí),磁盤極容易成為性能瓶頸。最好的辦法還是利用下面提到的緩存。
三、利用緩存和壓縮
對(duì)于靜態(tài)頁(yè)面最好是能夠緩存起來(lái),這樣就不必每次從磁盤上讀。這里我們采用了Nginx作為緩存服務(wù)器,將圖片、css、js文件都進(jìn)行了緩存,有效的減少了后端tomcat的訪問(wèn)。另外,為了能加快網(wǎng)絡(luò)傳輸速度,開(kāi)啟gzip壓縮也是必不可少的。但考慮到tomcat已經(jīng)需要處理很多東西了,所以把這個(gè)壓縮的工作就交給前端的Nginx來(lái)完成。
除了文本可以用gzip壓縮,其實(shí)很多圖片也可以用圖像處理工具預(yù)先進(jìn)行壓縮,找到一個(gè)平衡點(diǎn)可以讓畫質(zhì)損失很小而文件可以減小很多。曾經(jīng)我就見(jiàn)過(guò)一個(gè)圖片從300多kb壓縮到幾十kb,自己幾乎看不出來(lái)區(qū)別。
四、采用集群
單個(gè)服務(wù)器性能總是有限的,最好的辦法自然是實(shí)現(xiàn)橫向擴(kuò)展,那么組建tomcat集群是有效提升性能的手段。我們還是采用了Nginx來(lái)作為請(qǐng)求分流的服務(wù)器,后端多個(gè)tomcat共享session來(lái)協(xié)同工作。可以參考之前寫的《利用nginx+tomcat+memcached組建web服務(wù)器負(fù)載均衡》。
五、 優(yōu)化tomcat參數(shù)
這里以tomcat7的參數(shù)配置為例,需要修改conf/server.xml文件,主要是優(yōu)化連接配置,關(guān)閉客戶端dns查詢。
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="500"
minSpareThreads="20"
acceptCount="100"
disableUploadTimeout="true"
enableLookups="false"
URIEncoding="UTF-8" />