Docker栈中Yaws的redirect规则为何无法直接转发请求到内部容器?
问题原因
Yaws的<redirect>配置的作用是返回3xx重定向响应给客户端浏览器,浏览器会主动向重定向目标地址发起新请求,和Nginx的proxy_pass服务端内部反向转发逻辑完全不同。你配置的重定向目标http://wmy是Docker内部网络的域名,公网环境的浏览器无法解析该域名,因此出现访问报错。
实现方案
推荐直接使用Yaws原生的反向代理配置实现需求,无需自己开发appmod转发逻辑,性能和稳定性都优于手动实现的透传代码:
将三个域名分别拆分到独立的server块配置,yaws.conf示例如下:
# 主域名domain.tld,保留appmod处理逻辑 <server domain.tld> port = 80 listen = 0.0.0.0 docroot = /your/docroot/path appmods = </, your_appmod_module exclude_paths plugins img images styles scripts> </server> # 二级域名my.domain.tld,反向代理到wmy容器 <server my.domain.tld> port = 80 listen = 0.0.0.0 revproxy = / http://wmy/ # 可选:传递客户端请求头到上游容器 revproxy_header = Host $host revproxy_header = X-Real-IP $remote_addr revproxy_header = X-Forwarded-For $proxy_add_x_forwarded_for </server> # 二级域名sm.domain.tld,反向代理到wsm容器 <server sm.domain.tld> port = 80 listen = 0.0.0.0 revproxy = / http://wsm/ revproxy_header = Host $host revproxy_header = X-Real-IP $remote_addr revproxy_header = X-Forwarded-For $proxy_add_x_forwarded_for </server>
如果你的业务场景确实需要保留自定义的请求判断逻辑(比如特殊路径转发到adm容器的需求),可以将三个域名的server块拆分后,仅给主域名绑定appmod,另外两个域名根据实际需求选择原生revproxy或者轻量专用appmod即可,无需每次请求都判断Host字段,逻辑更清晰,性能也更好。
内容的提问来源于stack exchange,提问作者kklepper
相关产品推荐
相关产品推荐

