Windows2003上的Apache和IIS并排(都监听端口80)
有什么好的方法可以做到这一点?甚至有可能做得干净吗?
理想情况下,我想使用数据包头来确定哪个服务器应处理请求。但是,如果有更简便/更好的方法,请告诉我。
解决方案
我发现以下链接建议具有两个单独的IP地址,以便两个都可以在端口80上侦听:
(编辑:链接不再有效:www.prismix.com/blog/2006/06/running_apache_and_iis_6_toget.cfm)
有一个警告,由于套接字池,我们必须在IIS中进行更改。以下是基于以上链接的说明:
- 从Win2003 CD的支持工具区域中提取httpcfg.exe实用程序。
- 停止所有IIS服务:net stop http / y
- 让IIS仅侦听我为IIS指定的IP地址:httpcfg set iplisten -i 192.168.1.253
- 确保:httpcfg查询iplisten(列出的ip是IIS将侦听的唯一IP地址,没有其他IP地址)
- 重新启动IIS服务:net start w3svc
- 启动Apache服务
我们将需要使用其他IP地址。无论是Apache还是IIS,服务器都会根据IP和Port捕获流量,而这些IP和Port必然会监听这些流量。一旦开始侦听,它将使用标头(例如服务器名称)来过滤并确定正在访问的站点。我们无法做到,只会在请求中更改服务器名称
两个服务器都不可能在相同IP地址的同一端口上侦听:由于单个套接字只能由单个进程打开,因此只有为特定IP /端口组合配置的第一台服务器将成功绑定,而第二台服务器将成功绑定。将失败。
因此,我们将需要一种变通方法来实现所需的目标。最简单的方法可能是在主要IP /端口组合上运行Apache,并使用mod_rewrite将对IIS的请求(应为其他IP和/或者端口配置)路由到它。
请记住,连接到服务器的客户端应该可以访问运行IIS的备用IP和端口:如果只有一个IP地址可用,则应选择一个通常不会被防火墙阻止的IIS端口。 (8080可能是一个不错的选择,或者是443,即使我们运行的是常规HTTP而不是SSL)
P.S.另外,请注意,我们确实需要使用httpcfg修改IIS默认配置,然后它才能允许其他服务器在同一服务器上任何IP地址上的端口80上运行:请参见Micky McQuade的答案以进行此操作...
两个不同的IP地址(如推荐)或者一个Web服务器反向代理另一个(正在监听<> 80的端口)。
例如:Apache在端口80上侦听,IIS在端口8080上侦听。每个http请求首先都到达Apache(当然)。然后,我们可以决定将每个请求转发到特定的(命名的虚拟)域,或者将包含特定目录(例如http://www.example.com/winapp/)的每个请求转发到IIS。
此概念的优势在于,我们只有一台服务器在听公众,而不是两台,与使用两台不同的服务器相比,我们更加灵活。
缺点:有些Web应用程序设计得很糟糕,并且要集成到反向代理基础结构中实在是一件痛苦的事情。正常运行的IIS Webapp依赖于正常工作的Apache,因此我们存在一些相互依赖关系。
我们至少需要mod_proxy和mod_proxy_http都是发行版的一部分(但并非每次都自动构建)。然后我们可以在这里查看:http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
virtualhost上下文中最简单的配置是:
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">
而不是通常每个链接都是绝对的集成梦night:
<a href="http://myinternalhostname/somedir/crappydesign.jpg">
垃圾几乎每次都是坏的!
要重写页面中的链接,请使用mod_proxy_html(不要与mod_proxy_http混淆!),但这是另一个故事,也是一个残酷的故事。