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
相关产品推荐
相关产品推荐

