一、什么是虚拟主机
一台物理机上搭建多个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返回给浏览器。