Docker环境下本地Nginx反向代理配置SSL后容器内部请求ssgtm.dev:443连接被拒绝问题求助
嘿,我来帮你捋清楚这个问题的根源和解决办法~
你遇到的connect ECONNREFUSED 127.0.0.1:443错误,核心原因是容器内部的127.0.0.1和宿主机的127.0.0.1不是同一个东西!
你在宿主机的hosts文件里把ssgtm.dev指向了127.0.0.1,但容器本身有独立的网络栈,它的127.0.0.1是容器自己的回环地址,而你的容器里并没有在443端口启动服务——443端口是宿主机上的Nginx容器在监听,不是容器内部的服务。所以当容器内部发起请求到ssgtm.dev:443时,它会解析到自己的127.0.0.1,自然找不到对应的服务,就出现连接拒绝了。
下面给你几个可行的解决方案:
方案1:给容器添加宿主机域名映射(最直接)
在你的docker-compose.yml里,给tagging_server_container和preview_server_container添加extra_hosts配置,让容器内部解析ssgtm.dev和preview.ssgtm.dev时指向宿主机的网关IP:
services: tagging_server_container: # 原有的配置... extra_hosts: - "ssgtm.dev:host-gateway" - "preview.ssgtm.dev:host-gateway" preview_server_container: # 原有的配置... extra_hosts: - "ssgtm.dev:host-gateway" - "preview.ssgtm.dev:host-gateway"
host-gateway是Docker 20.10及以上版本支持的特殊值,它会自动指向宿主机的网络网关,这样容器内部请求这些域名时,就会把请求发送到宿主机,宿主机的Nginx就能正常接收并转发了。
方案2:用Docker内部服务名直接通信(更高效)
既然所有容器都在同一个ssgtm网络里,你可以让容器直接通过Nginx容器的服务名proxy来访问,不需要走宿主机的443端口,这样还能避免SSL的额外开销。
比如修改tagging_server_container的环境变量:
environment: PREVIEW_SERVER_URL: http://proxy:80 # 原有的其他配置...
同时调整Nginx的配置,让它监听内部的80端口(或者直接用现有的监听规则,因为Nginx容器已经在80端口暴露了),这样容器内部的请求直接在Docker网络内部完成,不需要绕到宿主机的外部端口。
方案3:修改容器内部的hosts文件(手动方式)
如果你的Docker版本比较旧,不支持host-gateway,可以手动指定宿主机的IP(比如你的宿主机在Docker网络里的IP通常是172.x.x.1),然后添加到extra_hosts里:
extra_hosts: - "ssgtm.dev:172.17.0.1" - "preview.ssgtm.dev:172.17.0.1"
不过这种方式不如host-gateway灵活,因为不同环境的Docker网关IP可能不一样。
你可以先试试方案1,这个改动最小,而且能保持你现有Nginx的SSL配置不变,应该能快速解决问题~
备注:内容来源于stack exchange,提问作者Sajjad Hossain Sagor

