不依赖Host头的Docker多站点反向代理部署方案咨询
可行的单IP无Host头依赖的Docker多站点部署方案
完全可以实现无需多IP、不依赖Host头的多站点部署,以下是两种落地成本最低的方案:
方案1:端口区分不同站点
这是兼容性最好的方案,所有复古浏览器都原生支持IP+端口的访问形式:
- 为每个站点容器分配不同的VPS对外端口,比如站点A映射
8080:80、站点B映射8081:80,用户直接通过[VPS IP]:8080、[VPS IP]:8081即可访问对应站点 - 也可以前置统一Nginx实例,配置多个
listen端口,每个端口对应转发到不同的站点容器,无需配置server_name匹配规则,示例Nginx配置片段:
# 对应站点A server { listen 8080; location / { proxy_pass http://site-a-container:80; } } # 对应站点B server { listen 8081; location / { proxy_pass http://site-b-container:80; } }
方案2:URL路径前缀区分不同站点
如果不想开放多个对外端口,可以用单端口加路径前缀的方式实现:
- 前置反向代理(Nginx/Traefik都支持),所有请求统一走80端口,根据路径前缀转发到不同站点容器,比如
[VPS IP]/site-a转发到站点A、[VPS IP]/site-b转发到站点B - 注意处理站内链接适配:可以在反向代理层用
sub_filter修改响应内容中的相对路径,也可以调整站点本身的资源引用路径为带前缀的格式或者相对路径,避免静态资源404。Nginx路径转发示例配置:
server { listen 80 default_server; location /site-a/ { proxy_pass http://site-a-container:80/; # 替换站内链接适配前缀 sub_filter 'href="/' 'href="/site-a/'; sub_filter 'src="/' 'src="/site-a/'; sub_filter_once off; } location /site-b/ { proxy_pass http://site-b-container:80/; sub_filter 'href="/' 'href="/site-b/'; sub_filter 'src="/' 'src="/site-b/'; sub_filter_once off; } }
关于Traefik的适配说明
Traefik完全支持你的使用场景,只需要在路由规则中去掉Host匹配规则,换成PathPrefix路径匹配,或者为不同站点配置独立的入口端口即可,逻辑和Nginx完全一致。
内容的提问来源于stack exchange,提问作者Eric.M
相关产品推荐
相关产品推荐

