Yaws 中的重定向在 docker 堆栈中做什么?
What does redirect in Yaws do in a docker stack?
试图了解 Yaws
和我的 docker 堆栈。
我在 yaws.conf
中有 3 个服务器:domain.tld
、my.domain.tld
和 sm.domain.tld
。这些对应于容器 www
、wmy
和 wsm
。我希望 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.tld
和 sm.domain.tld
,将虚拟服务器添加到您的 yaws.conf
文件,并在每个文件中指定 revproxy
:
<server my.domain.tld>
revproxy = / http://wmy
</server>
<server sm.domain.tld>
revproxy = / http://wsm
</server>
试图了解 Yaws
和我的 docker 堆栈。
我在 yaws.conf
中有 3 个服务器:domain.tld
、my.domain.tld
和 sm.domain.tld
。这些对应于容器 www
、wmy
和 wsm
。我希望 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.tld
和 sm.domain.tld
,将虚拟服务器添加到您的 yaws.conf
文件,并在每个文件中指定 revproxy
:
<server my.domain.tld>
revproxy = / http://wmy
</server>
<server sm.domain.tld>
revproxy = / http://wsm
</server>