You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 13:36:30