在Azure VM下在Docker中运行的IIS ARR反向代理返回404

时间:2019-09-30 16:47:09

标签: azure docker iis arr

使用Azure Server Core 2019 VM,我已经设置了许多以ISS / ARR 3.0作为反向代理的Docker容器。

当我访问主机URL:“ http://[hostname]/deploy”时,我希望RP重定向到http://[docker ip]:81

81是运行“ deploy”的单独内部docker容器的暴露端口。仅供参考:这已映射到主机端口1322 ...通过外部浏览器访问主机名:1322可以正常工作。

(我还尝试使用对[hostname]:1322和[docker ip]:1322的重写规则)

无论我做什么,我总是得到404(找不到)

我不知道为什么。 Azure本身是否有东西搞砸了?我似乎可以在Windows中使用的唯一网络是NAT(通过docker network ls)。我已经通过“ docker inspect [container]”获得了目标Docker容器的正确IP地址,但我认为这是暴露给主机的IP地址,主机上运行的其他容器无法看到该IP地址。

我如何知道其他正在运行的Docker容器可用于ARR规则的内部docker IP(或者有另一种设置方式,以便它动态了解规则)?

我的ARR web.config是:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="deploy" stopProcessing="true">
                    <match url="^(.*)/deploy" />
                    <action type="Rewrite" url="http://172.23.60.148:81" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

我的反向代理docker文件是:

FROM mcr.microsoft.com/windows/servercore/iis

# Download and install the required URL rewrite and Application Request Routing modules. Clean up after!
ADD http://go.microsoft.com/fwlink/?LinkID=615137 /install/rewrite_amd64.msi
ADD http://go.microsoft.com/fwlink/?LinkID=615136 /install/ARRv3_setup_amd64_en-us.msi
RUN msiexec.exe /i C:\install\rewrite_amd64.msi /qn /log C:\ms_install.log & \
    msiexec.exe /i C:\install\ARRv3_setup_amd64_en-us.msi /qn /log C:\arr_install.log & \
    rd /s /q c:\install

# Enable proxy feature for IIS. Allows us to act as a reverse proxy
RUN .\Windows\System32\inetsrv\appcmd.exe set CONFIG -section:system.webServer/proxy /enabled:"True" /commit:apphost

# The web config should contain our routing to other containers
ADD ./web.config /inetpub/wwwroot/web.config

1 个答案:

答案 0 :(得分:1)

因此,事实证明,问题根本不是docker而是ARR。

当您添加重写规则时,逻辑上希望此“ ^(。*)/ deploy”成为匹配条件,即“以/ deploy结尾”。尝试时,IIS中的重写规则测试器甚至可以正常工作。

结果是,IIS没有将/传递给重写规则引擎。它仅传递文本“ deploy” ...,因此该规则永不匹配,然后将其传递给基础IIS站点而不是目标......当然,/ deploy在基础站点中不存在,因此404。

此处的相关ARR问题