使用jwilder/nginx-proxy部署多域名应用遇问题:仅显示Nginx默认页
问题诊断
从日志可见,nginx处理请求时使用的server是localhost,说明jwilder/nginx-proxy没有为你的域名生成对应的虚拟主机配置,所有请求都落到了nginx默认的欢迎页。至于favicon.ico的404错误,只是默认页缺少图标导致的,并非核心问题。
解决步骤
1. 统一Docker网络(关键)
显式定义自定义网络,避免默认网络可能存在的容器解析问题,确保代理和应用容器能互相访问:
修改你的docker-compose.yml,添加网络配置:
version: "3.7" services: proxy: image: jwilder/nginx-proxy container_name: proxy labels: com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true" ports: - "80:80" - "443:443" volumes: - certs:/etc/nginx/certs - vhostd:/etc/nginx/vhost.d - html:/usr/share/nginx/html - /var/run/docker.sock:/tmp/docker.sock networks: - proxy-net letsencrypt: image: jrcs/letsencrypt-nginx-proxy-companion container_name: letsencrypt environment: - NGINX_PROXY_CONTAINER=proxy volumes: - certs:/etc/nginx/certs - vhostd:/etc/nginx/vhost.d - html:/usr/share/nginx/html - /var/run/docker.sock:/var/run/docker.sock networks: - proxy-net depends_on: - proxy app1: image: app1_image container_name: myapp1 expose: - "9090" environment: - VIRTUAL_PORT=9090 - VIRTUAL_HOST=domain1.com www.domain1.com - LETSENCRYPT_HOST=domain1.com www.domain1.com - LETSENCRYPT_EMAIL=info@domain1.es volumes: - /srv/shiny-server/app1/app/data:/srv/shiny-server/app1/app/data networks: - proxy-net depends_on: - proxy app2: image: app2_image container_name: myapp2 expose: - "8080" environment: - VIRTUAL_PORT=8080 - VIRTUAL_HOST=domain2.com www.domain2.com - LETSENCRYPT_HOST=domain2.com www.domain2.com - LETSENCRYPT_EMAIL=info@domain2.es volumes: - /srv/shiny-server/app2/app/data:/srv/shiny-server/app2/app/data networks: - proxy-net depends_on: - proxy volumes: certs: html: vhostd: networks: proxy-net: driver: bridge
2. 彻底清理旧配置并重新部署
旧的Docker卷可能残留无效配置,执行以下命令完全重置:
docker-compose down -v docker-compose up -d
3. 验证虚拟主机配置是否生成
进入proxy容器,检查是否生成了对应域名的vhost配置文件:
docker exec -it proxy ls /etc/nginx/vhost.d/
正常情况下应该能看到domain1.com和domain2.com的文件。如果没有,排查以下两点:
- 主机上
/var/run/docker.sock的权限:确保容器能读取该文件(一般权限为root:docker,jwilder镜像默认以root运行,通常无需额外调整)。 - 应用容器的环境变量:确认
VIRTUAL_HOST、VIRTUAL_PORT没有拼写错误。
4. 检查请求路由日志
查看proxy容器的访问日志,确认请求是否被正确路由到对应域名:
docker logs proxy
如果日志中请求的server字段是你的域名(如domain1.com)而非localhost,说明配置生效;若仍为localhost,则需重新检查环境变量和网络配置。
5. 验证域名解析
确保domain1.com和domain2.com已正确解析到你的服务器IP。本地测试可使用curl模拟请求:
curl -H "Host: domain1.com" http://你的服务器IP
如果返回应用内容,说明代理配置正常。
额外说明
日志中的favicon.ico 404错误会在vhost配置生效后自动消失,因为此时请求会转发到你的应用,而非nginx默认页。
内容的提问来源于stack exchange,提问作者Citizen
相关产品推荐
相关产品推荐

