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

生产服务器Nginx代理返回404本地运行正常故障排查

服务部署故障排查记录

现有部署配置

docker-compose.yml 配置

... 
 frontend:
    container_name: docker-frontend
    build: ./frontend
    restart: unless-stopped
    command: serve -s dist/vu4y-frontend -l 4200
    networks:
      - docker-network

  nginx:
    image: nginx:stable-alpine
    container_name: docker-nginx
    ports:
      - "80:80"
    volumes:
      - ./data/nginx/app.conf:/etc/nginx/conf.d/nginx.conf
    depends_on:
      - frontend
      - backend
    networks:
      - docker-network
...

Nginx 配置(app.conf)

server {
  listen 80;

  server_name mysite.com;

  location / {
    proxy_pass http://frontend:4200;
  }
}

故障现象

  • 配置此前运行正常,经过若干更新操作后服务异常,所有配置回滚后故障仍存在
  • 已尝试操作:重启服务器、删除并重建Nginx容器与镜像,均未解决问题
  • 本地运行所有服务完全正常,但访问生产服务器时返回404错误
  • 初步怀疑为Nginx缓存或同类问题导致,查看Nginx运行日志未发现明确报错

Nginx 运行日志

....
docker-nginx | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
docker-nginx | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
alienmova-docker-nginx | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
docker-nginx | 10-listen-on-ipv6-by-default.sh: info: IPv6 listen already enabled
docker-nginx | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
docker-nginx | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
docker-nginx | /docker-entrypoint.sh: Configuration complete; ready for start up
docker-nginx | 2022/07/14 19:53:51 [notice] 1#1: using the "epoll" event method
docker-nginx | 2022/07/14 19:53:51 [notice] 1#1: nginx/1.22.0
docker-nginx | 2022/07/14 19:53:51 [notice] 1#1: built by gcc 11.2.1 20220219 (Alpine 11.2.1_git20220219) 
docker-nginx | 2022/07/14 19:53:51 [notice] 1#1: OS: Linux 5.4.0-122-generic
docker-nginx | 2022/07/14 19:53:51 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
docker-nginx | 2022/07/14 19:53:51 [notice] 1#1: start worker processes
docker-nginx | 2022/07/14 19:53:51 [notice] 1#1: start worker process 23
docker-nginx | 2022/07/14 19:53:51 [notice] 1#1: start worker process 24
....
docker-nginx | 159.223.63.89 - - [14/Jul/2022:20:03:05 +0000] "GET /cms/wp-includes/wlwmanifest.xml HTTP/1.1" 404 1653 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" "-"
docker-nginx | 159.223.63.89 - - [14/Jul/2022:20:03:05 +0000] "GET /sito/wp-includes/wlwmanifest.xml HTTP/1.1" 404 1653 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" "-"
docker-nginx | 159.223.63.89 - - [14/Jul/2022:20:03:06 +0000] "" 400 0 "-" "-" "-"

排查思路与解决方案

按优先级从高到低排查:

  • 优先验证前端容器服务可用性
    进入Nginx容器执行curl http://frontend:4200,如果命令返回404,问题出在前端服务而非Nginx:
    • 重点核对前端启动命令的路径:当前命令是serve -s dist/vu4y-frontend -l 4200,进入前端容器执行ls -l dist/确认构建产物的实际路径,多数这类问题是前端更新后构建输出路径变化,dist目录直接就是产物根目录,多拼了一层vu4y-frontend导致serve找不到index.html返回404。注意哪怕配置回滚,如果前端镜像没有彻底清理重新构建,旧的错误构建层会残留。
  • 检查Nginx配置加载冲突
    进入Nginx容器执行nginx -T打印所有加载的配置:
    • Nginx官方镜像会自动加载/etc/nginx/conf.d/下所有.conf后缀的文件,如果目录下残留了自带的default.conf或者其他历史配置文件,当请求的Host头不匹配你配置的server_name mysite.com时,会命中默认server块返回404。
    • 本地验证:在生产服务器上执行curl -H "Host: mysite.com" http://127.0.0.1,如果返回正常,再执行不带Host头的curl http://127.0.0.1,如果后者返回404,说明你访问时域名解析异常、或者前置CDN/代理转发时带错了Host头。
  • 验证容器网络连通性
    分别执行docker inspect docker-frontend和docker inspect docker-nginx,确认两个容器都接入了同一个docker-network,如果前端容器意外接入了默认bridge网络,Nginx无法解析frontend这个域名会转发失败。
  • 排除请求落点错误
    你贴的日志里所有404记录都是互联网恶意扫描WordPress路径的请求,没有你正常访问站点的请求记录。先在本地客户端ping你的域名,确认解析到的IP是当前生产服务器的IP,排除更新操作后DNS/CDN配置没回滚,请求打到了其他旧服务器的情况。
  • 不用排查Nginx缓存:当前配置没有添加任何proxy_cache相关规则,不存在Nginx缓存导致404的可能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:36:22