如何管理多个站点
客户端请求的URL格式为:http://DNS:Port/......
经过很多中间过程,当该URL请求发送到Apache服务器时,Apache将转换为具体的“本机”路径。这是Apache的第一个基本功能:地址变换。
对于URL而言,每个必须指定 DNS+Port。
而对于Apache而言,内部通过<VirtualHost>其实又为每个DNS+Port组合对应了一个“本机”目录。
<VirtualHost *:8087> <IP : 端口>
ServerAdmin webmaster@G2.home
DocumentRoot "F:/Apache/docs" <本机路径>
ServerName G2.home <DNS>
ServerAlias www.G2.home
</VirtualHost>
将会形成如下对应数据表:
| IP | Port | DNS | 本机路径 |
A | 192.168.0.1 | 80 | W1 | /D1 |
B | 192.168.0.2 | 8087 | W2 | /D2 |
C | 192.168.0.1 | 8087 | Wx | /Dx |
D | 192.168.0.1 | 80 | Wy | /Dy |
这里有几点要注意:
l 如果没有指定port,那么表示缺省的80。无论是请求的URL还是<VirtualHost>中指定的值。
l 如果<VirtualHost>指定 *,那么查询时,对IP而言是匹配,对port而言则为80。
l IP的用处主要是为了多IP的情况。
那么,查询该表即可知道URL对应的实际地址,存在如下三种情况:
l 如果通过IP可以识别最好;这就是多IP方案;
l 不行的话基本上通过一个IP+Port就可以知道URL;这就是单IP多端口方案;
l 如果IP+Port还存在重复的可能,那就就要结合DNS来使用;这就是虚拟主机名方案。
最浪费方式 - 多IP方式
一个Apache服务器可以对应多个IP,通过多个网卡或者一个网卡添加多个IP地址来实现。这样为每个域名对应一个IP即可。Eg:
<VirtualHost 192.168.0.1> ServerAdmin xxx@xxx.com DocumentRoot D:/S1 ServerName s1.com </VirtualHost>
<VirtualHost 192.168.0.2> ServerAdmin xxx@xxx.com DocumentRoot D:/S2 ServerName s2.com </VirtualHost>
| IP多,Server配置多,Client访问简单,不需端口。
每个域名就是一个独立的IP+port,可以直接找到本机文件路径
可通过IP访问,域名随便填写,但是必须要有:
或通过域名访问,此时还是在Dsn服务器端将域名解析添加进来。局域网内部还可以通过机器名
eg: A + B
|
最节省方式:一个IP多个端口
增加监听: Listen 80 Listen 81
<VirtualHost *> ServerAdmin xxx@xxx.com DocumentRoot D:/S1 ServerName s1 </VirtualHost>
<VirtualHost *:81> ServerAdmin xxx@xxx.com DocumentRoot D:/S2 ServerName s2 </VirtualHost>
| Server简单一个IP;Client略显臃肿,需要在Url后面添加端口
每个域名是同一个IP的不同port,也可以直接找到本机文件路径。但是一定要利用listen使用指令来对用到的端口进行监听
如果当前IP为:192.168.01,最后通过如下访问: http://192.168.0.1/ http://192.168.0.1:81/
eg: A + C
|
最优惠方式:同一IP多个域名
同一IP可能存在多个 NameVirtualHost *
<VirtualHost *> ServerAdmin xxx@xxx.com DocumentRoot D:/S1 ServerName s1.com </VirtualHost>
<VirtualHost *> ServerAdmin xxx@xxx.com DocumentRoot D:/S2 ServerName s2.com </VirtualHost>
| 访问最简单,服务器配置最简单,域名即可
多个域名对应同一个IP和端口,存在冲突;此时必须用NameVirtualHost指令,对指定IP再根据域名来进行二级识别
如果当前IP为:192.168.01
最后通过如下访问: http://s1.com/ http://s2.com /
eg: A+D
|
注意:上述只是简单的示意了站点,真正每个站点要发布,还要处理很多目录的访问权限。有时必须访问权限指定后才能进行访问。
Ø 如何管理多个目录
对于一个站点,其对应着本机文件系统中的一个实际目录;所以可以把站点也看作一个树状目录形式。我们将站点简称为站点根目录,对应的文件系统目录简称为文件主目录。
二者有很多相同:因为此时文件主目录中的子目录在站点根目录中也以子目录形式对应出现。
不过二者也有很多不同,这是因为站点根目录中可以将这种子目录的同步关系改变。有几种方式:
l 文件主目录中的子目录可以在站点根目录中被改向指向其余地方;这就是重定向Redirect。
l 实际在文件主目录中之外的文件系统目录也可以出现在站点根目录中,此时目录叫做虚拟目录;这就是别名Alias。
l 甚至非本机文件系统中的子目录也可能以目录形式出现在站点根目录中;这就是反向代理ProxyPass。
以上三种方式各有用途,区别如下:
| 示例 | 说明 |
重定向 Redirect | 转向另一个域 Redirect temp /foo http://www.a.com/b
转向另一个本机目录 Redirect temp /foo/ /temp/
| l Client申请的URL访问指定站点的某个子目录;可让它实际转到本机或域的某个目录。 l 对于站点目录进行移动修改,而客户端的URL没有同步更新可能会用到 l 对于系统正在升级等维护过程中,可以将访问转向指定提示信息夜面 |
别名 Alias | Alias /docs D:/Web2/web 类似IIS的虚拟目录 Alias /ucenter "F:/UCenter" | 将不在文件主目录中的本机文件的另一个目录放入到站点根目录访问
即可使用 http://localhost/ucenter 访问 注意:设置虚拟目录的,大小写不能错;而实际目录的,大小写没问题 |
反向代理 ProxyPass | ProxyPass /foo/ http://internal /bar/ ProxyPassReverse /foo/ http://internal/bar/ | l 将另一个域内的子目录作为当前站点子目录发布以供访问 l 多半apache服务器有两个网卡,同时连通内网和外网。这样可以将内网的信息发布,但是内网的信息不会暴露。 |
1. 代理和反向代理区别 l 代理服务器通常有两个网卡同时连通内外网。 l 代理多半是内网客户端通过代理服务器来访问外网;此时内网客户端要手动设置代理服务器。 l 反向代理则多是外网用户通过代理服务器访问到了内网的信息;但对客户端而言,他感觉不到信息是来自内网通过代理服务器中转,而以为直接就在代理服务器上 2. 重定向和反向代理区别 l 客户端都是相同的URL地址发送请求,apache接收请求,处理并返回结果供客户端展现 l 重定向在转向别的地址后,客户端的地址栏会显示改写原来的URL为实际转向的URL; l 反向代理返回后地址栏的URL并没有改变,还是先前的URL l 对于重定向的URL,客户端也可以直接在地址栏访问 l 对于反向代理实际处理的地址,客户端是没有权限访问的;因为在内网上;而且该地址对用户不可见 3. 别名和反向代理 l 别名使得客户可以访问不在文件主目录中的实际本地文件目录 l 反向代理使得客户可以访问不在外网域内的内网机器数据 l 别名访问是直接访问实际目录 l 反向代理是访问是经过了二次访问。先从内网取数据到代理服务器,再从代理服务器发送数据到客户。因此apache代理服务器实际上还是可以做缓存加速内容过滤功能的
4. 反向代理的硬件环境部署 要进行发布,一定要有apche之类的Web服务器。 通常反向代理进行站点发布。内网的信息通常也要发布;这时内网服务器上要有Apache服务器。代理服务器上也要有Apache。
5. 反向代理的apache部署 必须开放如下DSO LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so |