一、什么是虛擬主機
一台物理機上搭建多個web站點,每個web站點獨立運行,互不干擾,這些站點就是"虛擬主機"。
虛擬主機的實現方式:
1、基於主機名的虛擬主機:多個域名解析到同一個IP地址,在WEB服務器里添加多個站點,每個站點設定一個主機名。HTTP協議請求里包含了主機名信息,當WEB服務器收到訪問請求時,就可以根據不同的主機名來訪問不同的網站。
步驟:
a、配置域名與Ip的映射管理(對於本地局域網我們使用在host文件中添加;對於大型網絡或者外網網絡則需要配置DNS服務器中Ip地址與域名的映射關系)
在C:\Windows\System32\drivers\etc\hosts文件末尾添加:
127.0.0.1 www.jalja1.org
127.0.0.1 www.jalja2.org
b、配置server.xml
<Host name="www.jalja1.org" appBase="E:/學習/activeMq/app1" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <Host name="www.jalja2.org" appBase="E:/學習/activeMq/app2" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host>
c、測試
http://www.jalja1.org:8080/
http://www.jalja2.org:8080/
2、基於端口號的虛擬主機:一個IP地址,通過不同的端口實現不同網站的訪問。
步驟:在server.xml 中 設置兩個service組件
<Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="www.jalja1.org" appBase="E:/學習/activeMq/app1" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> <Service name="Catalina2"> <Connector port="8888" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina2" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="www.jalja1.org" appBase="E:/學習/activeMq/app2" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service>
http://www.jalja1.org:8888/
http://www.jalja1.org:8080/
3、基於IP地址的虛擬主機:服務器使用多網卡配置多個IP地址,然后配置WEB服務器,把多個網站綁定在不同的IP上。(該方式浪費Ip資源,tomcat不支持該方式)
二、tomcat目錄結構:
bin:tomcat啟動關閉腳本文件。
conf:tomcat各種配置文件。其核心配置文件:
1、server.xml 配置與server相關信息
2、web.xml web應用(一個web應用相當於一個站點)
3、tomcat-users.xml 配置tomcat相關信息(tomcat用戶名 密碼 權限)
<?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="admin-gui"/> <user username="tomcat" password="tomcat" roles="admin-gui"/> </tomcat-users>
lib:tomcat啟動依賴的jar包
logs:tomcat日志
temp:tomcat運行是產生的臨時文件
webapps:web應用所在的目錄,即提供外界訪問的web資源存放目錄。
work:tomcat工作目錄,主要用於存放jsp被訪問后生成對應的servlet文件以及class文件。
三、tomcat處理HTTP請求的過程
1、tomcat各個組件的關系(tomcat7)
<?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JasperListener" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>
- Server server元素是JVM的入口點,整個配置文件只有一個,因為server不是容器(container),因此不能嵌套子組件.server在某一指定的端口監聽shutdown命令.server可以包含一個或多個service實。
- Service service有共享同一個Container的一個或多個Connectors組成,一般Service就是一個Engine,但沒有明確規范要求如此.因為Service不是一個Container,因此不能在里面嵌套子組件(比如Loggers/Valves)。
- Connector connector就是一個Tomcat與客戶端的連接,Tomcat有兩種典型的Connector:http,JK2.http connector監聽來自Browser的連接(通常在我們熟悉的8080端口),JK2.來自其他WebServer的請求(默認在8009端口監聽)。Connector會把獲得的請求交給Engine處理。
- Engine Engine下可以配置多個虛擬主機Virtual Host,每個虛擬主機都有一個域名當Engine獲得一個請求時,它把該請求匹配到某個Host上,然后把該請求交給該Host來處理Engine有一個默認虛擬主機,當請求無法匹配到任何一個Host上的時候,將交給該默認Host來處理。
- Host host代表一個虛擬主機,默認是localhost,host下可以部署多個web application,在我們實際應用中一般要考慮問題的對象就是host。
- Context context代表一個WEB應用
2、請求處理流程
處理流程:用戶發送請求到web服務器,該請求會被正在監聽的Connector連接器接收,並把該請求交給Service下的Engine來處理,並等待Engine處理的結果。Engine獲得請求后會根據請求的主機信息來匹配相應的Host主機,Host主機會根據請求的路徑匹配對應的Context,Context web應用匹配上之后就構建request、response請求對象,調用指定的Servlet來處理請求。請求處理完成后會將response對象返回給Host主機,Host主機將response對象返回給Engine引擎,Engine再將response對象返回給Connector鏈接器,最后Connector連接器將response返回給瀏覽器。