主题:【原创】浅谈一个Public IP如果提供多个网站服务 -- Highway
世界上怕就怕“琢磨”二字,IT界也概莫能外。昨天有朋友问起这个问题,说是“一台服务器可否建立两个不同的网站?”。
在这里我把这个问题提得更有代表性一些,就是“一个Public IP上能不能提供多个网站服务?”。为什么这么改一下呢?因为服务器只是一个Physical Device,不是很重要,重要的是Public IP的问题。一个服务器可以有N个网卡,一个网卡上你可以Assign多个IP,所以如果你有数个Public IP的话,那么一台服务器当然可以Host multiple sites了。我想大家关心的不是这个问题,大家好奇的是一个Public IP怎么Host multiple sites。
答案首先是肯定的,大家先请放宽心。现在就让我们看看这个问题通常是如何解决的。
一。老式的做法 -- multi-Port
大家知道,WEB工作的原理是IP + Port,大家默认的web http Port是80,加密的(https)port是443。现在你只有一个IP,如果要想提供多个web site而保证他们之间不相互冲突,那么最简单的办法就是给各个site以不同的port。一台计算机上有6万多个Port,所以你可以host如此多的网站(当然很多Port已经被别的Servic占用了,比如ftp 21,smtp 110等等)。这样的话,问题就解决了。譬如你的一个Public IP 66.77.88.99上可以Host 如下网站:
http://www.highway.com //default one, using port 80
http://www.highway.org:800 //using port 800
http://www.greatsite.com:900 //using port 900
当然了,上面提到的这些网站必须是注册过的,并且ISP DNS会讲这些Domain name转换到你的Public IP 66.77.88.99上来。
Wow,这么简单啊!
嘿嘿,你别急,这么做看着是简单,但问题挺多。因为在Domain name后面跟上Port number的做法不常见,用户非要记住你的Damn port number不可,不方便。更糟糕的是绝大部分公司的防火墙只允许端口80上的Traffic进出,别的Port都被屏蔽了。这就意味着你的网站很多人可能无法访问。Shit,right?
(注:别人看不到有时候是好事。比如你的计算机上有两个Web site,一个对外,用默认的80端口,另外一个是公司内部网,用端口8000,这样有防火墙帮你忙,外面的用户无法看到你的inernal web site,这样到省去你很多安全方面的问题了,是不是?)
二。新式的做法--Host header name
从HTTP 1.1起,浏览器访问一个site的时候,除了IP + Port外,还加一个Host header name的东西。这样一来,你就有腾挪躲闪的空间了。既然Port 80是约定俗成不易更改,那么你可以通过改变Host header name来达到你的目的。再Windows2003里面,这个设置非常的简单。(Apache的做法类似,有网友已经指出了,请看链接出处)
这样,www.highway.com, www.highway.org, www.greatsite.com网站的Traffic都到了你的Web server上,Web Server根据这些访问中的Host header name来把服务请求交到相应的网站上去。
Wow,这也很简单嘛!
哈哈,你先别太高兴,这种做法也不是完美的。当你使用https的时候,Host header name被加密了起来,Web server没法看到,所以就无法将访问交到相应的网站去。当然这个问题是有变通的方法解决的,并且一般情况下,个人或是业余网站不会碰到https的问题,所以你也不必太着急。(真着急的时候Call我)
这种做法呢是一个Web Server提供多个网站服务。于是大家有些担心:这样做性能是不是有问题啊?可靠性是不是有问题啊,比如一个家伙的网站有问题,把Web server搞死了,那么是不是其他site也就全翘了?
嘻嘻,这个问题就留给大家自己慢慢“琢磨”吧。
三。另类做法--Web Proxy
假设你是一家小公司的老板,公司现在只有一个Public IP,但是你想提供很多服务,譬如说http://game.highway.com, http://forum.highway.com, http://webmail.highway.com等等。这些服务都很重要,你给每一项任务分配了一个专用服务器(甚至是多个计算机组成的一个cluster),以满足性能,可靠性等等的需要。现在的问题是一个IP能玩得转嘛?
答案还是肯定的。你只需要如此这般这般便可:
1) 在Router上设置Port forwarding,将所有端口80号的Traffic全部交到Proxy Server上去。
2)Proxy Server拿到请求后,分析URL中的Host name,根据你内部网络的DNS服务,Proxy Server将请求交到相应的服务器上(注意:像game.highway.com这样一个domain name的解析是两次完成的,第一次你的ISP将highway.com解析成你的Public IP,而第二部分game, webmail,forum则是你的DNS完成的,指向具体的Private IP)。
3)服务器完成用户请求,将Response交给Proxy Server,由它再交给用户。
Wow,这个好棒啊!您老人家是不是又开始感叹了?
别太激动,这种做法的局限也是很大的。因为它只能Host一类网站,也就是http://xxx.highway.com,对于其他的网站,譬如http://xxx.lowway.com就无能为力了。
====================================
OK,我知道的三种常用做法介绍完了,大家是不是看出来一个问题:“No single silver bullet,没有一个做法是包治百病的”,到底应该如何去做,你可能还需要根据你的需要,动动脑筋!!!
应该等到MM们著急上火打电话求助的时候
再开单人讲座。替你可惜啊!
又帮我补课了,呵呵
也比较模糊。多亏有人问这么个问题,逼着我好好琢磨了一下。所以我还得感谢那位提问题的zsgs朋友呢。
我只知道第一和第三种方法,都是皮毛。
只要注册lowway.com域名的时候指向和highway.com相同的IP就行了。这样对lowway.com的访问一样可以到达proxy,后者映射到相应服务器就可以了。
解决两个网站公用IP公用服务器的问题,就是解决服务器(或者防火墙/NAT,总之就是使用这个公用IP的机器)如何区分收到的这两个网站的数据流的问题(发出不是问题)。
因为两个网站公用一个IP地址,服务器对于收到的包显然不能靠IP来区分。所以就只能从再高的层里想办法。端口号是transport层的办法,最简单,不过用起来不方便。再往上就是从application层里想办法了。这就是利用URL和host header。也就是第三和第二种办法。
对于第三种办法,不光web proxy可以做,可以做application层处理的firewall就可以,只要制定相应的规则,根据URL映射到内部地址和端口,而不是简单的根据目标端口映射到内部地址和端口。这个实际并不用到一般web proxy的功能。
最早的问题我记得实际是如何在一个服务器上建两个网站,这个比如何在一个公用IP上建网站还容易,因为同一台服务器上可以赋好几个公用IP,这样可选的办法就更多了。
就是建立公司内部的DNS的时候,觉得他只能完成xxx.highway.com的translation,而不能胜任xxx.lowway.com的工作。因为公司网络建立Domain的时候,使用了highway.com,如果上家ISP将game.lowway.com的DNS请求发过来,我的DNS会不会发蒙啊?
因为这样的话,game.highway.com和game.lowway.com可能会指向同样一台机器。现在想想,这种冲突也算不上是冲突,这样就意味着同一台服务器上的site,可以用两个域名来访问,game.highway.com,game.lowway.com最后都落实到一台计算机上。
只要判断以下HTTP头中的HTTP_HOST就可以了啊
所有的域名都指向同一个IP,然后根据HTTP_HOST的内容判断
是要访问那个网站就可以了,我的服务器就是这么架,一个IP,三个域名运行的很好啊,不知道楼主为什么要那么复杂?
要这样做必须要应用程序具备判断的能力,也就是在编写代码时加入相关的判断。如果不同的域名下运行着不同的程序,那么这是件很麻烦的事情。
而且这样做的话在实现某些功能,或程序做一些逻辑判断时容易导致混乱。
你说的这个方法适用度很低,而且对于后期的维护会有一个隐性问题存在。
实际上搂主的三种方法里最常用的是2、3,2在很多私人服务器上是最常用的。3则一般应用在企业中(服务器集群)。
“不知道楼主为什么要那么复杂?”的原因是你自己的水平问题。学习技术需要虚心,不要看到自己不知道的东西就急于排斥。没人天生就是万事通……
host header name,也就是我说的方法二,老一些的Browser就不行。
另外,一个Web server host多个site,scalability, reliability as well as performance will be a issue if your sites are heavily loaded.
另外,https加密网站在host header name方案上有问题。