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

Nginx反向代理间歇性返回404问题排查求助

间歇性Nginx反向代理404故障排查求助

环境详情

  • EC2实例(m5.xlarge):
    • 系统:amzn-linux 2,CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
    • Docker Compose版本:v2.13.0
    • Docker版本:20.10.17,build 100c701
    • 仅部署Docker及Docker Compose相关环境,无其他运行服务
  • EC2实例位于AWS ALB目标组内,为组内唯一实例
  • 通过docker-compose up -d启动服务,使用最新版Nginx镜像

问题现象

启动初期运行正常,无错误。但运行1-3天后,开始间歇性返回404错误:

  • 失败请求随机,可能是index.html、.js、.css或图片等静态资源
  • 每次刷新页面通常有2-3个请求返回404,失败请求不固定,其余请求返回200
  • 日志呈现近乎“隔一个请求就404”的规律,问题持续且无法自行恢复

临时解决方法

执行docker-compose down再docker-compose up重启服务,问题立即解决,但1-3天后会再次复发。

日志示例(docker-compose logs)

nginx  | 10.0.51.10 - - [10/Sep/2023:01:58:55 +0000] "GET /dataportal/favicon.ico HTTP/1.1" 200 1706 "https://xxxxxxx.xxxxxxxx.com/dataportal/dashboards" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
nginx  | 10.0.51.10 - - [10/Sep/2023:01:58:55 +0000] "GET /dataportal/static/css/main.3fb3fe79.css HTTP/1.1" 200 86129 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
nginx  | 10.0.51.10 - - [10/Sep/2023:01:58:55 +0000] "GET /dataportal/static/js/main.5c5d85b7.js HTTP/1.1" 404 967 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
nginx  | 10.0.51.10 - - [10/Sep/2023:01:58:56 +0000] "GET /api/dataportal/dashboards HTTP/1.1" 200 2043 "https://xxxxxxx.xxxxxxxx.com/dataportal/dashboards" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
nginx  | 10.0.52.62 - - [10/Sep/2023:01:58:57 +0000] "GET /dataportal/static/css/main.51fa6b06.css HTTP/1.1" 200 1706 "-" "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AkamaiImageServer VelocitudeMP/1.0;IM/1.0"
nginx  | 10.0.51.10 - - [10/Sep/2023:01:58:57 +0000] "GET /dataportal/static/js/main.d4bbd5f8.js HTTP/1.1" 404 967 "-" "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AkamaiImageServer VelocitudeMP/1.0;IM/1.0"

日志中仅存在200和404状态记录,无其他错误信息。

配置文件

~/nginx.conf

events {
  worker_connections  4096;  ## Default: 1024
}

http {
  server {
    listen 80;
  
    location = /health {
            access_log off;
            add_header 'Content-Type' 'application/json';
            return 200 '{"status":"UP"}';
    }

    location / {
        proxy_pass https://XXXXXXXXXXXX.us-east-1.elb.amazonaws.com;
        proxy_set_header Host $host;
    }
 }
}

~/docker-compose.yml

version: "3"
services:

  nginx:
    container_name: nginx
    image: nginx:latest
    ports:
      - "80:80"
      #- "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf

已尝试排查步骤

  • 确认Docker Compose服务正常运行,日志仅包含200和404状态
  • 验证无其他人员访问或修改服务器/容器
  • 多次重启Docker Compose,每次均可临时解决问题,但1-3天后复发
  • 故障发生时检查top(CPU/内存)和df(磁盘空间),资源使用率极低,磁盘占用30%,EC2实例及Cloudwatch监控无异常
  • 确认后端ALB资源状态正常,问题锁定在反向代理服务

排查建议

  1. 配置Nginx长连接复用
    默认Nginx未配置keepalive参数,长时间运行可能导致连接复用异常。修改nginx.conf的http块:

    upstream backend {
        server XXXXXXXXXXXX.us-east-1.elb.amazonaws.com;
        keepalive 64;
    }
    

    然后将location /中的proxy_pass改为proxy_pass https://backend;,同时添加:

    proxy_http_version 1.1;
    proxy_set_header Connection "";
    

    确保长连接正常复用。

  2. 禁用Nginx缓存与缓冲
    若Nginx默认开启缓存,可能出现资源不匹配或过期问题。在location /块中添加:

    proxy_cache off;
    proxy_no_cache 1;
    proxy_buffering off;
    

    测试是否还会出现404。

  3. 指定稳定版Nginx镜像
    当前使用nginx:latest可能存在未知bug,切换到具体稳定版本(如nginx:1.25.3),避免自动更新到有问题的版本。

  4. 监控容器网络状态
    故障发生时,在EC2实例执行docker stats查看Nginx容器的网络收发情况,用netstat -an | grep ESTABLISHED检查与后端ALB的连接数,确认是否存在异常连接堆积。

  5. 开启Nginx调试日志
    修改nginx.conf的http块添加:

    error_log /var/log/nginx/error.log debug;
    

    重启服务后等待故障出现,查看调试日志中是否有连接失败、DNS解析异常等细节。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:55:08