如何在 Windows 2008 上为不同平台上的应用程序 运行 共享端口 80
How to share port 80 for applications running on different platforms on Windows 2008
我有一个 Apache Tomcat,它在 Windows Server 2008 R2 Standard 上 运行,并托管一个网站 (www.domain1.com)。 Apache 当前正在侦听服务器上的端口 80。现在,在同一台服务器上,我想托管一个用 .NET (www.domain2.com) 编写的 Http 服务器应用程序,它将 运行 作为 Windows 服务。我还希望通过端口 80.
以 www.domain2.com 访问 Http 服务器
所以我需要的只是。
Request Forward To
1. http://www.domain1.com/[anything] http://localhost:8080/app1/[anything] <-- tomcat
2. http://www.domain2.com/[anything] http://localhost:8000/[anything] <-- windows service
我尝试使用以下 netsh 配置,但没有帮助。
netsh interface portproxy add v4tov4 listenport=80 listenaddress=www.domain1.com connectport=8080 connectaddress=127.0.0.1 protocol=tcp
netsh interface portproxy add v4tov4 listenport=80 listenaddress=www.domain2.com connectport=8000 connectaddress=127.0.0.1 protocol=tcp
当我从本地计算机检查 telnet localhost 80
或从远程计算机检查 telnet www.domain1.com 80
时,它没有连接。
我愿意接受任何涉及 netsh、IIS、Tomcat 或任何其他第三方工具的端口转发解决方案来实现我的目标。
解决方案
按照 Carlos 的建议,以下配置有效
- 在 IIS 上安装 UrlRewrite
- 在 IIS 上安装 ARR
- IIS 主页 -> IIS -> 应用程序请求路由缓存 -> 服务器代理设置 -> 勾选启用代理
- 创建一个没有绑定主机名的默认网站侦听端口 80
- 将下面添加到默认网站web.config
-
<system.webServer>
<rewrite>
<rules>
<rule name="forward domain1 to tomcat">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="domain1.com" />
</conditions>
<action type="Rewrite" url="http://localhost:8080/app1/{R:1}" />
</rule>
<rule name="forward domain2 to windows service">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="domain2.com" />
</conditions>
<action type="Rewrite" url="http://localhost:8000/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
一些建议:
- 在端口 80 中配置 IIS 以使用端口 80 的主机名。默认网站安装设置了端口 80 的绑定,没有任何主机名,这意味着它将设置和 http.sys 注册以侦听全部。如果你只是在那里设置一个主机名,那么它会让你在其他程序中使用它,比如 .net。
- 在您的 .net 应用程序中(假设您使用的是构建在 http.sys 之上的 HttpListener),那么您可以确保使用带有主机名的绑定(前缀)(它可以如果需要,甚至是本地主机),这将使它工作并且对通过 http.sys.
在端口 80 监听的其他人很好
- 最后,对于您的非 http.sys-nice-player,例如其他 http 服务器等,您可以安装应用程序请求路由 (http://www.iis.net/downloads/microsoft/application-request-routing),它可以让您配置规则以将流量代理到其他端口或(如果需要,甚至其他机器)。所以您可以在 ARR 中添加规则来进行映射和路由。
我有一个 Apache Tomcat,它在 Windows Server 2008 R2 Standard 上 运行,并托管一个网站 (www.domain1.com)。 Apache 当前正在侦听服务器上的端口 80。现在,在同一台服务器上,我想托管一个用 .NET (www.domain2.com) 编写的 Http 服务器应用程序,它将 运行 作为 Windows 服务。我还希望通过端口 80.
以 www.domain2.com 访问 Http 服务器所以我需要的只是。
Request Forward To
1. http://www.domain1.com/[anything] http://localhost:8080/app1/[anything] <-- tomcat
2. http://www.domain2.com/[anything] http://localhost:8000/[anything] <-- windows service
我尝试使用以下 netsh 配置,但没有帮助。
netsh interface portproxy add v4tov4 listenport=80 listenaddress=www.domain1.com connectport=8080 connectaddress=127.0.0.1 protocol=tcp
netsh interface portproxy add v4tov4 listenport=80 listenaddress=www.domain2.com connectport=8000 connectaddress=127.0.0.1 protocol=tcp
当我从本地计算机检查 telnet localhost 80
或从远程计算机检查 telnet www.domain1.com 80
时,它没有连接。
我愿意接受任何涉及 netsh、IIS、Tomcat 或任何其他第三方工具的端口转发解决方案来实现我的目标。
解决方案
按照 Carlos 的建议,以下配置有效
- 在 IIS 上安装 UrlRewrite
- 在 IIS 上安装 ARR
- IIS 主页 -> IIS -> 应用程序请求路由缓存 -> 服务器代理设置 -> 勾选启用代理
- 创建一个没有绑定主机名的默认网站侦听端口 80
- 将下面添加到默认网站web.config
-
<system.webServer>
<rewrite>
<rules>
<rule name="forward domain1 to tomcat">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="domain1.com" />
</conditions>
<action type="Rewrite" url="http://localhost:8080/app1/{R:1}" />
</rule>
<rule name="forward domain2 to windows service">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="domain2.com" />
</conditions>
<action type="Rewrite" url="http://localhost:8000/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
一些建议:
- 在端口 80 中配置 IIS 以使用端口 80 的主机名。默认网站安装设置了端口 80 的绑定,没有任何主机名,这意味着它将设置和 http.sys 注册以侦听全部。如果你只是在那里设置一个主机名,那么它会让你在其他程序中使用它,比如 .net。
- 在您的 .net 应用程序中(假设您使用的是构建在 http.sys 之上的 HttpListener),那么您可以确保使用带有主机名的绑定(前缀)(它可以如果需要,甚至是本地主机),这将使它工作并且对通过 http.sys. 在端口 80 监听的其他人很好
- 最后,对于您的非 http.sys-nice-player,例如其他 http 服务器等,您可以安装应用程序请求路由 (http://www.iis.net/downloads/microsoft/application-request-routing),它可以让您配置规则以将流量代理到其他端口或(如果需要,甚至其他机器)。所以您可以在 ARR 中添加规则来进行映射和路由。