【问题标题】:What does redirect in Yaws do in a docker stack?Yaws 中的重定向在 docker 堆栈中做了什么?
【发布时间】:2021-12-04 11:21:00
【问题描述】:

试图了解 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 -- 瞧。

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

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

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

为什么会这样?有更好的解决方案吗?

【问题讨论】:

  • 如果您在尝试&lt;redirect&gt; 方法时包含任何错误输出或日志输出的详细信息,将会很有帮助。
  • 我没有任何错误。 Yaws 会重定向到 wmy 并发送到浏览器。我希望这是由容器 wmy 拾取的,如果我直接进入容器并从那里使用 curl(我得到了我想要的)而不是从主机(curl:(6)无法解析主机:wmy)。所以很明显,来自 yaws 的重定向是发给主机的,而不是发给从 yaws 容器内可访问的任何容器。这是 nginx 的诀窍: location /wmy { proxy_pass wmy; }.
  • 好的,谢谢您的解释。我认为您需要在yaws.conf 中安装 3 个虚拟服务器而不是 &lt;redirect&gt; ... &lt;/redirect&gt;:一个用于包含 &lt;revproxy / http://wmy&gt;my.domain.tld,一个用于包含 &lt;revproxy / http://wsm&gt;sm.domain.tld,然后是带有“无胶水”部分的服务器appmod。
  • 听起来很有希望。我究竟做错了什么? &lt;revproxy / http://wmy&gt; Yaws: bad conf: 意外输入 ['wmy",'>'] 在第 219 行终止
  • 抱歉,我给了你错误的语法。应该是revproxy = / http://wmy

标签: docker yaws


【解决方案1】:

您可以使用 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>

【讨论】:

  • 今天我遇到了一个崩溃,表明 sm.domain.tld 没有被代理。怎么会?我想明白这一点。崩溃消息是Req: {http_request,'GET', {abs_path,"/first/second/third?params=1&amp;more=2"}, {1,1}}。它看起来像一个间歇性错误——我遇到过几次,刷新或添加一个随机的废话参数通常会修复它。
  • 根据提供的信息回答您的问题的可能性很小。 “Req:”消息之前应该有更多信息,但无论哪种方式,此消息都表明在处理 out/1 函数期间发生了某种退出或异常,或者该函数返回了错误值。如果您使用的是revproxy,那么它可能是其out 函数中的错误。但这是一个试图获得 Yaws 支持的糟糕论坛。请尝试 Erlang Slack 中的 Yaws 频道,或 erlyaws 邮件列表,或在 Yaws github repo 中提出问题。如果可能的话,试着做一个小测试用例。
猜你喜欢
  • 2013-10-25
  • 2011-05-07
  • 1970-01-01
  • 2014-04-01
  • 2019-06-29
  • 2020-09-13
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
相关资源
最近更新 更多