Yaws 中的重定向在 docker 堆栈中做什么?

What does redirect in Yaws do in a docker stack?

试图了解 Yaws 和我的 docker 堆栈。

我在 yaws.conf 中有 3 个服务器:domain.tldmy.domain.tldsm.domain.tld。这些对应于容器 wwwwmywsm。我希望 Yaws 通过 appmod 处理来自 domain.tld 的数据并通过其他两个。

使用 nginx 作为代理,这并不难做到。如何用 Yaws 做对?

目前我将相同的 appmod 传递给所有三个,让那个 appmod 决定要做什么。

out_check_glue(A) ->    
    {url, Scheme, Host, _Port , Path, Querypart} = yaws_api:request_url(A),
    case Host of
        "my.domain.tld" ->
            Url = "http://" ++ "wmy" ++ Path ++ get_query(Querypart),
?trace('out_check_glue(A)==++++++++++++++++++++++++++++++++++=========CALL WMY============> Url', [Url]),
            vx_request_url(Url);
        "sm.domain.tld" ->
            Url = "http://" ++ "wsm" ++ Path ++ get_query(Querypart),
?trace('out_check_glue(A)==++++++++++++++++++++++++++++++++++=========CALL WSM============> Url', [Url]),
            vx_request_url(Url);
        _ ->
?trace('out_check_glue(A)==++++++++++++++++++++++++++++++++++=========NO GLUE============> Scheme, Host,Path,Querypart', [io:format("~n~n~n~p~n", ["WE START HERE out_check_glue"]),Scheme, Host,Path,Querypart]),
            out_vx(A)
    end.

vx_request_url 只是调用 httpc:request 并进行一些进一步的区分,例如容器 adm,如其他地方所讨论的,所以我在这里进行了简单的传递,out_vx 开始处理www.

这很好用。如您所见,appmod 可以直接调用适当的容器。这也很容易在 yaws 容器中复制。进入容器并发出curl http://wmy -- voilà.

我的想法是完全不涉及 appmod,就像 nginx 的情况一样,并通过重定向将此决定传递给 Yaws,如下所示:

#        appmods = </, myurl exclude_paths plugins img images styles scripts>
   <redirect>
     / = http://wmy
   </redirect>

这没有按预期工作:调用的不是容器,而是必须出错的浏览器,当然:找不到域 wmy

为什么会这样,有没有更好的解决办法?

您可以使用 Yaws 反向代理功能,而不是使用重定向,因为它基本上会执行您的 appmod 在其“无胶水”部分中所做的事情。

对于 my.domain.tldsm.domain.tld,将虚拟服务器添加到您的 yaws.conf 文件,并在每个文件中指定 revproxy:

<server my.domain.tld>
    revproxy = / http://wmy
</server>

<server sm.domain.tld>
    revproxy = / http://wsm
</server>