我在局域网中有一个 IIS 机器,位于一台暴露在互联网上的 Apache 机器后面。我设置了一个简单的代理,目的是将流量直接从 Apache 机器传递到 IIS 机器。
<VirtualHost *:80>
ServerName <domain>.<tld>
ProxyPass / http://192.168.1.7:8080/
ProxyPassReverse / http://192.168.1.7:8080/
ProxyPreserveHost On
ProxyAddHeaders On
RequestHeader set X-Forwarded-Proto "http"
</VirtualHost>
当 IIS 实例只包含默认页面时,此方法以前是有效的。
安装网站后,我可以通过浏览 来从另一台联网机器访问该网站http://192.168.1.7:8080
。这表明该网站可以正常工作,并且存在适当的防火墙条目并处于活动状态。
但是,尝试通过 URL 从外部访问该网站会导致 503 Unavailable 错误。此错误由 Apache 而不是 IIS 引发 - 而且,查看 IIS 日志,我看不到对 IIS 计算机发出任何请求。
我有另一个邮件服务器的转发设置,它运行正常。此外,我将端口 8080 上的 IIS 服务器公开到互联网,并且能够通过附加端口的 URL 访问它:8080
- 证明绑定有效。
从 Apache 计算机 ping IIS 计算机成功。我可以通过 RDP 连接到 IIS 计算机。我读过的每一份指南都告诉我,我所设置的应该可以正常工作。
我唯一能想到的是 Apache 以某种方式更改了标头 - 但是,我已注释掉该RequestHeader
值,并且没有看到行为有任何差异。我做错了什么?
答案1
事实证明,在组建 IIS 站点之前在 Apache 中创建虚拟主机对我来说是不利的。
我的配置依赖于覆盖整个域的证书,其中包括 IIS 计算机要在其上运行的子域。我使用 LetsEncrypt 实现了这一点 - 它创建了一个分离中的配置文件sites-avaiable
。尽管原始配置文件中有一个非 SSL 站点的条目,但替换配置文件中存在的条目,加上现代软件默认使用 HTTPS 的趋势,足以将每个请求发送到 SSL URL - 尽管这并未在 IIS 中绑定,因为我尚未创建证书。
解决方案是向 SSL vhost 添加以下配置条目:
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
这会阻止 Apache 检查目标服务器上的证书是否有效,从而允许我使用自签名证书。这不会影响站点的外部安全性,因为 Apache 仍从其自己的存储中提供 LetsEncrypt 证书。但是,它确实允许我现在创建一个有效且正确的新证书 - 这在目标服务器位于互联网上其他地方的情况下非常重要。由于目标计算机位于本地网络上,所以这不是问题。