46

有什么好的方法可以做到这一点?甚至可以干净地做吗?

理想情况下,我想使用数据包头来决定哪个服务器应该处理请求。但是,如果有更简单/更好的方法,请告诉我。

4

9 回答 9

33

两台服务器不可能在同一个 IP 地址上监听同一个端口:由于单个套接字只能由单个进程打开,因此只有为某个 IP/端口组合配置的第一个服务器会成功绑定,而第二个服务器将失败。

因此,您将需要一种解决方法来实现您想要的。最简单的可能是在您的主要 IP/端口组合上运行 Apache,并使用mod_rewrite将 IIS 的请求(应配置为不同的 IP 和/或端口)路由到它。

请记住,运行 IIS 的备用 IP 和端口应该可以被连接到服务器的客户端访问:如果您只有一个可用的 IP 地址,则应注意选择通常不会被防火墙阻止的 IIS 端口(8080 可能是一个不错的选择,或者 443,即使您运行的是常规 HTTP 而不是 SSL)

PS 另外,请注意,在允许其他服务器在同一服务器上的任何 IP 地址上的端口 80 上运行之前,您确实需要使用 httpcfg 修改 IIS 默认配置:请参阅 Micky McQuade 的答案以了解执行该操作的过程...

于 2008-09-20T15:06:38.177 回答
29

我发现这篇文章建议有两个独立的 IP 地址,以便两者都可以监听端口 80。

有一点需要注意,由于套接字池,您必须在 IIS 中进行更改。以下是基于上述链接的说明:

  1. httpcfg.exe从 Win2003 CD 上的支持工具区域提取该实用程序。
  2. 停止所有 IIS 服务:net stop http /y
  3. 让 IIS 仅侦听我为 IIS 指定的 IP 地址:httpcfg set iplisten -i 192.168.1.253
  4. 确保:(httpcfg query iplisten列出的 IP 是 IIS 将监听的唯一 IP 地址,没有其他 IP 地址。)
  5. 重新启动 IIS 服务:net start w3svc
  6. 启动 Apache 服务
于 2008-09-20T14:59:33.530 回答
13

对于在一台服务器上只有一个 IP 地址多个站点的人,您可以将 IIS 配置为侦听除 之外的端口80,例如8080通过在其每个站点的属性中设置 TCP 端口(包括默认端口)。

在 Apache 中,启用mod_proxyand mod_proxy_http,然后添加一个包罗万象的 VirtualHost(在所有其他主机之后),以便 Apache 不明确处理的请求被“转发”到 IIS。

<VirtualHost *:80>
    ServerName foo.bar
    ServerAlias *
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8080/
</VirtualHost>

现在,您可以让 Apache 为某些站点提供服务,而 IIS 为其他站点提供服务,而对用户来说没有明显的区别。

编辑:您的 IIS 站点不得在其响应中的任何 URL 中包含其端口号,包括标头。

于 2012-01-04T03:15:47.617 回答
4

您至少需要 mod_proxy 和 mod_proxy_http 两者都是发行版的一部分(但不是每次都自动构建)。然后你可以看这里:http ://httpd.apache.org/docs/2.2/mod/mod_proxy.html

虚拟主机上下文中最简单的配置是:

ProxyPass         /winapp http://127.0.0.1:8080/somedir/

ProxyPassReverse  /winapp http://127.0.0.1:8080/somedir/

(根据您的 webapp,实际配置可能会变得更加复杂。)这会透明地将路径 winapp/ 上的每个请求重定向到 windows 服务器,并将结果输出传输回客户端。

注意:注意交付页面中的链接:它们不会被重写,因此如果您通常在应用程序中使用相对链接,则可以省去很多麻烦,例如

<a href=../pics/mypic.jpg">

而不是每个链接都是绝对的通常的集成噩梦:

<a href="http://myinternalhostname/somedir/crappydesign.jpg">

后者几乎每次都很糟糕!

对于重写页面中的链接,有 mod_proxy_html(不要与 mod_proxy_http 混淆!)但这是另一个故事,也是一个残酷的故事。

于 2008-09-23T14:44:35.443 回答
3

两个不同的 IP 地址(如推荐)或一个 Web 服务器正在反向代理另一个(正在侦听端口 <>80)。

例如:Apache 监听 80 端口,IIS 监听 8080 端口。每个 http 请求都首先到达 Apache(当然)。然后,您可以决定将每个请求转发到特定(命名的虚拟)域或将包含特定目录(例如http://www.example.com/winapp/)的每个请求转发到 IIS。

这个概念的优点是您只有一台服务器而不是两台服务器来监听公众,您更灵活,因为使用两台不同的服务器。

缺点:一些 web 应用程序设计糟糕,集成到反向代理基础设施中真的很痛苦。一个工作的 IIS webapp 依赖于一个工作的 Apache,所以我们有一些相互依赖。

于 2008-09-22T14:42:21.557 回答
0

我看到这是一篇相当老的帖子,但在寻找这个问题的答案时遇到了这个问题。在阅读了一些答案后,他们似乎很啰嗦,所以大约 5 分钟后,我设法非常简单地解决了这个问题,如下所示:

Apache 的 httpd.conf 将监听端口保留为 80,将“服务器名称”保留为 FQDN/IP :80。

现在对于 IIS,转到左侧导航下拉菜单中的管理服务 > IIS 管理器 > '站点' > 在右侧窗口中选择顶行(默认网站),然后在右侧绑定。

现在选择 http > edit 并更改为 81 并输入服务器/pc 的本地 IP,并在域中输入您的 FQDN (www.domain.com) 或关闭外部 IP。

重新启动两台服务器,确保您的端口在路由器和防火墙上都打开,完成。

这听起来很冗长,但实际上花了 5 分钟的时间。完美运行。

系统:Windows 8、IIS 8、Apache 2.2

于 2013-06-14T08:51:12.953 回答
0

安装 Windows 10 我遇到了这个问题:apache(ipv4) 和 spooler service(ipv6) 监听同一个 80 端口。

我解决了编辑 apache httpd.conf 文件更改行

听 80

听 127.0.0.1:80

于 2015-08-07T15:48:23.800 回答
0

这并不完全正确。例如,对于 HTTP,Windows 支持基于 URL 的端口共享,允许多个进程使用相同的 IP 地址和端口。

于 2015-08-12T12:58:36.800 回答
-1

您将需要使用不同的 IP 地址。服务器,无论是 Apache 还是 IIS,都会根据 IP 和端口来获取流量,这些都是它们必须监听的。一旦它开始侦听,它就会使用标头(例如服务器名称)来过滤和确定正在访问的站点。您不能这样做,只需更改请求中的服务器名称

于 2008-09-20T15:01:58.920 回答