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

Docker Compose配置jwilder/nginx-proxy遇502错误,求排查YAML问题

问题描述

我尝试将Monica应用部署在jwilder/nginx-proxy反向代理之后,目前已有其他网站通过该代理正常运行,但此应用出现异常:

  • 启动应用时访问返回502错误
  • 停止应用时则返回503错误

取消注释ports部分后,本地访问localhost:8081可正常运行。以下是我的Docker Compose配置文件:

services:
  app:
    image: monica
    depends_on:
      - db
#    ports:
#      - 8081:80
    expose:
      - 80
    environment:
      - VIRTUAL_HOST=pepe.domain.com
      - VIRTUAL_PORT=80
      - APP_KEY=xxxxxxx
      - DB_HOST=db
      - DB_USERNAME=monica
      - DB_PASSWORD=xxxxx
    volumes:
      - data-monica:/var/www/html/storage
    restart: always

  db:
    image: mysql
    environment:
      - MYSQL_RANDOM_ROOT_PASSWORD=true
      - MYSQL_DATABASE=xxxx
      - MYSQL_USER=xxxxx
      - MYSQL_PASSWORD=xxxx
    volumes:
      - mysql-monica:/var/lib/mysql
    restart: always

volumes:
  data-monica:
    name: data-monica
  mysql-monica:
    name: mysql-monica
问题分析与修复方案

1. 网络连通性(核心问题)

jwilder/nginx-proxy必须和后端应用容器处于同一个Docker网络才能正常转发请求。如果你的nginx-proxy是单独启动的(比如用另一个Compose文件或直接命令启动),默认情况下Monica的容器会创建独立的私有网络,导致proxy无法访问到Monica的app容器,直接返回502。

修复操作:

  • 先确认你的nginx-proxy使用的网络名称(比如常见命名为nginx-proxy,可以用docker network ls查看)
  • 在你的Monica Compose配置中添加网络配置,加入到proxy的共享网络:
services:
  # 原有app、db配置保持不变
  app:
    ...
  db:
    ...

# 在services同级添加以下内容
networks:
  default:
    external: true
    name: nginx-proxy  # 替换为你实际的proxy网络名称

如果还没创建共享网络,先执行:

docker network create nginx-proxy

同时确保你的nginx-proxy容器也加入这个网络。

2. 容器启动顺序与就绪检测

depends_on只是保证db容器启动,但MySQL可能还没完成初始化(比如创建数据库、用户),此时Monica的app容器启动后无法连接数据库,导致服务未正常运行,nginx访问时就会返回502。

修复操作:

  • 给db容器添加健康检查,确保MySQL真正就绪后再启动app:
db:
  image: mysql
  environment:
    # 原有环境变量不变
    - MYSQL_RANDOM_ROOT_PASSWORD=true
    - MYSQL_DATABASE=xxxx
    - MYSQL_USER=xxxxx
    - MYSQL_PASSWORD=xxxx
  volumes:
    - mysql-monica:/var/lib/mysql
  restart: always
  # 添加健康检查
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "${MYSQL_USER}", "-p${MYSQL_PASSWORD}"]
    interval: 10s
    timeout: 5s
    retries: 5
  • 更新app容器的depends_on,依赖db的健康状态:
app:
  image: monica
  depends_on:
    db:
      condition: service_healthy
  # 其他配置不变

3. 验证容器内部端口

虽然你指定了VIRTUAL_PORT=80,可以确认Monica容器内部确实监听80端口:

docker exec -it <你的monica-app容器名> netstat -tulpn

如果内部监听的是其他端口(比如8000),需要同步修改VIRTUAL_PORT为对应端口。


内容的提问来源于stack exchange,提问作者emboole

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:01:25