西西河

主题:【原创】浅谈一个Public IP如果提供多个网站服务 -- Highway

共:💬13 🌺11 新:
分页树展主题 · 全看
  • 家园 【原创】浅谈一个Public IP如果提供多个网站服务

    世界上怕就怕“琢磨”二字,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,没有一个做法是包治百病的”,到底应该如何去做,你可能还需要根据你的需要,动动脑筋!!!

    关键词(Tags): #Public#IP#multi-site元宝推荐:四月一日,
    • 家园 不用那么复杂吧???

      只要判断以下HTTP头中的HTTP_HOST就可以了啊

      所有的域名都指向同一个IP,然后根据HTTP_HOST的内容判断

      是要访问那个网站就可以了,我的服务器就是这么架,一个IP,三个域名运行的很好啊,不知道楼主为什么要那么复杂?

      关键词(Tags): #HTTP_HOST
      • 家园 原因吗我简单说了,只有支持HTTP 1.1的Browser才能使用

        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方案上有问题。

      • 家园 你是指让应用程序来判断CGI变量中的HTTP_HOST?

        要这样做必须要应用程序具备判断的能力,也就是在编写代码时加入相关的判断。如果不同的域名下运行着不同的程序,那么这是件很麻烦的事情。

        而且这样做的话在实现某些功能,或程序做一些逻辑判断时容易导致混乱。

        你说的这个方法适用度很低,而且对于后期的维护会有一个隐性问题存在。

        实际上搂主的三种方法里最常用的是2、3,2在很多私人服务器上是最常用的。3则一般应用在企业中(服务器集群)。

        “不知道楼主为什么要那么复杂?”的原因是你自己的水平问题。学习技术需要虚心,不要看到自己不知道的东西就急于排斥。没人天生就是万事通……

    • 家园 正要学习有关Host header name多谢!!!
    • 家园 补充两句

      别太激动,这种做法的局限也是很大的。因为它只能Host一类网站,也就是http://xxx.highway.com,对于其他的网站,譬如http://xxx.lowway.com就无能为力了。

      只要注册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,这样可选的办法就更多了。

      元宝推荐:Highway,
      • 家园 谢谢指正。问题的原因是我当时给别人帮忙的时候,

        就是建立公司内部的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最后都落实到一台计算机上。

    • 家园 精彩,送花

      又帮我补课了,呵呵

    • 家园 推!
    • 家园 叫个好,送朵花!

      应该等到MM们著急上火打电话求助的时候

      再开单人讲座。替你可惜啊!

分页树展主题 · 全看


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河