我这里有 4 台服务器,每台都运行 Win2008r2-WEB 作为 Web 服务器,并且都运行着不同类型的服务器(TomCat、IIS、Apache、ZendServer),每台服务器还有不同的 IP 地址(10.0.0.0/24)
有没有办法根据主机名将流量路由到每个服务器?(例如:apache.domain.org,iis.domain.org,tomcat.domain.org,zend.domain.org)
显然,我无法将 A 记录更改为内部 IP,并且我无权更改端口。
此外由于代理的原因,我不能使用其他端口,我只能访问:80 传入。
答案1
为了使其正常工作,您需要将现有 Web 服务器之一(或专用于该任务的单独服务器)配置为反向代理。
它将负责获取公共地址上的请求并读取主机头,然后根据请求的主机将请求代理到适当的私有地址。
执行此任务的流行软件包是 Apache(您可以使用现有实例)、nginx 或 HAProxy。这里有很多关于如何正确配置这些软件包的信息(“反向代理“是可以带您到达那里的搜索词),但如果您心中有特定的某个软件包,那么我可以用示例配置来编辑这个答案。
编辑:Apache 配置示例:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName apache.domain.org
ServerAlias www.apache.domain.org
# For this one, we'll imagine that you want to serve these resources from
# the local server. If you want do use a separate Apache instance instead,
# then copy one of the other hosts for this one.
DocumentRoot "C:\path\to\site\files"
<Directory "C:\path\to\site\files">
Order allow,deny
Allow from all
</Directory>
# Any other directives you need for the content here
</VirtualHost>
<VirtualHost *:80>
ServerName iis.domain.org
ServerAlias www.iis.domain.org
# Replace the URL below with the URL of the IIS server - make sure
# to keep the trailing slash.
ProxyPass / http://10.x.x.1:80/
ProxyPassReverse / http://10.x.x.1:80/
</VirtualHost>
<VirtualHost *:80>
ServerName tomcat.domain.org
ServerAlias www.tomcat.domain.org
# Replace the URL below with the URL of the Tomcat server - make sure
# to keep the trailing slash.
ProxyPass / http://10.x.x.2:8080/
ProxyPassReverse / http://10.x.x.2:8080/
</VirtualHost>
答案2
为什么基于名称的虚拟主机不是一种选择?有什么原因吗?
http://httpd.apache.org/docs/2.0/vhosts/name-based.html
10.x 地址是内部地址,正如您所提到的,DNS 对此无能为力。所有服务器是否都响应相同的外部 IP 地址?(然后您可以在 DNS 中为每个子域创建 A 记录,每个记录都指向相同的 IP...或者更好的是,使用 CNAMES。)
答案3
至少在 IIS 中,您可以使用主机标头根据 DNS 名称检测哪个网站应该响应。因此,如果您希望 IIS 站点 1 响应诸如“testsite1.com 和 www.testsite1.com”之类的站点,只需将这些站点添加到该给定 IIS 站点的主机标头中即可。然后在第二个 iis 站点上,您可以分配“testsite2.com 和 www.testsite2.com”,IIS 将拾取这些域。就主机标头而言,DNS 就 A 和 CNAME 而言无关紧要。IIS 可以同时使用这两种方式。
通常我们对 IIS 所做的是,为服务器名称本身创建一个 A 记录,然后使用 CNAME 转发到服务器名称 A 记录。
因此 Web 服务器 A = 10.10.10.10 testsite1.com CNAME = web 服务器 testsite2.com CNAME = web 服务器
然后 IIS 将根据 DNS 名称知道将站点发送到哪里。