1. WWW サーバー仮想ホストの原理
WWW サーバー仮想ホストとは、1 台の物理マシンを複数のホスト名の WWW サーバーとして使用することを指します。たとえば、1 台のマシンが http://www.company1.com、http://www.company2.com などの WWW サービスを提供しますが、これらの WWW サイトを閲覧するユーザーは、このように異なるマシンが使用されているとは感じられません。さまざまなサービスを提供する場合の違いは何ですか。
WWW 仮想ホストを使用する利点は、一部の小規模な Web サイトでは、同じ物理マシンを他の Web サイトと共有することでシステムの運用コストを削減し、管理の困難さを軽減できることです。また、個人ユーザーもこの仮想ホスティング方式を利用して独自のドメイン名でWWWサーバーを構築することができ、現在国内の多くの企業がこのサービスを無料で提供しています。
WWW 仮想ホストには 2 つの動作モードがあります:
1.1 IP アドレスに基づく仮想ホスト モード
このモードでは、異なるホスト名が異なる IP アドレスに解決され、仮想これらの IP アドレスが提供されます。ホスト サービス マシンにも設定されます。サーバーは、ユーザーのさらなる処理要求の宛先 IP アドレスに基づいて、ユーザーがどの仮想ホスト サービスを要求しているかを判断します。
欠点: IP アドレスに基づく仮想ホスト方式では、仮想ホスト サービスを提供するマシン上に複数の IP アドレスを設定する必要があるため、IP アドレスが無駄になるだけでなく、1 台のマシンが収容できる仮想ホストの数も制限されます。したがって、この方法はますます使用されなくなりました。ただし、この方法は、初期の HTTP 1.0 プロトコルでサポートされている唯一の仮想ホスト方法です。
1.2 ホスト名ベースの仮想ホスト方式
IP アドレスベースの仮想ホスト方式には上記の欠点があるため、HTTP 1.1 プロトコルではホスト名ベースの仮想ホストのサポートが追加されています。具体的には、クライアント プログラムが WWW サーバーにリクエストを行うとき、クライアントがアクセスしたいホスト名も、リクエスト ヘッダーの「Host:」ステートメントを通じて WWW サーバーに渡されます。たとえば、www.company1.com と www.company2.com はどちらも同じ IP アドレスに対応しており (つまり、同じマシンがこれら 2 つの仮想ドメイン名にサービスを提供します)、クライアント プログラムは http://www にアクセスする必要があります。 .company1.com/index.html、送信されるリクエスト ヘッダーには次の内容が含まれます:
GET /index.html HTTP/1.1
ホスト: www.company1.com
…..
WWW サーバープログラムはこのリクエストを受信すると、「Host:」ステートメントをチェックすることでクライアント プログラムがどの仮想ホスト サービスをリクエストしているかを判断し、さらに処理を続行します。
利点: 仮想ホスト サービスを提供するマシンに IP アドレスが設定されている限り、理論的には無数の仮想ドメイン名にサービスを提供でき、占有リソースが少なく、管理が容易です。現在、この方式は基本的に仮想ホスティング サービスを提供するために使用されます。
欠点: 以前の HTTP 1.0 バージョンでは使用できません。実際、現在使用されているブラウザは基本的にホスト名に基づく仮想ホスト方式をサポートしています。
2. Apache サーバーでの仮想ホスト設定技術
2.1 Apache WWW サーバーの概要
Apache WWW サーバーは、現在、世界で最も広く使用されている WWW サーバー ソフトウェアです。インターネット。柔軟な構成により、必要なほぼすべての機能を実現できます。この記事では主にApache上で各種仮想ホストを設定する方法を紹介します。
2.2 Apache WWW サーバーでの IP アドレスに基づく仮想ホスト設定
この仮想ホスト方式を使用するには、まずサーバー上の各仮想ホストに IP アドレスを設定する必要があります。これらの IP アドレスは、複数のネットワーク カードを追加するか、1 つのネットワーク カードに複数の IP アドレスを設定することによって実現できます。複数の IP アドレスを取得した後、次の 2 つの方法のいずれかを使用して Apache をセットアップできます。
2.2.1 仮想ホストごとに Apache のコピーを 1 つ実行する
この方法では、各 Apache プログラムを次のように実行できます。個別のユーザーなので、各仮想ホストは相互に影響を与えません。この種の仮想ホストを設定する場合、各 Apache に対して設定ファイルを設定するだけで済みます。唯一注意する必要があるのは、「Listen」ステートメントを使用して各 Apache をその上でのみ実行するように強制することです。 「独自の」IP アドレスでサービス要求を受信します。
利点: 各仮想ホストは相互に干渉せず、高いセキュリティを備えています。
欠点: より多くのシステムリソースを消費します。
2.2.2 複数の仮想ホストが同じ Apache を共有する
このように、各仮想ホストは同じ Apache を共有するため、各仮想ホスト間に一定の影響があり、特に CGI プログラムの実行時に、いくつかの重大なセキュリティ問題。设置这种虚拟主机时,只要为每一个虚拟主机设置类似如下的信息即可:
<ccid_code><VirtualHost www.company1.com>; DocumentRoot /home/company1 … </VirrualHost>;</ccid_code> ログイン後にコピー |
优点:占用系统资源比上一种方式少。
缺点:安全性低,每个虚拟主机仍然需要占用一个IP地址。
2.3 Apache WWW服务器下简单的基于名字的虚拟主机设置
这种方式下,各个虚拟主机共享同一份Apache,因此有CGI程序运行时,安全性也不高。设置这种虚拟主机时,只要为每一个虚拟主机设置类似如下的信息即可
<ccid_code>NameVirtualHost 111.222.33.44 ; 在这个IP地址接收虚拟主机的服务 <VirtualHost 111.222.33.44>; ServerName www.company1.com DocumentRoot /www/company1 </VirtualHost>; <VirtualHost 111.222.33.44>; ServerName www.company2.com DocumentRoot /www/company2 </VirtualHost>;</ccid_code> ログイン後にコピー |
优点:只要一个IP地址就可以提供大量的虚拟主机服务。
缺点:安全性差。维护这些虚拟主机时需要更改配置文件,并且需要重新启动Apache进程才能起作用。因此不适合进行大规模的虚拟主机服务。
2.4 Apache WWW服务器下基于名字的大规模虚拟主机设置
所谓大规模虚拟主机,是指能够提供非常多的虚拟主机服务,比如能提供超过数十万个域名的虚拟主机服务。如果使用以上讨论的方法,是很难完成的。实现这种服务的一种方式是利用Apache 功能强大的URL重写功能。下面以一个实例来说明这种方式。
2.4.1 Apache中URL重写功能
Apache 1.2及以后版本都有URL重写(Rewrite)功能。简单的说,URL重写功能就是在Apache接收到请求后,在处理的过程中能根据预先设定的规则,对请求中的URL进行修改。这些规则主要由正规表达式组成。重写依赖于输入的URL、各种服务器端环境变量、HTTP请求头中的内容、时间,甚至可以通过外部的程序来使用数据库中的信息来帮助重写。
URL重写功能非常强大,通过URL重写,可以使Apache完成异常复杂的功能。当然,URL重写功能本身也比较复杂,关于URL重写功能的详细说明可以参看Apache 的随机文档。
2.4.2 使用Apache中URL重写功能实现基于名字的大规模虚拟主机设置
假设机器www.home.com提供名字形如abcde.home.com、hijk.home.com等的大规模虚拟主机服务。其中虚拟主机名必须是字母或数字,并且长度至少为3。为了防止一个目录下文件或子目录太多而对性能产生很大的负面影响,对用户的目录按照名字进行分级划分,如虚拟主机abcde.home.com的相关文件存放在目录/member/ab/de/abcde下面。其中“ab”、“de”分别是“abcde”的前边两个字符和最后两个字符。当用户请求http://abcde.home.com时,系统应该返回/member/ab/de/abcde下面的文件。
下面是为了完成这种功能需要进行的设置
1. 对域名服务器的设置
假设www.home.com的IP地址为202.103.190.57,在域名服务器DNS的home.com数据文件中增加一行:
--------------------------------------------------------------------
* IN A 202.103.190.57
--------------------------------------------------------------------
这样,所有 *.home.com的IP地址都会被解析为202.103.190.57,就没有必要为各个虚拟主机分别进行设置。
2. 对Apache的设置
首先使用命令“httpd -l”检查mod_rewrite模块是否已经编译到Apache中,如果没有,重新编译Apache。
然后在Apache的配置文件httpd.conf中增加如下语句(其中以“#”开头的为注释):
-----------------------------------------------------------------------
#禁止使用机器的正式名
UseCanonicalName off
#使能重写功能
RewriteEngine on
RewriteMap lowercase int:tolower
# 为安全考虑,对CGI程序不进行重写
RewriteCond %{REQUEST_URI} !^/cgi-bin/
# 对www.home.com不重写,其他的重写
RewriteCond ${lowercase:%{HTTP_HOST}} !^www\.home\.com(\.*)$
RewriteCond ${lowercase:%{HTTP_HOST}} ^[a-z0-9-]+\.home\.com(\.*)$
# 首先把机器名改为小写,添加到请求的文件路径前,并继续处理
RewriteRule ^(.+) ${lowercase:%{HTTP_HOST}}$1 [C]
# 重写请求
RewriteRule ^([a-z0-9])([a-z0-9])([a-z0-9])\.home\.com([\.]*)/(.*) /member/$1$2/$2$3/$1$2$3/$5
RewriteRule ^([a-z0-9])([a-z0-9])([a-z0-9]*)([a-z0-9])([a-z0-9])\.home\.com([\.]*)/(.*) /member/$1$2/$4$5/$1$2$3$4$5/$7
-------------------------------------------------------------------------
优点:只要一个IP地址就可以提供大量的虚拟主机服务,维护方便。
缺点:安全性低。上例为了增强安全性,禁止运行用户自己的CGI程序。
2.5 Apache WWW服务器下的重定向虚拟主机设置
重定向虚拟主机是指仅仅提供重定向功能,而不实际存放用户主页数据的虚拟主机。比如,某站点有多个镜像服务器,假设为www1.user.com、www2.user.com,…wwwn.user.com。这些服务器放在不同的网络上,分布于各地的客户访问这些服务器的速度也互不相同。而站点www.home.com通过虚拟域名user.home.com为这些镜像的服务器提供虚拟主机服务。当客户访问http://user.home.com时,www.home.com根据用户的IP地址、收集到的网络拓扑结构信息,把客户重定向到对该客户来说访问速度最快的站点。
重定向虚拟主机服务也可以通过使用URL重写功能来完成。这里仅给出简单的重写规则:
-------------------------------------------------------------------------
RewriteRule ^([a-z0-9]+)\.home\.com([\.]*)/(.*) /www/cgi-bin/nph-redirect.cgi/$1/$3 [T=application/x-httpd-cgi,L]
-------------------------------------------------------------------------
其中,nph-redirect.cgi为一个CGI程序,为了实现自动重定向,它需要产生完整的HTTP 应答头信息。该程序通过环境变量PATH_INFO得到用户请求的URL,通过环境变量REMOTE_ADDR得到用户的IP地址,并根据网络拓扑情况生成重定向信息,返回给客户。
参考文献:
1.Apache 1.3 User's Guide http://www.apache.org
Virtual Hosting Setup Using Apache
Abstract:
There are two types of WWW Virtual Hosting, IP-based and Name-based. Those two types are introduced in this thesis, followed by some methods about WWW Virtual Hosting configuration under Apache and the difference between them is analyzed.