同WiFi局域网下其他设备无法访问Nginx代理的Docker子域名如何解决
故障解决方案
第一步:验证终端设备hosts配置生效
在无法访问子域名的设备上执行终端命令测试域名解析:
ping container1.hub.local
- 如果返回的IP不是服务器的局域网IP,说明hosts配置未生效:
- Windows系统:hosts路径为
C:\Windows\System32\drivers\etc\hosts,需要管理员权限修改,修改后执行ipconfig /flushdns刷新DNS缓存,使用新的CMD窗口测试 - Mac系统:hosts路径为
/etc/hosts,修改后执行sudo dscacheutil -flushcache && sudo killall -HUP mDNSResponder刷新缓存 - Linux系统:hosts路径为
/etc/hosts,修改后执行sudo systemd-resolve --flush-caches刷新缓存
- Windows系统:hosts路径为
- 如果返回的IP是服务器的正确局域网IP,直接跳转到第二步排查
第二步:解决.local域名冲突(根因概率90%以上)
.local是mDNS(Bonjour/零配置网络)的保留域名后缀,华硕路由器默认会开启mDNS解析服务,优先用局域网广播的方式解析*.local域名,不会走本地hosts。主域名hub.local能正常访问是因为Mac服务器的Bonjour服务默认广播了本机名称,而两个子域名没有对应的广播记录,所以解析失败。
解决方案二选一即可:
- 替换域名后缀:将所有域名的后缀从
.local替换为.home.arpa(IANA官方指定的局域网专用域名后缀,无任何解析冲突),同步修改服务器hosts、终端设备hosts、容器VIRTUAL_HOST环境变量即可 - 路由器侧配置静态解析:登录华硕路由器管理后台,进入「内部网络 > DHCP服务器 > 自定义DNSHOST」,添加三条A记录分别将
hub.local、container1.hub.local、container2.hub.local指向服务器局域网IP,开启后所有同WiFi设备无需配置hosts即可正常解析所有域名
部署方案优化建议
- 简化反向代理配置:
jwilder/nginx-proxy镜像本身会自动读取所有容器的VIRTUAL_HOST环境变量生成Nginx反向代理规则,无需手动编写nginx-proxy.conf挂载,删掉该挂载项即可,后续新增容器仅需添加VIRTUAL_HOST环境变量即可自动完成代理配置 - 删除冗余端口映射:
container1、container2、default三个服务的80端口映射到主机端口的配置完全多余,所有访问都会通过nginx-proxy的80端口在内网转发到对应容器的80端口,无需映射到宿主机,还可减少端口暴露的安全风险 - 统一局域网域名解析:优先选择在路由器侧配置静态DNS记录,无需为每个接入WiFi的设备单独修改hosts,新增域名仅需在路由器配置即可全局域网生效
- 补充HTTPS支持:可搭配
nginx-proxy配套的letsencrypt-nginx-proxy-companion镜像,自动为所有域名签发自签SSL证书,实现局域网HTTPS访问
内容的提问来源于stack exchange,提问作者LucasMaliszewski
相关产品推荐
相关产品推荐

