双Docker Compose栈中Nginx实例端口监听与域名访问配置咨询
解决多Docker-Compose栈Nginx域名访问冲突的方案
这是个很常见的多服务栈入口管理问题,我来给你几个实用的解决思路,按推荐程度排序:
1. 用统一反向代理做入口(最推荐)
核心思路是只对外暴露一个反向代理工具(比如Nginx或Nginx Proxy Manager)的443/80端口,由它根据域名把请求转发到不同服务栈里的内部服务。这样既解决了端口冲突,还能统一管理SSL证书,用户体验更流畅。
具体步骤:
- 调整两个现有服务栈的Nginx配置:把它们的对外端口映射改成内部可访问(比如原来的
443:443改成8081:443,444:443改成8082:443),不让它们直接暴露到公网 - 新建一个单独的反向代理服务,暴露主机的80和443端口
- 给反向代理配置两条转发规则:
- 当请求域名是
blog.yourdomain.com时,转发到Ghost服务栈的Nginx容器(比如http://ghost-nginx:8081,注意要确保反向代理容器和两个服务栈在同一Docker网络,或者手动连接网络) - 当请求域名是
analytics.yourdomain.com时,转发到Matomo服务栈的Nginx容器(比如http://matomo-nginx:8082)
- 当请求域名是
- 所有SSL证书在这个反向代理里统一配置,不用在每个服务栈的Nginx里重复设置
2. 合并两个Docker-Compose服务栈
如果你的服务规模不大,把所有服务合并到同一个docker-compose.yml里也是个简洁的方案,这样只用一个Nginx实例,通过不同的server块处理不同域名的请求。
操作要点:
- 把两个栈的服务定义合并到一个文件,注意重命名冲突的服务(比如两个Adminer可以改成
adminer-ghost和adminer-matomo,避免名称冲突) - 修改Nginx配置,添加两个独立的server块:
# Ghost博客的域名配置 server { listen 443 ssl; server_name blog.yourdomain.com; # 这里放你的SSL证书配置(cert、key路径) location / { proxy_pass http://ghost:2368; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 其他必要的proxy头部配置 } } # Matomo分析的域名配置 server { listen 443 ssl; server_name analytics.yourdomain.com; # 同样的SSL证书配置 ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; location / { proxy_pass http://matomo:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } - 这个Nginx只暴露主机的443端口,所有域名请求都走这个入口,自然就解决了冲突问题
3. 端口映射+带端口的域名访问(不推荐)
如果暂时不想调整架构,也可以保留两个Nginx的端口映射(443和444),然后让用户访问Matomo时加:444后缀(比如analytics.yourdomain.com:444)。但这种方式用户体验差,而且管理多个SSL证书也麻烦,只适合临时测试用。
额外注意事项
- 确保所有需要通信的Docker服务在同一网络中:可以手动创建一个自定义网络,让所有服务栈都加入这个网络,避免跨栈访问失败
- SSL证书尽量用Let's Encrypt自动签发,配合反向代理工具的话能自动续期,减少维护成本
内容的提问来源于stack exchange,提问作者Matt Welke
相关产品推荐
相关产品推荐

