Nexus Repository OSS 反向代理

Nexus Repository OSS 反向代理

我有一台在 上运行 Nexus Repository OSS 的 Windows Server 2012-R2 服务器localhost:8081。我在 IIS 中使用以下规则配置了反向代理:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="ReverseProxyInboundRule1" stopProcessing="true">
                    <match url="(.*)" />
                    <action type="Rewrite" url="http://localhost:8081/{R:1}" />
                </rule>
            </rules>
            <outboundRules>
                <preConditions>
                    <preCondition name="ResponseIsHtml1">
                        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
                    </preCondition>
                </preConditions>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration>

当我从另一个系统访问该网站并导航到 nexus.mycompany.com 时,我可以看到代理正在工作……大部分。所有依赖的 css、js 等都是localhost:8081远程机器无法解析的。

我尝试添加一条出站规则,希望它能够解决问题,但没有成功。

 <rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1">
                        <match filterByTags="A, Form, Img" pattern="^http(s)?://localhost:8081/(.*)" />
                        <action type="Rewrite" value="http{R:1}://nexus.mycompany.com/{R:2}" />
 </rule>

看看文档,我尝试设置基本 URL。它描述的按钮不在 GUI 中。我找到了一篇 Stack Overflow 文章,解释说它已被移至功能部分。我通过功能添加了基本 URL,但仍然不起作用。

每次更改后我都重新启动了 Windows 服务。

我想要做的是通过主机名访问存储库并使其正确加载。我是否遗漏了某些明显的东西?使用完整 URL 而不是相对 URL 还有其他原因吗?

答案1

在反向代理设置中,Nexus 会查找各种X-Forwarded-*HTTP 标头的存在情况,以确定其基本 URL。只要您正确设置这些标头,它就会生成正确的 URL,无需出站规则。

诀窍在于知道哪些可以通过——反向代理文档似乎没有特别清楚这些是什么,他们只是提供了 nginx 和 Apache 示例,没有太多解释。我怀疑 nginx 和 Apache 会自动设置必要的标头,而 Nexus 已经采用了这些标头。这都是“事实上的标准”,而不是正式的标准,因此虽然您会看到应用程序支持的标头相当一致,但这并不能保证。

在我的案例中,我需要以下两个:

  • X-Forwarded-Host告诉 Nexus 客户端请求的原始主机。在您的示例中,这将是“nexus.mycompany.com”。
  • X-Forwarded-Proto可用于告诉 Nexus 原始请求(即向您的代理发出的请求)是 HTTPS,即使 Nexus 本身未运行 HTTPS。如果您的代理不是 HTTPS,则您不需要此功能。

标头在服务器变量部分设置 - 用下划线替换破折号,并在前面加上“HTTP_”,因此X-Forwarded-Host变成HTTP_X_Forwarded_Host

因此规则最终看起来是这样的:

<rule name="ReverseProxyInboundRule1" stopProcessing="true">
    <match url="(.*)" />
    <action type="Rewrite" url="http://localhost:8081/{R:1}" />
    <serverVariables>
        <set name="HTTP_X_Forwarded_Proto" value="https" />
        <set name="HTTP_X_Forwarded_Host" value="nexus.mycompany.com" />
    </serverVariables>
</rule>

再次,如果您的反向代理不是 HTTPS,请取出 Proto。

设置这些标头后,您就不再需要出站规则,正如您所说,该规则无法捕获 Javascript 文件中发生的许多事情。

最后,你可能要考虑保留 Base URL 功能——根据文档它确实有用于一些事情。

相关内容