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

Docker Compose配置Nginx路由异常排查:.NET+Angular+MySQL环境

问题描述

本地部署Docker Compose环境(包含.NET后端、MySQL数据库、Angular前端、Nginx代理)一切正常,但部署到服务器后Nginx无法正常路由请求,怀疑是Nginx配置问题,无法定位具体错误。

现有配置

docker-compose.yml

version: '3.7'

volumes:
  datafiles:

services:

  database:

    image: mysql:8.0.22

    ports:
      - "3306:3306"

    volumes:
      - ./~mysql:/var/lib/mysql
      - ./mysql.cnf:/etc/mysql/conf.d/my.cnf

    restart: always

    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}

  backend:

    image: image:03
    ports:
      - "5000:80"
    depends_on:
      - database
    restart: always

    environment:
      - DBHOST=database
      - ASPNETCORE_ENVIRONMENT=Production

  frontend:

    image: image:00

    ports:
      - "4200:80"

    restart: always

  proxy:

    build:
      context: ./Proxy
      dockerfile: dockerfile

    ports:
      - "80:80/tcp"

    restart: always

Nginx配置

upstream front {
    server frontend;
}

upstream back {
    server backend;
}

server {
    listen 80;

    location / {
        proxy_pass http://front;
    }

    location /graphql {
        proxy_pass http://back;
    }
}

排查与修复方案

1. 验证容器间网络连通性

先确认Nginx容器能否正常访问前端和后端服务:

# 进入proxy容器
docker exec -it <proxy-container-name> bash
# 测试连通性
ping frontend
ping backend

如果ping不通,说明Docker默认桥接网络存在异常,执行以下命令重置网络:

docker-compose down
docker network prune
docker-compose up -d

2. 完善Nginx代理配置

现有配置缺少代理必需的头信息和单页应用路由处理,修改后的配置如下:

upstream front {
    server frontend:80; # 显式指定端口,避免DNS解析歧义
}

upstream back {
    server backend:80;
}

server {
    listen 80;

    location / {
        proxy_pass http://front;
        # 传递客户端真实信息给前端
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 处理Angular单页应用的路由刷新问题
        try_files $uri $uri/ /index.html;
    }

    location /graphql {
        proxy_pass http://back;
        # 传递客户端信息给后端
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 支持GraphQL订阅的Websocket协议
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

3. 检查服务器端口占用

服务器80端口可能被系统自带的Nginx、Apache等服务占用,导致proxy容器无法正常监听:

# 查看80端口占用情况
sudo lsof -i :80
# 或
sudo netstat -tulpn | grep :80

若存在占用,停止对应服务后重新启动Docker Compose。

4. 查看Nginx日志定位错误

直接查看Nginx的错误日志和访问日志,获取具体报错信息:

# 查看错误日志
docker exec -it <proxy-container-name> cat /var/log/nginx/error.log
# 查看访问日志
docker exec -it <proxy-container-name> cat /var/log/nginx/access.log

日志会明确显示是上游服务连接失败,还是路由匹配问题,可针对性修复。

5. 确保后端服务在数据库就绪后启动

depends_on仅保证容器启动顺序,无法确保数据库初始化完成。修改docker-compose.yml,为数据库添加健康检查,确保后端在数据库就绪后启动:

backend:
  image: image:03
  ports:
    - "5000:80"
  depends_on:
    database:
      condition: service_healthy
  restart: always
  environment:
    - DBHOST=database
    - ASPNETCORE_ENVIRONMENT=Production

database:
  image: mysql:8.0.22
  ports:
    - "3306:3306"
  volumes:
    - ./~mysql:/var/lib/mysql
    - ./mysql.cnf:/etc/mysql/conf.d/my.cnf
  restart: always
  environment:
    MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    MYSQL_USER: ${MYSQL_USER}
    MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    MYSQL_DATABASE: ${MYSQL_DATABASE}
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "${MYSQL_USER}", "-p${MYSQL_PASSWORD}"]
    interval: 10s
    timeout: 5s
    retries: 5

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:17:09