Tomcat虚拟主机

通过配置tomcat虚拟主机,可以实现一个tomcat服务器承载多个Web站点


实现原理:多个虚拟主机的Web站点是创建在同一台计算机上的,不管Web浏览器访问其中的哪一个站点,请求都会发送到这台计算机上。怎么区分的?
1.Web服务器上的每个Web站点必须设置不同的标识信息 //我要有识别你的办法
2.Web浏览器发出的连接和请求信息必须包含Web站点的表示信息 //那前提是你们有不同标识



实现方法:

1.基于主机名的虚拟主机:
通过请求信息中的Host: 字段来判断进入那个主机


%CATALINA_HOME%/conf/server.xml 中的各种标签:


<Engine name="Standalone" default="localhost" debug="0"> //处理客户端请求的引擎,这里如果没有检测的主机名,则去进入localhost的主机
<Host name="localhost" appBase="webapps"> //对应的是一个主机,刚好可以与Http请求中的Host信息相对应
 <Context path="" docBase="" debug="0"> //对应的是一个映射路径
。。。
 </Context>
...
</Host>
</Engine>

我在d:下创建了2个文件夹:VistualHost1/test.html:这是vistualHost1中的test.html   VistualHost2/test.html:这是vistuallHost2中的test2.html

在server.xml文件中的修改,在Host之下添上如下:

     <span style="white-space:pre">	</span><Host>... </Host>
<span style="white-space:pre">	</span><Host name="site1" debug="0" appBase="d:/VirtualHost1" 
       <span style="white-space:pre">	</span>unpackWARs="true" autoDeploy="true">
       <span style="white-space:pre">		</span><Context path="" docBase="." />
       <span style="white-space:pre">	</span></Host>
        <Host name="site2" debug="0" appBase="d:/VirtualHost2" 
      <span style="white-space:pre">	</span> unpackWARs="true" autoDeploy="true">
       <span style="white-space:pre">		</span><Context path="" docBase="." />
       <span style="white-space:pre">	</span></Host>
    </Engine>

  然后通过java代码访问测试

package com.aii.test;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

public class Main {

	public static void main(String[] args)throws Exception {
		send("");
		send("site1");
		send("site2");
	}
	
	public static void send(String args)throws Exception{
		InetAddress address=InetAddress.getLocalHost();
		Socket socket=new Socket(address, 8080);
		BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));		
		PrintWriter pw=new PrintWriter(socket.getOutputStream());
		pw.println("GET /test.html HTTP/1.1");
		pw.println("Host: "+args);
		pw.println();
		pw.flush();
		for(String str=reader.readLine();str!=null;){
			System.out.println(str);
			str=reader.readLine();
		}
		reader.close();
		socket.close();
	}
}
打印
效果如下:

HTTP/1.1 200 OK
ETag: W/"9-1432968564586"
Last-Modified: Sat, 30 May 2015 06:49:24 GMT
Content-Type: text/html
Content-Length: 9
Date: Sat, 30 May 2015 09:46:06 GMT
Server: Apache Coyote/1.0

test Page
HTTP/1.1 200 OK
ETag: W/"31-1432977236036"
Last-Modified: Sat, 30 May 2015 09:13:56 GMT
Content-Type: text/html
Content-Length: 31
Date: Sat, 30 May 2015 09:46:26 GMT
Server: Apache Coyote/1.0

这是vistualHost1中的test.html
HTTP/1.1 200 OK
ETag: W/"31-1432977250959"
Last-Modified: Sat, 30 May 2015 09:14:10 GMT
Content-Type: text/html
Content-Length: 31
Date: Sat, 30 May 2015 09:46:46 GMT
Server: Apache Coyote/1.0

这是vistualHost2中的test.html


评价:共享同一个IP地址和端口号,Web浏览不能通过IP地址去访问这些Web站点,用的还是比较多的


2.基于端口号的虚拟主机
不同的端口对应不同的Web服务器

<Service name="">
<Connector port=""../>
<Engine ...>
<Context..></Context>
</Engine>

将一个或者多个<Connector>元素与某个<Engine>元素相关联的方式就是将他们嵌套在一个<Service>中

由于需要指定不同的端口号,而我们一般访问的网页用的都是80端口,也就是不写,所以用的不多


3.基于IP地址的虚拟主机

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值