Docker多域名配置异常:Apache与Nginx服务无法按预期分流
Docker多域名反向代理问题解决方案(Apache/Nginx共用80端口)
问题根源
frontend和backend未加入nginx-proxy网络,反向代理容器无法识别这两个服务,没法按照VIRTUAL_HOST配置路由请求,最终所有流量都 fallback 到了同一个Apache服务member-frontend配置了ports: "8081:80",绕开了反向代理直接暴露端口,和多域名共享80端口的逻辑冲突backend的挂载路径是./backend:/var/www/html/backend,而Apache默认根目录为/var/www/html,直接访问api.domain.io会找不到对应内容
修正后的docker-compose.yml
version: '3' services: frontend: image: php:apache volumes: - "./frontend:/var/www/html" restart: always networks: - domain-net - nginx-proxy # 加入反向代理网络,让代理容器能识别此服务 environment: VIRTUAL_HOST: domain.io member-frontend: image: nginx:alpine volumes: - "./member-frontend:/usr/share/nginx/html" - "./nginx/member.conf:/etc/nginx/conf.d/default.conf" # 移除端口映射,所有80端口请求由nginx-proxy统一转发 restart: always networks: - domain-net - nginx-proxy environment: VIRTUAL_HOST: member.domain.io backend: image: php:apache volumes: - "./backend:/var/www/html" # 调整挂载到Apache根目录,直接访问api.domain.io即可获取内容 restart: always networks: - domain-net - nginx-proxy # 加入反向代理网络 environment: VIRTUAL_HOST: api.domain.io networks: domain-net: nginx-proxy: external: name: nginx-proxy
额外注意事项
- 确保
nginx-proxy容器正常运行并监听主机80端口,启动命令参考:docker run -d -p 80:80 --name nginx-proxy --net nginx-proxy -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy - 若
backend必须保留原挂载路径./backend:/var/www/html/backend,需给Apache添加虚拟主机配置,将api.domain.io的根目录指向/var/www/html/backend,可通过挂载自定义Apache配置文件到容器/etc/apache2/sites-available/目录实现 - 检查
member-frontend的member.conf配置,确保Nginx规则正确,示例:
server { listen 80; server_name member.domain.io; root /usr/share/nginx/html; index index.html index.htm; location / { try_files $uri $uri/ =404; } }
- 本地hosts文件需配置三个域名指向主机IP,例如:
127.0.0.1 domain.io member.domain.io api.domain.io - 修改配置后重启服务:
docker-compose down && docker-compose up -d,可查看nginx-proxy日志排查问题:docker logs nginx-proxy
内容的提问来源于stack exchange,提问作者j223a
相关产品推荐
相关产品推荐

