Windows 2003 上的 Apache 和 IIS 并排(都侦听端口 80)

Posted

技术标签:

【中文标题】Windows 2003 上的 Apache 和 IIS 并排(都侦听端口 80)【英文标题】:Apache and IIS side by side (both listening to port 80) on windows2003 【发布时间】:2010-09-11 14:59:42 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

您能否详细说明您将如何让 Apache 路由请求?另外,Apache 应该是主服务器是有原因的还是只是偏好? 将 Apache 设为主要的原因是它具有 mod_rewrite。 (IIS 也存在类似的解决方案,但没有那么灵活。)要让 Apache 路由请求,您需要在其上定义一个文件夹(可以是虚拟主机根目录),并在 .htaccess 或 httpd.conf 对于未来的读者,mod_rewrite 不是解决这个问题的好方法,因为它只处理 URL,而适当的代理处理所有其他事情。 @Walf 也许我是短视的,但我不明白你会如何以与 URL 无关的方式做到这一点。如果某些 URL 由 Apache 处理,而其他 URL 由 IIS 处理,所有请求都来自同一个 IP:port,那么在不处理 URL 的情况下如何区分它们? @AaronLS 见my answer。这不是与 URL 无关的解决方案,它只是不适合这项工作的工具。【参考方案2】:

我发现 this post 建议有两个独立的 IP 地址,以便两者都可以侦听端口 80。

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

    从 Win2003 CD 上的支持工具区域中提取 httpcfg.exe 实用程序。 停止所有 IIS 服务:net stop http /y 让 IIS 只监听我为 IIS 指定的 IP 地址:httpcfg set iplisten -i 192.168.1.253 确保:httpcfg query iplisten(列出的 IP 是 IIS 将侦听的唯一 IP 地址,没有其他地址。) 重启 IIS 服务:net start w3svc 启动 Apache 服务

【讨论】:

这完全正确;几个月前我不得不这样做以解决完全相同的问题。如果使用两个 IP 地址是可以接受的,这是一个非常简单且可靠的解决方案。 仅供参考,对于 Windows 2008,有一篇不同的文章解释了如何操作。 weblogs.asp.net/steveschofield/archive/2007/07/06/… 谢谢,它对我有帮助,但net stop /y 也停止了打印后台处理程序,所以稍后需要net start spooler @MickyMcQuade 你介意看看我的相关问题吗? serverfault.com/questions/620805/…【参考方案3】:

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

在 Apache 中,启用 mod_proxymod_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 中包含其端口号,包括标头。

【讨论】:

【参考方案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 混淆!)但这是另一个故事,也是一个残酷的故事。

【讨论】:

请将此合并到您的其他答案中:)【参考方案5】:

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

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

这种概念的优势在于您只有一台服务器而不是两台服务器来监听公众,您可以更灵活地使用两台不同的服务器。

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

【讨论】:

根据我的研究,我正在考虑反向代理方案。你能详细说明你是如何设置的吗?你用过 Apache mod_Proxy 吗?我的两个应用程序不相互依赖,这是一个优点 - 还有一些我应该注意的问题吗?【参考方案6】:

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

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

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

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

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

这听起来很啰嗦,但实际上玩了 5 分钟。完美运行。

系统: Windows 8、IIS 8、Apache 2.2

【讨论】:

我认为@thedeeno 试图避免与使用非默认端口相关的问题。【参考方案7】:

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

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

听 80

听 127.0.0.1:80

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

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

【讨论】:

哇。我真的打字太慢了,当我打字的时候,5个人给出了大致相同的答案。 哈哈,他们都去哪儿了?

以上是关于Windows 2003 上的 Apache 和 IIS 并排(都侦听端口 80)的主要内容,如果未能解决你的问题,请参考以下文章

windows2003下装的apache,但是现在httpd.exe给禁止启动了,怎么开启?

在windows server 2003 中用Apache如何配置多个站点呢?请说的详细点,谢谢

php在Windows2003下的IIS配置php5.4

x64 Windows Server 2003 上的远程调试

Windows Server 2003 上的 Log4Net

Windows 7 XP 模式和 Visual Studio 2003